Compare commits
7 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6877f6642a | ||
|
|
3b4f802a4e | ||
|
|
731fc744d7 | ||
|
|
04705ecbb8 | ||
|
|
aa57a2aaf9 | ||
|
|
48cd49cfd5 | ||
|
|
aa1d0376b4 |
21
LICENSE
Normal file
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2020 Jed Laundry
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
12
PRIVACY.md
Normal file
@@ -0,0 +1,12 @@
|
||||
# Privacy Policy
|
||||
|
||||
TypeClipboard does one thing, and one thing only: type (through a virtual keyboard) the contents of the clipboard.
|
||||
|
||||
It does not:
|
||||
- store clipboard information
|
||||
- process clipboard information
|
||||
- send your data over the internet, especially not to dodgy hackers
|
||||
|
||||
That's it.
|
||||
|
||||
Sorry this isn't 333 pages long...
|
||||
@@ -1,20 +1,76 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio 15
|
||||
VisualStudioVersion = 15.0.28306.52
|
||||
# Visual Studio Version 16
|
||||
VisualStudioVersion = 16.0.30011.22
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TypeClipboard", "TypeClipboard\TypeClipboard.csproj", "{AFF27396-3E91-471E-B46B-2D2DA30FE6DB}"
|
||||
EndProject
|
||||
Project("{C7167F0D-BC9F-4E6E-AFE1-012C56B48DB5}") = "TypeClipboardAppx", "TypeClipboardAppx\TypeClipboardAppx.wapproj", "{D041BCC6-3C9D-4BDC-8443-2BEC9B290D1A}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Debug|ARM = Debug|ARM
|
||||
Debug|ARM64 = Debug|ARM64
|
||||
Debug|x64 = Debug|x64
|
||||
Debug|x86 = Debug|x86
|
||||
Release|Any CPU = Release|Any CPU
|
||||
Release|ARM = Release|ARM
|
||||
Release|ARM64 = Release|ARM64
|
||||
Release|x64 = Release|x64
|
||||
Release|x86 = Release|x86
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{AFF27396-3E91-471E-B46B-2D2DA30FE6DB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{AFF27396-3E91-471E-B46B-2D2DA30FE6DB}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{AFF27396-3E91-471E-B46B-2D2DA30FE6DB}.Debug|ARM.ActiveCfg = Debug|Any CPU
|
||||
{AFF27396-3E91-471E-B46B-2D2DA30FE6DB}.Debug|ARM.Build.0 = Debug|Any CPU
|
||||
{AFF27396-3E91-471E-B46B-2D2DA30FE6DB}.Debug|ARM64.ActiveCfg = Debug|Any CPU
|
||||
{AFF27396-3E91-471E-B46B-2D2DA30FE6DB}.Debug|ARM64.Build.0 = Debug|Any CPU
|
||||
{AFF27396-3E91-471E-B46B-2D2DA30FE6DB}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{AFF27396-3E91-471E-B46B-2D2DA30FE6DB}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{AFF27396-3E91-471E-B46B-2D2DA30FE6DB}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{AFF27396-3E91-471E-B46B-2D2DA30FE6DB}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{AFF27396-3E91-471E-B46B-2D2DA30FE6DB}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{AFF27396-3E91-471E-B46B-2D2DA30FE6DB}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{AFF27396-3E91-471E-B46B-2D2DA30FE6DB}.Release|ARM.ActiveCfg = Release|Any CPU
|
||||
{AFF27396-3E91-471E-B46B-2D2DA30FE6DB}.Release|ARM.Build.0 = Release|Any CPU
|
||||
{AFF27396-3E91-471E-B46B-2D2DA30FE6DB}.Release|ARM64.ActiveCfg = Release|Any CPU
|
||||
{AFF27396-3E91-471E-B46B-2D2DA30FE6DB}.Release|ARM64.Build.0 = Release|Any CPU
|
||||
{AFF27396-3E91-471E-B46B-2D2DA30FE6DB}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{AFF27396-3E91-471E-B46B-2D2DA30FE6DB}.Release|x64.Build.0 = Release|Any CPU
|
||||
{AFF27396-3E91-471E-B46B-2D2DA30FE6DB}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{AFF27396-3E91-471E-B46B-2D2DA30FE6DB}.Release|x86.Build.0 = Release|Any CPU
|
||||
{D041BCC6-3C9D-4BDC-8443-2BEC9B290D1A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{D041BCC6-3C9D-4BDC-8443-2BEC9B290D1A}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{D041BCC6-3C9D-4BDC-8443-2BEC9B290D1A}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
|
||||
{D041BCC6-3C9D-4BDC-8443-2BEC9B290D1A}.Debug|ARM.ActiveCfg = Debug|ARM
|
||||
{D041BCC6-3C9D-4BDC-8443-2BEC9B290D1A}.Debug|ARM.Build.0 = Debug|ARM
|
||||
{D041BCC6-3C9D-4BDC-8443-2BEC9B290D1A}.Debug|ARM.Deploy.0 = Debug|ARM
|
||||
{D041BCC6-3C9D-4BDC-8443-2BEC9B290D1A}.Debug|ARM64.ActiveCfg = Debug|ARM64
|
||||
{D041BCC6-3C9D-4BDC-8443-2BEC9B290D1A}.Debug|ARM64.Build.0 = Debug|ARM64
|
||||
{D041BCC6-3C9D-4BDC-8443-2BEC9B290D1A}.Debug|ARM64.Deploy.0 = Debug|ARM64
|
||||
{D041BCC6-3C9D-4BDC-8443-2BEC9B290D1A}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{D041BCC6-3C9D-4BDC-8443-2BEC9B290D1A}.Debug|x64.Build.0 = Debug|x64
|
||||
{D041BCC6-3C9D-4BDC-8443-2BEC9B290D1A}.Debug|x64.Deploy.0 = Debug|x64
|
||||
{D041BCC6-3C9D-4BDC-8443-2BEC9B290D1A}.Debug|x86.ActiveCfg = Debug|x86
|
||||
{D041BCC6-3C9D-4BDC-8443-2BEC9B290D1A}.Debug|x86.Build.0 = Debug|x86
|
||||
{D041BCC6-3C9D-4BDC-8443-2BEC9B290D1A}.Debug|x86.Deploy.0 = Debug|x86
|
||||
{D041BCC6-3C9D-4BDC-8443-2BEC9B290D1A}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{D041BCC6-3C9D-4BDC-8443-2BEC9B290D1A}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{D041BCC6-3C9D-4BDC-8443-2BEC9B290D1A}.Release|Any CPU.Deploy.0 = Release|Any CPU
|
||||
{D041BCC6-3C9D-4BDC-8443-2BEC9B290D1A}.Release|ARM.ActiveCfg = Release|ARM
|
||||
{D041BCC6-3C9D-4BDC-8443-2BEC9B290D1A}.Release|ARM.Build.0 = Release|ARM
|
||||
{D041BCC6-3C9D-4BDC-8443-2BEC9B290D1A}.Release|ARM.Deploy.0 = Release|ARM
|
||||
{D041BCC6-3C9D-4BDC-8443-2BEC9B290D1A}.Release|ARM64.ActiveCfg = Release|ARM64
|
||||
{D041BCC6-3C9D-4BDC-8443-2BEC9B290D1A}.Release|ARM64.Build.0 = Release|ARM64
|
||||
{D041BCC6-3C9D-4BDC-8443-2BEC9B290D1A}.Release|ARM64.Deploy.0 = Release|ARM64
|
||||
{D041BCC6-3C9D-4BDC-8443-2BEC9B290D1A}.Release|x64.ActiveCfg = Release|x64
|
||||
{D041BCC6-3C9D-4BDC-8443-2BEC9B290D1A}.Release|x64.Build.0 = Release|x64
|
||||
{D041BCC6-3C9D-4BDC-8443-2BEC9B290D1A}.Release|x64.Deploy.0 = Release|x64
|
||||
{D041BCC6-3C9D-4BDC-8443-2BEC9B290D1A}.Release|x86.ActiveCfg = Release|x86
|
||||
{D041BCC6-3C9D-4BDC-8443-2BEC9B290D1A}.Release|x86.Build.0 = Release|x86
|
||||
{D041BCC6-3C9D-4BDC-8443-2BEC9B290D1A}.Release|x86.Deploy.0 = Release|x86
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
|
||||
@@ -1,6 +1,18 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<configuration>
|
||||
<configSections>
|
||||
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
|
||||
<section name="TypeClipboard.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
|
||||
</sectionGroup>
|
||||
</configSections>
|
||||
<startup>
|
||||
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1"/>
|
||||
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2"/>
|
||||
</startup>
|
||||
<userSettings>
|
||||
<TypeClipboard.Properties.Settings>
|
||||
<setting name="enableHotkey" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
</TypeClipboard.Properties.Settings>
|
||||
</userSettings>
|
||||
</configuration>
|
||||
|
||||
79
TypeClipboard/ClipboardNotification.cs
Normal file
@@ -0,0 +1,79 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace TypeClipboard
|
||||
{
|
||||
//
|
||||
// https://gist.github.com/glombard/7986317
|
||||
// from: http://stackoverflow.com/questions/2226920/how-to-monitor-clipboard-content-changes-in-c
|
||||
//
|
||||
|
||||
/// <summary>
|
||||
/// Provides notifications when the contents of the clipboard is updated.
|
||||
/// </summary>
|
||||
public sealed class ClipboardNotification
|
||||
{
|
||||
/// <summary>
|
||||
/// Occurs when the contents of the clipboard is updated.
|
||||
/// </summary>
|
||||
public static event EventHandler ClipboardUpdate;
|
||||
|
||||
private static NotificationForm _form = new NotificationForm();
|
||||
|
||||
/// <summary>
|
||||
/// Raises the <see cref="ClipboardUpdate"/> event.
|
||||
/// </summary>
|
||||
/// <param name="e">Event arguments for the event.</param>
|
||||
private static void OnClipboardUpdate(EventArgs e)
|
||||
{
|
||||
var handler = ClipboardUpdate;
|
||||
if (handler != null)
|
||||
{
|
||||
handler(null, e);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Hidden form to recieve the WM_CLIPBOARDUPDATE message.
|
||||
/// </summary>
|
||||
private class NotificationForm : Form
|
||||
{
|
||||
public NotificationForm()
|
||||
{
|
||||
NativeMethods.SetParent(Handle, NativeMethods.HWND_MESSAGE);
|
||||
NativeMethods.AddClipboardFormatListener(Handle);
|
||||
}
|
||||
|
||||
protected override void WndProc(ref Message m)
|
||||
{
|
||||
if (m.Msg == NativeMethods.WM_CLIPBOARDUPDATE)
|
||||
{
|
||||
OnClipboardUpdate(null);
|
||||
}
|
||||
base.WndProc(ref m);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal static class NativeMethods
|
||||
{
|
||||
// See http://msdn.microsoft.com/en-us/library/ms649021%28v=vs.85%29.aspx
|
||||
public const int WM_CLIPBOARDUPDATE = 0x031D;
|
||||
public static IntPtr HWND_MESSAGE = new IntPtr(-3);
|
||||
|
||||
// See http://msdn.microsoft.com/en-us/library/ms632599%28VS.85%29.aspx#message_only
|
||||
[DllImport("user32.dll", SetLastError = true)]
|
||||
[return: MarshalAs(UnmanagedType.Bool)]
|
||||
public static extern bool AddClipboardFormatListener(IntPtr hwnd);
|
||||
|
||||
// See http://msdn.microsoft.com/en-us/library/ms633541%28v=vs.85%29.aspx
|
||||
// See http://msdn.microsoft.com/en-us/library/ms649033%28VS.85%29.aspx
|
||||
[DllImport("user32.dll", SetLastError = true)]
|
||||
public static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
|
||||
}
|
||||
}
|
||||
25
TypeClipboard/Form1.Designer.cs
generated
@@ -30,30 +30,44 @@
|
||||
{
|
||||
this.textBox1 = new System.Windows.Forms.TextBox();
|
||||
this.button1 = new System.Windows.Forms.Button();
|
||||
this.chkHotkey = new System.Windows.Forms.CheckBox();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// textBox1
|
||||
//
|
||||
this.textBox1.Font = new System.Drawing.Font("Consolas", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.textBox1.Location = new System.Drawing.Point(12, 12);
|
||||
this.textBox1.Name = "textBox1";
|
||||
this.textBox1.ReadOnly = true;
|
||||
this.textBox1.Size = new System.Drawing.Size(184, 20);
|
||||
this.textBox1.Size = new System.Drawing.Size(201, 22);
|
||||
this.textBox1.TabIndex = 0;
|
||||
//
|
||||
// button1
|
||||
//
|
||||
this.button1.Location = new System.Drawing.Point(202, 10);
|
||||
this.button1.Location = new System.Drawing.Point(219, 12);
|
||||
this.button1.Name = "button1";
|
||||
this.button1.Size = new System.Drawing.Size(103, 23);
|
||||
this.button1.Size = new System.Drawing.Size(103, 22);
|
||||
this.button1.TabIndex = 1;
|
||||
this.button1.Text = "Type (2s delay)";
|
||||
this.button1.UseVisualStyleBackColor = true;
|
||||
this.button1.Click += new System.EventHandler(this.button1_Click);
|
||||
//
|
||||
// chkHotkey
|
||||
//
|
||||
this.chkHotkey.AutoSize = true;
|
||||
this.chkHotkey.Location = new System.Drawing.Point(12, 41);
|
||||
this.chkHotkey.Name = "chkHotkey";
|
||||
this.chkHotkey.Size = new System.Drawing.Size(109, 17);
|
||||
this.chkHotkey.TabIndex = 2;
|
||||
this.chkHotkey.Text = "Enable F8 hotkey";
|
||||
this.chkHotkey.UseVisualStyleBackColor = true;
|
||||
this.chkHotkey.CheckedChanged += new System.EventHandler(this.chkHotkey_CheckedChanged);
|
||||
//
|
||||
// Form1
|
||||
//
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
|
||||
this.ClientSize = new System.Drawing.Size(317, 44);
|
||||
this.ClientSize = new System.Drawing.Size(334, 66);
|
||||
this.Controls.Add(this.chkHotkey);
|
||||
this.Controls.Add(this.button1);
|
||||
this.Controls.Add(this.textBox1);
|
||||
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
|
||||
@@ -65,6 +79,8 @@
|
||||
this.Text = "Type Clipboard";
|
||||
this.TopMost = true;
|
||||
this.Activated += new System.EventHandler(this.Form1_Activated);
|
||||
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing);
|
||||
this.Load += new System.EventHandler(this.Form1_Load);
|
||||
this.Enter += new System.EventHandler(this.Form1_Enter);
|
||||
this.MouseEnter += new System.EventHandler(this.Form1_MouseEnter);
|
||||
this.ResumeLayout(false);
|
||||
@@ -76,6 +92,7 @@
|
||||
|
||||
private System.Windows.Forms.TextBox textBox1;
|
||||
private System.Windows.Forms.Button button1;
|
||||
private System.Windows.Forms.CheckBox chkHotkey;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -9,6 +9,9 @@ namespace TypeClipboard
|
||||
{
|
||||
const int WS_EX_NOACTIVATE = 0x08000000;
|
||||
|
||||
private LowLevelKeyboardListener _listener;
|
||||
private Typer _tc;
|
||||
|
||||
public Form1()
|
||||
{
|
||||
InitializeComponent();
|
||||
@@ -29,70 +32,38 @@ namespace TypeClipboard
|
||||
}
|
||||
}
|
||||
|
||||
public void TypeClipboard()
|
||||
{
|
||||
if (Clipboard.ContainsText(TextDataFormat.UnicodeText))
|
||||
{
|
||||
String clipboard = Clipboard.GetText(TextDataFormat.UnicodeText);
|
||||
Thread.Sleep(2000);
|
||||
foreach (Char c in clipboard.ToCharArray())
|
||||
{
|
||||
// Some characters have special meaning
|
||||
// https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/sendkeys-statement
|
||||
switch (c)
|
||||
{
|
||||
case '\n':
|
||||
return;
|
||||
case '\r':
|
||||
return;
|
||||
case '{':
|
||||
SendKeys.Send("{{}");
|
||||
break;
|
||||
case '}':
|
||||
SendKeys.Send("{}}");
|
||||
break;
|
||||
case '+':
|
||||
SendKeys.Send("{+}");
|
||||
break;
|
||||
case '^':
|
||||
SendKeys.Send("{^}");
|
||||
break;
|
||||
case '%':
|
||||
SendKeys.Send("{%}");
|
||||
break;
|
||||
case '~':
|
||||
SendKeys.Send("{~}");
|
||||
break;
|
||||
case '(':
|
||||
SendKeys.Send("{(}");
|
||||
break;
|
||||
case ')':
|
||||
SendKeys.Send("{)}");
|
||||
break;
|
||||
default:
|
||||
SendKeys.Send(c.ToString());
|
||||
break;
|
||||
}
|
||||
Thread.Sleep(10);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void button1_Click(object sender, EventArgs e)
|
||||
{
|
||||
TypeClipboard();
|
||||
_tc.TypeClipboard(2000);
|
||||
}
|
||||
|
||||
public void UpdateTextbox()
|
||||
public void UpdateTextbox(EventArgs e = null)
|
||||
{
|
||||
if (Clipboard.ContainsText(TextDataFormat.UnicodeText))
|
||||
{
|
||||
String clipboard = Clipboard.GetText(TextDataFormat.UnicodeText);
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.Append(clipboard.Substring(0, Math.Min(3, clipboard.Length)));
|
||||
sb.Append(" ... ");
|
||||
sb.Append(clipboard.Substring(clipboard.Length - Math.Min(clipboard.Length, 3)));
|
||||
sb.Append(" (" + clipboard.Length.ToString() + " characters)");
|
||||
|
||||
if (clipboard.Length <= 4)
|
||||
{
|
||||
sb.Append(" (" + clipboard.Length.ToString() + " characters)");
|
||||
}
|
||||
else if (clipboard.Length <= 9)
|
||||
{
|
||||
sb.Append(clipboard.Substring(0, 1));
|
||||
sb.Append("...");
|
||||
sb.Append(clipboard.Substring(clipboard.Length - 1));
|
||||
sb.Append(" (" + clipboard.Length.ToString() + " characters)");
|
||||
}
|
||||
else
|
||||
{
|
||||
sb.Append(clipboard.Substring(0, 3));
|
||||
sb.Append("...");
|
||||
sb.Append(clipboard.Substring(clipboard.Length - 3));
|
||||
sb.Append(" (" + clipboard.Length.ToString() + " characters)");
|
||||
}
|
||||
|
||||
|
||||
textBox1.Text = sb.ToString();
|
||||
}
|
||||
else
|
||||
@@ -115,5 +86,40 @@ namespace TypeClipboard
|
||||
{
|
||||
UpdateTextbox();
|
||||
}
|
||||
|
||||
private void Form1_Load(object sender, EventArgs e)
|
||||
{
|
||||
_listener = new LowLevelKeyboardListener();
|
||||
// Changing the Checked property also hooks the listener
|
||||
chkHotkey.Checked = Properties.Settings.Default.enableHotkey;
|
||||
|
||||
_tc = new Typer();
|
||||
|
||||
ClipboardNotification.ClipboardUpdate += delegate (object cb_sender, EventArgs cb_e) {
|
||||
UpdateTextbox();
|
||||
};
|
||||
UpdateTextbox();
|
||||
}
|
||||
|
||||
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
|
||||
{
|
||||
_listener.UnHookKeyboard();
|
||||
}
|
||||
|
||||
private void chkHotkey_CheckedChanged(object sender, EventArgs e)
|
||||
{
|
||||
Properties.Settings.Default.enableHotkey = chkHotkey.Checked;
|
||||
|
||||
if (Properties.Settings.Default.enableHotkey)
|
||||
{
|
||||
_listener.HookKeyboard();
|
||||
}
|
||||
else
|
||||
{
|
||||
_listener.UnHookKeyboard();
|
||||
}
|
||||
|
||||
Properties.Settings.Default.Save();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
118
TypeClipboard/LowLevelKeyboardListener.cs
Normal file
@@ -0,0 +1,118 @@
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Windows.Input;
|
||||
|
||||
|
||||
/*
|
||||
Portions Copyright (c) 2019 dylansweb.com, http://www.dylansweb.com/2014/10/low-level-global-keyboard-hook-sink-in-c-net/
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
*/
|
||||
|
||||
namespace TypeClipboard
|
||||
{
|
||||
public class LowLevelKeyboardListener
|
||||
{
|
||||
private const int WH_KEYBOARD_LL = 13;
|
||||
private const int WM_KEYDOWN = 0x0100;
|
||||
private const int WM_SYSKEYDOWN = 0x0104;
|
||||
|
||||
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
|
||||
private static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);
|
||||
|
||||
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
|
||||
[return: MarshalAs(UnmanagedType.Bool)]
|
||||
private static extern bool UnhookWindowsHookEx(IntPtr hhk);
|
||||
|
||||
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
|
||||
private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);
|
||||
|
||||
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
|
||||
private static extern IntPtr GetModuleHandle(string lpModuleName);
|
||||
|
||||
public delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);
|
||||
|
||||
public event EventHandler<KeyPressedArgs> OnKeyPressed;
|
||||
|
||||
private LowLevelKeyboardProc _proc;
|
||||
private IntPtr _hookID = IntPtr.Zero;
|
||||
private Typer _tc = new Typer();
|
||||
|
||||
public LowLevelKeyboardListener()
|
||||
{
|
||||
_proc = HookCallback;
|
||||
}
|
||||
|
||||
public void HookKeyboard()
|
||||
{
|
||||
_hookID = SetHook(_proc);
|
||||
}
|
||||
|
||||
public void UnHookKeyboard()
|
||||
{
|
||||
if(_hookID != IntPtr.Zero)
|
||||
{
|
||||
UnhookWindowsHookEx(_hookID);
|
||||
_hookID = IntPtr.Zero;
|
||||
}
|
||||
}
|
||||
|
||||
private IntPtr SetHook(LowLevelKeyboardProc proc)
|
||||
{
|
||||
using (Process curProcess = Process.GetCurrentProcess())
|
||||
using (ProcessModule curModule = curProcess.MainModule)
|
||||
{
|
||||
return SetWindowsHookEx(WH_KEYBOARD_LL, proc, GetModuleHandle(curModule.ModuleName), 0);
|
||||
}
|
||||
}
|
||||
|
||||
private IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
|
||||
{
|
||||
if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN || wParam == (IntPtr)WM_SYSKEYDOWN)
|
||||
{
|
||||
int vkCode = Marshal.ReadInt32(lParam);
|
||||
Key keyPressed = KeyInterop.KeyFromVirtualKey(vkCode);
|
||||
|
||||
// Explicitly putting this here because we need to return before CallNextHookEx
|
||||
if (keyPressed == Key.F8)
|
||||
{
|
||||
// Call Type Clipboard
|
||||
_tc.TypeClipboard(100);
|
||||
|
||||
// Prevent key bring pressed further into the app
|
||||
return new IntPtr(1);
|
||||
}
|
||||
|
||||
if (OnKeyPressed != null) { OnKeyPressed(this, new KeyPressedArgs(keyPressed)); }
|
||||
}
|
||||
|
||||
return CallNextHookEx(_hookID, nCode, wParam, lParam);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public class KeyPressedArgs : EventArgs
|
||||
{
|
||||
public Key KeyPressed { get; private set; }
|
||||
|
||||
public KeyPressedArgs(Key key)
|
||||
{
|
||||
KeyPressed = key;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -10,7 +10,7 @@ using System.Runtime.InteropServices;
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("Jed Laundry")]
|
||||
[assembly: AssemblyProduct("Type Clipboard")]
|
||||
[assembly: AssemblyCopyright("Copyright © Jed Laundry, 2019")]
|
||||
[assembly: AssemblyCopyright("Copyright © Jed Laundry, 2020")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
|
||||
// You can specify all the values or you can default the Build and Revision Numbers
|
||||
// by using the '*' as shown below:
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
[assembly: AssemblyVersion("1.0.0.0")]
|
||||
[assembly: AssemblyFileVersion("1.0.0.0")]
|
||||
[assembly: AssemblyVersion("1.3.6.0")]
|
||||
[assembly: AssemblyFileVersion("1.3.6.0")]
|
||||
|
||||
2
TypeClipboard/Properties/Resources.Designer.cs
generated
@@ -19,7 +19,7 @@ namespace TypeClipboard.Properties {
|
||||
// class via a tool like ResGen or Visual Studio.
|
||||
// To add or remove a member, edit your .ResX file then rerun ResGen
|
||||
// with the /str option, or rebuild your VS project.
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")]
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
internal class Resources {
|
||||
|
||||
14
TypeClipboard/Properties/Settings.Designer.cs
generated
@@ -12,7 +12,7 @@ namespace TypeClipboard.Properties {
|
||||
|
||||
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.9.0.0")]
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.5.0.0")]
|
||||
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
|
||||
|
||||
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
|
||||
@@ -22,5 +22,17 @@ namespace TypeClipboard.Properties {
|
||||
return defaultInstance;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("False")]
|
||||
public bool enableHotkey {
|
||||
get {
|
||||
return ((bool)(this["enableHotkey"]));
|
||||
}
|
||||
set {
|
||||
this["enableHotkey"] = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
|
||||
<Profiles>
|
||||
<Profile Name="(Default)" />
|
||||
</Profiles>
|
||||
<Settings />
|
||||
</SettingsFile>
|
||||
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="TypeClipboard.Properties" GeneratedClassName="Settings">
|
||||
<Profiles />
|
||||
<Settings>
|
||||
<Setting Name="enableHotkey" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
</Settings>
|
||||
</SettingsFile>
|
||||
@@ -8,11 +8,26 @@
|
||||
<OutputType>WinExe</OutputType>
|
||||
<RootNamespace>TypeClipboard</RootNamespace>
|
||||
<AssemblyName>TypeClipboard</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
|
||||
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
|
||||
<Deterministic>true</Deterministic>
|
||||
<TargetFrameworkProfile />
|
||||
<IsWebBootstrapper>false</IsWebBootstrapper>
|
||||
<PublishUrl>publish\</PublishUrl>
|
||||
<Install>true</Install>
|
||||
<InstallFrom>Disk</InstallFrom>
|
||||
<UpdateEnabled>false</UpdateEnabled>
|
||||
<UpdateMode>Foreground</UpdateMode>
|
||||
<UpdateInterval>7</UpdateInterval>
|
||||
<UpdateIntervalUnits>Days</UpdateIntervalUnits>
|
||||
<UpdatePeriodically>false</UpdatePeriodically>
|
||||
<UpdateRequired>false</UpdateRequired>
|
||||
<MapFileExtensions>true</MapFileExtensions>
|
||||
<ApplicationRevision>0</ApplicationRevision>
|
||||
<ApplicationVersion>1.1.0.%2a</ApplicationVersion>
|
||||
<UseApplicationTrust>false</UseApplicationTrust>
|
||||
<BootstrapperEnabled>true</BootstrapperEnabled>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
@@ -30,11 +45,15 @@
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<DefineConstants>
|
||||
</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<Prefer32Bit>false</Prefer32Bit>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<ApplicationIcon>typeclipboard.ico</ApplicationIcon>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Core" />
|
||||
@@ -47,16 +66,20 @@
|
||||
<Reference Include="System.Net.Http" />
|
||||
<Reference Include="System.Windows.Forms" />
|
||||
<Reference Include="System.Xml" />
|
||||
<Reference Include="WindowsBase" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="ClipboardNotification.cs" />
|
||||
<Compile Include="Form1.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Form1.Designer.cs">
|
||||
<DependentUpon>Form1.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="LowLevelKeyboardListener.cs" />
|
||||
<Compile Include="Program.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="Typer.cs" />
|
||||
<EmbeddedResource Include="Form1.resx">
|
||||
<DependentUpon>Form1.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
@@ -83,5 +106,20 @@
|
||||
<ItemGroup>
|
||||
<None Include="App.config" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="typeclipboard.ico" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<BootstrapperPackage Include=".NETFramework,Version=v4.6.1">
|
||||
<Visible>False</Visible>
|
||||
<ProductName>Microsoft .NET Framework 4.6.1 %28x86 and x64%29</ProductName>
|
||||
<Install>true</Install>
|
||||
</BootstrapperPackage>
|
||||
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
|
||||
<Visible>False</Visible>
|
||||
<ProductName>.NET Framework 3.5 SP1</ProductName>
|
||||
<Install>false</Install>
|
||||
</BootstrapperPackage>
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
</Project>
|
||||
64
TypeClipboard/Typer.cs
Normal file
@@ -0,0 +1,64 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace TypeClipboard
|
||||
{
|
||||
class Typer
|
||||
{
|
||||
private const int INTERKEY_DELAY = 20;
|
||||
|
||||
public void TypeClipboard(int delay = 2000)
|
||||
{
|
||||
if (Clipboard.ContainsText(TextDataFormat.UnicodeText))
|
||||
{
|
||||
String clipboard = Clipboard.GetText(TextDataFormat.UnicodeText);
|
||||
Thread.Sleep(delay);
|
||||
foreach (Char c in clipboard.ToCharArray())
|
||||
{
|
||||
// Some characters have special meaning
|
||||
// https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/sendkeys-statement
|
||||
switch (c)
|
||||
{
|
||||
case '\n':
|
||||
return;
|
||||
case '\r':
|
||||
return;
|
||||
case '{':
|
||||
SendKeys.Send("{{}");
|
||||
break;
|
||||
case '}':
|
||||
SendKeys.Send("{}}");
|
||||
break;
|
||||
case '+':
|
||||
SendKeys.Send("{+}");
|
||||
break;
|
||||
case '^':
|
||||
SendKeys.Send("{^}");
|
||||
break;
|
||||
case '%':
|
||||
SendKeys.Send("{%}");
|
||||
break;
|
||||
case '~':
|
||||
SendKeys.Send("{~}");
|
||||
break;
|
||||
case '(':
|
||||
SendKeys.Send("{(}");
|
||||
break;
|
||||
case ')':
|
||||
SendKeys.Send("{)}");
|
||||
break;
|
||||
default:
|
||||
SendKeys.Send(c.ToString());
|
||||
break;
|
||||
}
|
||||
Thread.Sleep(INTERKEY_DELAY);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
BIN
TypeClipboard/typeclipboard.ico
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
TypeClipboard/typeclipboard.png
Normal file
|
After Width: | Height: | Size: 7.2 KiB |
99
TypeClipboard/typeclipboard.svg
Normal file
@@ -0,0 +1,99 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="512"
|
||||
height="512"
|
||||
version="1.1"
|
||||
id="svg3739"
|
||||
sodipodi:docname="typeclipboard.svg"
|
||||
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
|
||||
inkscape:export-filename="C:\Users\jlaundry\Downloads\typeclipboard.png"
|
||||
inkscape:export-xdpi="96"
|
||||
inkscape:export-ydpi="96">
|
||||
<metadata
|
||||
id="metadata3745">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs3743" />
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1017"
|
||||
id="namedview3741"
|
||||
showgrid="false"
|
||||
showguides="false"
|
||||
inkscape:zoom="1.65625"
|
||||
inkscape:cx="157.88679"
|
||||
inkscape:cy="297.0566"
|
||||
inkscape:window-x="-8"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg3739" />
|
||||
<rect
|
||||
style="fill:none;stroke:#ffffff;stroke-width:20;stroke-miterlimit:4;stroke-dasharray:none"
|
||||
x="36"
|
||||
y="37"
|
||||
width="439.99997"
|
||||
height="440"
|
||||
id="svg_1"
|
||||
rx="50.671612"
|
||||
ry="50.671612" />
|
||||
<rect
|
||||
style="fill:#ffffff;stroke:#ffffff;stroke-width:4.99999952;stroke-miterlimit:4;stroke-dasharray:none"
|
||||
x="168.5"
|
||||
y="14.5"
|
||||
width="175"
|
||||
height="75"
|
||||
id="svg_3"
|
||||
rx="4.2934704"
|
||||
ry="4.2934704" />
|
||||
<rect
|
||||
style="fill:#ffffff;stroke:#ffffff;stroke-width:5"
|
||||
x="268.5"
|
||||
y="130.5"
|
||||
width="145"
|
||||
height="145"
|
||||
id="svg_7"
|
||||
rx="10"
|
||||
ry="10" />
|
||||
<rect
|
||||
style="fill:#ffffff;stroke:#ffffff;stroke-width:5"
|
||||
x="178.5"
|
||||
y="300.5"
|
||||
width="145"
|
||||
height="145"
|
||||
id="svg_8"
|
||||
rx="10"
|
||||
ry="10.000001" />
|
||||
<rect
|
||||
style="fill:#ffffff;stroke:#ffffff;stroke-width:5"
|
||||
x="98.5"
|
||||
y="130.5"
|
||||
width="145"
|
||||
height="145"
|
||||
id="svg_9"
|
||||
rx="10"
|
||||
ry="10" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.6 KiB |
BIN
TypeClipboardAppx/Images/LockScreenLogo.scale-200.png
Normal file
|
After Width: | Height: | Size: 780 B |
BIN
TypeClipboardAppx/Images/SplashScreen.scale-200.png
Normal file
|
After Width: | Height: | Size: 7.5 KiB |
BIN
TypeClipboardAppx/Images/Square150x150Logo.scale-200.png
Normal file
|
After Width: | Height: | Size: 4.1 KiB |
BIN
TypeClipboardAppx/Images/Square44x44Logo.scale-200.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
|
After Width: | Height: | Size: 479 B |
BIN
TypeClipboardAppx/Images/StoreLogo.png
Normal file
|
After Width: | Height: | Size: 838 B |
BIN
TypeClipboardAppx/Images/Wide310x150Logo.scale-200.png
Normal file
|
After Width: | Height: | Size: 3.1 KiB |
53
TypeClipboardAppx/Package.appxmanifest
Normal file
@@ -0,0 +1,53 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<Package
|
||||
xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
|
||||
xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
|
||||
xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
|
||||
IgnorableNamespaces="uap rescap">
|
||||
|
||||
<Identity
|
||||
Name="3373JedLaundry.TypeClipboard"
|
||||
Publisher="CN=CE320BA0-58BC-4F47-AF5B-94DB661147CC"
|
||||
Version="1.3.5.0" />
|
||||
|
||||
<Properties>
|
||||
<DisplayName>TypeClipboard</DisplayName>
|
||||
<PublisherDisplayName>Jed Laundry</PublisherDisplayName>
|
||||
<Logo>Images\StoreLogo.png</Logo>
|
||||
</Properties>
|
||||
|
||||
<Dependencies>
|
||||
<TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.0.0" MaxVersionTested="10.0.0.0" />
|
||||
<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.14393.0" MaxVersionTested="10.0.14393.0" />
|
||||
</Dependencies>
|
||||
|
||||
<Resources>
|
||||
<Resource Language="x-generate"/>
|
||||
</Resources>
|
||||
|
||||
<Applications>
|
||||
<Application Id="App"
|
||||
Executable="$targetnametoken$.exe"
|
||||
EntryPoint="$targetentrypoint$">
|
||||
<uap:VisualElements
|
||||
DisplayName="TypeClipboard"
|
||||
Description="TypeClipboard"
|
||||
BackgroundColor="transparent"
|
||||
Square150x150Logo="Images\Square150x150Logo.png"
|
||||
Square44x44Logo="Images\Square44x44Logo.png">
|
||||
<uap:DefaultTile Wide310x150Logo="Images\Wide310x150Logo.png" ShortName="TypeClipboard">
|
||||
<uap:ShowNameOnTiles>
|
||||
<uap:ShowOn Tile="square150x150Logo"/>
|
||||
<uap:ShowOn Tile="wide310x150Logo"/>
|
||||
</uap:ShowNameOnTiles>
|
||||
</uap:DefaultTile >
|
||||
<uap:SplashScreen Image="Images\SplashScreen.png" />
|
||||
</uap:VisualElements>
|
||||
</Application>
|
||||
</Applications>
|
||||
|
||||
<Capabilities>
|
||||
<rescap:Capability Name="runFullTrust" />
|
||||
</Capabilities>
|
||||
</Package>
|
||||
118
TypeClipboardAppx/TypeClipboardAppx.wapproj
Normal file
@@ -0,0 +1,118 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="15.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup Condition="'$(VisualStudioVersion)' == '' or '$(VisualStudioVersion)' < '15.0'">
|
||||
<VisualStudioVersion>15.0</VisualStudioVersion>
|
||||
</PropertyGroup>
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug|x86">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>x86</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|x86">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>x86</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Debug|x64">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|x64">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Debug|ARM">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>ARM</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|ARM">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>ARM</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Debug|ARM64">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>ARM64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|ARM64">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>ARM64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Debug|AnyCPU">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>AnyCPU</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|AnyCPU">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>AnyCPU</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup>
|
||||
<WapProjPath Condition="'$(WapProjPath)'==''">$(MSBuildExtensionsPath)\Microsoft\DesktopBridge\</WapProjPath>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(WapProjPath)\Microsoft.DesktopBridge.props" />
|
||||
<PropertyGroup>
|
||||
<ProjectGuid>d041bcc6-3c9d-4bdc-8443-2bec9b290d1a</ProjectGuid>
|
||||
<TargetPlatformVersion>10.0.18362.0</TargetPlatformVersion>
|
||||
<TargetPlatformMinVersion>10.0.17763.0</TargetPlatformMinVersion>
|
||||
<DefaultLanguage>en-US</DefaultLanguage>
|
||||
<AppxPackageSigningEnabled>True</AppxPackageSigningEnabled>
|
||||
<EntryPointProjectUniqueName>..\TypeClipboard\TypeClipboard.csproj</EntryPointProjectUniqueName>
|
||||
<GenerateAppInstallerFile>False</GenerateAppInstallerFile>
|
||||
<AppxPackageSigningTimestampDigestAlgorithm>SHA256</AppxPackageSigningTimestampDigestAlgorithm>
|
||||
<AppxAutoIncrementPackageRevision>False</AppxAutoIncrementPackageRevision>
|
||||
<GenerateTestArtifacts>False</GenerateTestArtifacts>
|
||||
<AppxBundlePlatforms>neutral</AppxBundlePlatforms>
|
||||
<AppInstallerUri>C:\temp</AppInstallerUri>
|
||||
<HoursBetweenUpdateChecks>0</HoursBetweenUpdateChecks>
|
||||
<PackageCertificateThumbprint>F1AC865F3B57360B33C17D9B7ECE4A4BFD2EC9CC</PackageCertificateThumbprint>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<AppxBundle>Always</AppxBundle>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<AppxBundle>Always</AppxBundle>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
|
||||
<AppxBundle>Always</AppxBundle>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
|
||||
<AppxBundle>Always</AppxBundle>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x86'">
|
||||
<AppxBundle>Always</AppxBundle>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
|
||||
<AppxBundle>Always</AppxBundle>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
|
||||
<AppxBundle>Always</AppxBundle>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">
|
||||
<AppxBundle>Always</AppxBundle>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||
<AppxBundle>Always</AppxBundle>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x86'">
|
||||
<AppxBundle>Always</AppxBundle>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<AppxManifest Include="Package.appxmanifest">
|
||||
<SubType>Designer</SubType>
|
||||
</AppxManifest>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="Images\SplashScreen.scale-200.png" />
|
||||
<Content Include="Images\LockScreenLogo.scale-200.png" />
|
||||
<Content Include="Images\Square150x150Logo.scale-200.png" />
|
||||
<Content Include="Images\Square44x44Logo.scale-200.png" />
|
||||
<Content Include="Images\Square44x44Logo.targetsize-24_altform-unplated.png" />
|
||||
<Content Include="Images\StoreLogo.png" />
|
||||
<Content Include="Images\Wide310x150Logo.scale-200.png" />
|
||||
<None Include="Package.StoreAssociation.xml" />
|
||||
<None Include="TypeClipboardAppx_TemporaryKey.pfx" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\TypeClipboard\TypeClipboard.csproj" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(WapProjPath)\Microsoft.DesktopBridge.targets" />
|
||||
</Project>
|
||||