diff --git a/src/App.config b/src/App.config new file mode 100755 index 0000000..5754728 --- /dev/null +++ b/src/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/ControlCenter.csproj b/src/ControlCenter.csproj new file mode 100755 index 0000000..6e02fd1 --- /dev/null +++ b/src/ControlCenter.csproj @@ -0,0 +1,93 @@ + + + + + Debug + AnyCPU + {1309CB00-06EB-4962-9B20-ADF929B654D7} + WinExe + ControlCenter + ControlCenter + v4.7.2 + 512 + true + true + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + Form + + + Form1.cs + + + Form + + + Form2.cs + + + + + + Form1.cs + + + Form2.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + + + \ No newline at end of file diff --git a/src/ControlCenter.sln b/src/ControlCenter.sln new file mode 100755 index 0000000..b109ff0 --- /dev/null +++ b/src/ControlCenter.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29519.87 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ControlCenter", "ControlCenter.csproj", "{1309CB00-06EB-4962-9B20-ADF929B654D7}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {1309CB00-06EB-4962-9B20-ADF929B654D7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1309CB00-06EB-4962-9B20-ADF929B654D7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1309CB00-06EB-4962-9B20-ADF929B654D7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1309CB00-06EB-4962-9B20-ADF929B654D7}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {E3092B67-350B-48AF-B200-0C20636026AC} + EndGlobalSection +EndGlobal diff --git a/src/Form1.Designer.cs b/src/Form1.Designer.cs new file mode 100755 index 0000000..c4c01a9 --- /dev/null +++ b/src/Form1.Designer.cs @@ -0,0 +1,190 @@ +namespace ControlCenter +{ + partial class Form1 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.textBox1 = new System.Windows.Forms.TextBox(); + this.button1 = new System.Windows.Forms.Button(); + this.label1 = new System.Windows.Forms.Label(); + this.textBox2 = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.textBox3 = new System.Windows.Forms.TextBox(); + this.button2 = new System.Windows.Forms.Button(); + this.label3 = new System.Windows.Forms.Label(); + this.label4 = new System.Windows.Forms.Label(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + this.SuspendLayout(); + // + // pictureBox1 + // + this.pictureBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.pictureBox1.BackColor = System.Drawing.SystemColors.ActiveCaption; + this.pictureBox1.Location = new System.Drawing.Point(0, 150); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(1226, 618); + this.pictureBox1.TabIndex = 0; + this.pictureBox1.TabStop = false; + // + // textBox1 + // + this.textBox1.Anchor = System.Windows.Forms.AnchorStyles.Top; + this.textBox1.Font = new System.Drawing.Font("Microsoft Sans Serif", 20.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.textBox1.Location = new System.Drawing.Point(521, 85); + this.textBox1.Name = "textBox1"; + this.textBox1.Size = new System.Drawing.Size(162, 38); + this.textBox1.TabIndex = 1; + this.textBox1.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + // + // button1 + // + this.button1.Anchor = System.Windows.Forms.AnchorStyles.Top; + this.button1.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.button1.Location = new System.Drawing.Point(689, 78); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(91, 52); + this.button1.TabIndex = 2; + this.button1.Text = "Send"; + this.button1.UseVisualStyleBackColor = true; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // label1 + // + this.label1.Anchor = System.Windows.Forms.AnchorStyles.Top; + this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label1.Location = new System.Drawing.Point(482, 9); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(247, 66); + this.label1.TabIndex = 3; + this.label1.Text = "Command Center"; + this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // textBox2 + // + this.textBox2.Anchor = System.Windows.Forms.AnchorStyles.Top; + this.textBox2.Location = new System.Drawing.Point(901, 66); + this.textBox2.Multiline = true; + this.textBox2.Name = "textBox2"; + this.textBox2.Size = new System.Drawing.Size(312, 78); + this.textBox2.TabIndex = 4; + this.textBox2.Text = "Make Input Output console here"; + // + // label2 + // + this.label2.Anchor = System.Windows.Forms.AnchorStyles.Top; + this.label2.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label2.Location = new System.Drawing.Point(415, 80); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(100, 43); + this.label2.TabIndex = 5; + this.label2.Text = "Enter Command"; + this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // textBox3 + // + this.textBox3.Anchor = System.Windows.Forms.AnchorStyles.Top; + this.textBox3.Location = new System.Drawing.Point(1032, 14); + this.textBox3.Name = "textBox3"; + this.textBox3.Size = new System.Drawing.Size(100, 20); + this.textBox3.TabIndex = 6; + // + // button2 + // + this.button2.Anchor = System.Windows.Forms.AnchorStyles.Top; + this.button2.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.button2.Location = new System.Drawing.Point(1138, 12); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(75, 23); + this.button2.TabIndex = 7; + this.button2.Text = "Connect"; + this.button2.UseVisualStyleBackColor = true; + this.button2.Click += new System.EventHandler(this.button2_Click); + // + // label3 + // + this.label3.Anchor = System.Windows.Forms.AnchorStyles.Top; + this.label3.Font = new System.Drawing.Font("Microsoft Sans Serif", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label3.Location = new System.Drawing.Point(877, 9); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(149, 32); + this.label3.TabIndex = 8; + this.label3.Text = "IPAddress:Port"; + this.label3.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // label4 + // + this.label4.Anchor = System.Windows.Forms.AnchorStyles.Top; + this.label4.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label4.Location = new System.Drawing.Point(1006, 38); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(148, 25); + this.label4.TabIndex = 9; + this.label4.Text = "Not Connected"; + this.label4.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(1225, 766); + this.Controls.Add(this.label4); + this.Controls.Add(this.label3); + this.Controls.Add(this.button2); + this.Controls.Add(this.textBox3); + this.Controls.Add(this.label2); + this.Controls.Add(this.textBox2); + this.Controls.Add(this.label1); + this.Controls.Add(this.button1); + this.Controls.Add(this.textBox1); + this.Controls.Add(this.pictureBox1); + this.Name = "Form1"; + this.Text = "Command Center"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing); + this.Load += new System.EventHandler(this.Form1_Load); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.PictureBox pictureBox1; + private System.Windows.Forms.TextBox textBox1; + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.TextBox textBox2; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.TextBox textBox3; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Label label4; + } +} \ No newline at end of file diff --git a/src/Form1.cs b/src/Form1.cs new file mode 100755 index 0000000..26ff6e5 --- /dev/null +++ b/src/Form1.cs @@ -0,0 +1,372 @@ +using Microsoft.Win32; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Diagnostics; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Net; +using System.Net.Sockets; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using KeyboardHook1; +using Thread = System.Threading.Thread; +using System.Runtime.InteropServices; + +namespace ControlCenter +{ + public partial class Form1 : Form + { + public Form1() + { + InitializeComponent(); + } + + public static TcpClient client; + byte[] buffer = new byte[1]; + Timer t = new Timer(); + + //KeyboardHook hook = new KeyboardHook(); + private void Form1_Load(object sender, EventArgs e) + { + + + Form2 f2 = new Form2(this); + f2.Show(); + t.Enabled = true; + t.Interval = 1000; + t.Tick += (object s, EventArgs eargs) => + { + //DisplayAlert("Timer", "Timer Interval", "OK"); + if (client != null) + { + if (client.Connected) + { + if (client.Client.Poll(0, SelectMode.SelectRead)) + { + try + { + if (client.Client.Receive(buffer, SocketFlags.Peek) == 0) + { + //DisplayAlert("Client Disconnected", "Client Disconnected", "OK"); + ClientDisconnected(); + } + } + catch (Exception ex) + { + Debug.WriteLine("Error while testing connection, restarting..."); + ClientDisconnected(); + } + } + } + } + }; + + t.Start(); + } + + public void ClientDisconnected() + { + try + { + client.Close(); + client.GetStream().Close(); + } + catch (Exception ex) + { + + } + t.Stop(); + Invoke(new Action(() => label4.Text = "Not Connected")); + DisconnectionBeep(); + } + + public void DisconnectionBeep() + { + Thread thr = new Thread(() => { + Thread.Sleep(500); + Console.Beep(1200, 250); + Console.Beep(1000, 250); + Console.Beep(800, 250); + }); + thr.Start(); + } + + + + static string IPstring; + static int connectToPort; + Image bitmapImage; + private void button1_Click(object sender, EventArgs e) + { + if (textBox1.Text.Length == 0) + return; + + SendCommand(textBox1.Text); + } + + public void SendCommand(string message) + { + + if (message.Length >= 5) + { + if (message.Substring(0, 4) == "cmd:") + { + Debug.WriteLine("{cmd}" + message.Substring(4) + "{/cmd}"); + writeMessage("{cmd}" + message.Substring(4) + "{/cmd}"); + return; + } + else if (message.Substring(0, 4) == "key:") + { + Debug.WriteLine("{key}" + message.Substring(4) + "{/key}"); + writeMessage("{key}" + message.Substring(4) + "{/key}"); + return; + } + else if (message.Substring(0, 4) == "tip:") + { + Debug.WriteLine("{tip}" + message.Substring(4) + "{/tip}"); + writeMessage("{tip}" + message.Substring(4) + "{/tip}"); + } + } + + if (!writeMessage(message)) + { + return; + } + if (message == "{Screenshot}") + { + + Debug.WriteLine("Begin Read"); + var BitmapData = getData(client, 1024 * 128); + Debug.WriteLine("End Read"); + + MemoryStream ms = new MemoryStream(); + ms.Write(BitmapData, 0, BitmapData.Length); + bitmapImage = new Bitmap(ms, false); + ms.Dispose(); + + pictureBox1.Image = bitmapImage; + } + else if (message == "{KillTV}") + { + + } + } + + private void button2_Click(object sender, EventArgs e) + { + if (textBox3.Text.Contains(":")) + { + string[] ConnectionStrings = textBox3.Text.Split(':'); + IPstring = ConnectionStrings[0]; + connectToPort = int.Parse(ConnectionStrings[1]); + + client = new TcpClient(); + + client = tryConnect().Result; + + if (client == null) + { + MessageBox.Show("Port Connection Unsuccessful!\nCheck if the host is running, checked the IP Address, and formatted correctly", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error); + Invoke(new Action(() => label4.Text = "Not Connected")); + return; + } + + if (client.Connected) + { + t.Start(); + label4.Text = "Connected"; + } + + Debug.WriteLine($"IP: {IPstring} | Port: {connectToPort}"); + } + else + { + MessageBox.Show("Improper Formatting!", "Connection Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + + } + + + public static int tryConnectTime = 1000; + public static async Task tryConnect() + { + try + { + if (client == null) + { + client = new TcpClient(); + } + + var connectionTask = client.ConnectAsync(IPAddress.Parse(IPstring), connectToPort).ContinueWith(task => + { + return task.IsFaulted ? null : client; + }, TaskContinuationOptions.ExecuteSynchronously); + var timeoutTask = Task.Delay(tryConnectTime).ContinueWith(task => null, TaskContinuationOptions.ExecuteSynchronously); + var resultTask = Task.WhenAny(connectionTask, timeoutTask).Unwrap(); + resultTask.Wait(); + var resultTcpClient = await resultTask; + + return resultTcpClient; + } + catch (Exception ex) + { + Console.WriteLine(ex.Message); + Console.ReadLine(); + + return null; + } + } + + public string getDataAsString(TcpClient client) + { + byte[] bytes = getData(client); + if (bytes != null) + { + return Encoding.ASCII.GetString(bytes); + } + else + { + return null; + } + } + + public byte[] getData(TcpClient client) + { + try + { + NetworkStream stream = client.GetStream(); + byte[] fileSizeBytes = new byte[4]; + int bytes = stream.Read(fileSizeBytes, 0, fileSizeBytes.Length); + Debug.WriteLine("BYTES TO GET: " + bytes); + int dataLength = BitConverter.ToInt32(fileSizeBytes, 0); + + int bytesLeft = dataLength; + byte[] data = new byte[dataLength]; + + int buffersize = 1024; + int bytesRead = 0; + + while (bytesLeft > 0) + { + int curDataSize = Math.Min(buffersize, bytesLeft); + if (client.Available < curDataSize) + { + curDataSize = client.Available; + } + + bytes = stream.Read(data, bytesRead, curDataSize); + bytesRead += curDataSize; + bytesLeft -= curDataSize; + Debug.WriteLine("DATA REMAINING: " + curDataSize); + } + + return data; + } + catch (Exception ex) + { + return null; + } + } + + public byte[] getData(TcpClient client, int customBufferSize) + { + try + { + NetworkStream stream = client.GetStream(); + byte[] fileSizeBytes = new byte[4]; + int bytes = stream.Read(fileSizeBytes, 0, fileSizeBytes.Length); + int dataLength = BitConverter.ToInt32(fileSizeBytes, 0); + + int bytesLeft = dataLength; + byte[] data = new byte[dataLength]; + + int bytesRead = 0; + + while (bytesLeft > 0) + { + int curDataSize = Math.Min(customBufferSize, bytesLeft); + if (client.Available < curDataSize) + { + curDataSize = client.Available; + } + + bytes = stream.Read(data, bytesRead, curDataSize); + bytesRead += curDataSize; + bytesLeft -= curDataSize; + Debug.WriteLine("DATA REMAINING: " + curDataSize); + } + + return data; + } + catch (Exception ex) + { + return null; + } + } + + public bool writeMessage(string input) + { + try + { + if (client == null) + { + throw new ObjectDisposedException(client.ToString()); + } + NetworkStream ns = client.GetStream(); + byte[] message = Encoding.ASCII.GetBytes(input); + ns.Write(message, 0, message.Length); + return true; + } + catch (Exception ex) + { + DisconnectionBeep(); + + label4.Text = "Not Connected"; + return false; + } + } + + public void sendData(byte[] data) + { + try + { + if (client == null) + { + throw new ObjectDisposedException(client.ToString()); + } + NetworkStream ns = client.GetStream(); + ns.Write(data, 0, data.Length); + } + catch (Exception ex) + { + + } + } + + private void Form1_FormClosing(object sender, FormClosingEventArgs e) + { + Form2.ShuttingDown(); + + Application.Exit(); + } + + public string getBetween(string strSource, string strStart, string strEnd) + { + int Start, End; + if (strSource.Contains(strStart) && strSource.Contains(strEnd)) + { + Start = strSource.IndexOf(strStart, 0) + strStart.Length; + End = strSource.IndexOf(strEnd, Start); + return strSource.Substring(Start, End - Start); + } + else + { + return ""; + } + } + } +} diff --git a/src/Form1.resx b/src/Form1.resx new file mode 100755 index 0000000..29dcb1b --- /dev/null +++ b/src/Form1.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/src/Form2.Designer.cs b/src/Form2.Designer.cs new file mode 100755 index 0000000..b12bea1 --- /dev/null +++ b/src/Form2.Designer.cs @@ -0,0 +1,216 @@ +namespace ControlCenter +{ + partial class Form2 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.button1 = new System.Windows.Forms.Button(); + this.button6 = new System.Windows.Forms.Button(); + this.button4 = new System.Windows.Forms.Button(); + this.button2 = new System.Windows.Forms.Button(); + this.button5 = new System.Windows.Forms.Button(); + this.button3 = new System.Windows.Forms.Button(); + this.button7 = new System.Windows.Forms.Button(); + this.button8 = new System.Windows.Forms.Button(); + this.button9 = new System.Windows.Forms.Button(); + this.button10 = new System.Windows.Forms.Button(); + this.button11 = new System.Windows.Forms.Button(); + this.textBox1 = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // button1 + // + this.button1.Location = new System.Drawing.Point(12, 12); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(111, 32); + this.button1.TabIndex = 29; + this.button1.Text = "Open TeamViewer"; + this.button1.UseVisualStyleBackColor = true; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // button6 + // + this.button6.Location = new System.Drawing.Point(130, 97); + this.button6.Name = "button6"; + this.button6.Size = new System.Drawing.Size(111, 32); + this.button6.TabIndex = 28; + this.button6.Text = "Lock Keyboard"; + this.button6.UseVisualStyleBackColor = true; + this.button6.Click += new System.EventHandler(this.button6_Click); + // + // button4 + // + this.button4.Location = new System.Drawing.Point(130, 50); + this.button4.Name = "button4"; + this.button4.Size = new System.Drawing.Size(111, 32); + this.button4.TabIndex = 27; + this.button4.Text = "Turn Screen Off"; + this.button4.UseVisualStyleBackColor = true; + this.button4.Click += new System.EventHandler(this.button4_Click); + // + // button2 + // + this.button2.Location = new System.Drawing.Point(130, 12); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(111, 32); + this.button2.TabIndex = 26; + this.button2.Text = "Close TeamViewer"; + this.button2.UseVisualStyleBackColor = true; + this.button2.Click += new System.EventHandler(this.button2_Click); + // + // button5 + // + this.button5.Location = new System.Drawing.Point(12, 97); + this.button5.Name = "button5"; + this.button5.Size = new System.Drawing.Size(111, 32); + this.button5.TabIndex = 25; + this.button5.Text = "Unlock Keyboard"; + this.button5.UseVisualStyleBackColor = true; + this.button5.Click += new System.EventHandler(this.button5_Click); + // + // button3 + // + this.button3.Location = new System.Drawing.Point(12, 50); + this.button3.Name = "button3"; + this.button3.Size = new System.Drawing.Size(111, 32); + this.button3.TabIndex = 24; + this.button3.Text = "Turn Screen On"; + this.button3.UseVisualStyleBackColor = true; + this.button3.Click += new System.EventHandler(this.button3_Click); + // + // button7 + // + this.button7.Location = new System.Drawing.Point(256, 12); + this.button7.Name = "button7"; + this.button7.Size = new System.Drawing.Size(111, 32); + this.button7.TabIndex = 23; + this.button7.Text = "Screenshot"; + this.button7.UseVisualStyleBackColor = true; + this.button7.Click += new System.EventHandler(this.button7_Click); + // + // button8 + // + this.button8.Location = new System.Drawing.Point(12, 144); + this.button8.Name = "button8"; + this.button8.Size = new System.Drawing.Size(111, 32); + this.button8.TabIndex = 31; + this.button8.Text = "Unblank Screen"; + this.button8.UseVisualStyleBackColor = true; + this.button8.Click += new System.EventHandler(this.button8_Click); + // + // button9 + // + this.button9.Location = new System.Drawing.Point(130, 144); + this.button9.Name = "button9"; + this.button9.Size = new System.Drawing.Size(111, 32); + this.button9.TabIndex = 30; + this.button9.Text = "Blank Screen"; + this.button9.UseVisualStyleBackColor = true; + this.button9.Click += new System.EventHandler(this.button9_Click); + // + // button10 + // + this.button10.Location = new System.Drawing.Point(12, 191); + this.button10.Name = "button10"; + this.button10.Size = new System.Drawing.Size(111, 32); + this.button10.TabIndex = 33; + this.button10.Text = "Unhide TeamViewer"; + this.button10.UseVisualStyleBackColor = true; + this.button10.Click += new System.EventHandler(this.button10_Click); + // + // button11 + // + this.button11.Location = new System.Drawing.Point(130, 191); + this.button11.Name = "button11"; + this.button11.Size = new System.Drawing.Size(111, 32); + this.button11.TabIndex = 32; + this.button11.Text = "Hide TeamViewer"; + this.button11.UseVisualStyleBackColor = true; + this.button11.Click += new System.EventHandler(this.button11_Click); + // + // textBox1 + // + this.textBox1.Location = new System.Drawing.Point(390, 24); + this.textBox1.Name = "textBox1"; + this.textBox1.Size = new System.Drawing.Size(129, 20); + this.textBox1.TabIndex = 34; + this.textBox1.TextChanged += new System.EventHandler(this.textBox1_TextChanged); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(387, 8); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(132, 13); + this.label1.TabIndex = 35; + this.label1.Text = "Default Mouse Control (px)"; + // + // Form2 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(800, 450); + this.Controls.Add(this.label1); + this.Controls.Add(this.textBox1); + this.Controls.Add(this.button10); + this.Controls.Add(this.button11); + this.Controls.Add(this.button8); + this.Controls.Add(this.button9); + this.Controls.Add(this.button1); + this.Controls.Add(this.button6); + this.Controls.Add(this.button4); + this.Controls.Add(this.button2); + this.Controls.Add(this.button5); + this.Controls.Add(this.button3); + this.Controls.Add(this.button7); + this.Name = "Form2"; + this.Text = "Button Controller"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form2_FormClosing); + this.Load += new System.EventHandler(this.Form2_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Button button6; + private System.Windows.Forms.Button button4; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.Button button5; + private System.Windows.Forms.Button button3; + private System.Windows.Forms.Button button7; + private System.Windows.Forms.Button button8; + private System.Windows.Forms.Button button9; + private System.Windows.Forms.Button button10; + private System.Windows.Forms.Button button11; + private System.Windows.Forms.TextBox textBox1; + private System.Windows.Forms.Label label1; + } +} \ No newline at end of file diff --git a/src/Form2.cs b/src/Form2.cs new file mode 100755 index 0000000..1c633f5 --- /dev/null +++ b/src/Form2.cs @@ -0,0 +1,193 @@ +using KeyboardHook1; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Diagnostics; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace ControlCenter +{ + public partial class Form2 : Form + { + Form1 f1; + public Form2(Form1 form1Instance) + { + f1 = form1Instance; + InitializeComponent(); + } + + public static KeyboardHook hook = new KeyboardHook(); + private void Form2_Load(object sender, EventArgs e) + { + hook.KeyDown += Hook_KeyDown; + hook.Install(); + } + private void Form2_FormClosing(object sender, FormClosingEventArgs e) + { + e.Cancel = true; + } + + private void button1_Click(object sender, EventArgs e) + { + f1.SendCommand("{OpenTV}"); + Debug.WriteLine("Turning on TeamViewer"); + } + + private void button2_Click(object sender, EventArgs e) + { + f1.SendCommand("{KillTV}"); + Debug.WriteLine("Turning off TeamViewer"); + } + + private void button3_Click(object sender, EventArgs e) + { + f1.SendCommand("{ScreenON}"); + Debug.WriteLine("Turning on Screen"); + } + + private void button4_Click(object sender, EventArgs e) + { + f1.SendCommand("{ScreenOFF}"); + Debug.WriteLine("Turning off Screen"); + + } + + private void button5_Click(object sender, EventArgs e) + { + f1.SendCommand("{UnlockKeyboard}"); + Debug.WriteLine("Unlocking Keyboard"); + } + + private void button6_Click(object sender, EventArgs e) + { + f1.SendCommand("{LockKeyboard}"); + Debug.WriteLine("Locking Keyboard"); + } + + private void button7_Click(object sender, EventArgs e) + { + f1.SendCommand("{Screenshot}"); + Debug.WriteLine("Taking Screenshot"); + } + private void button8_Click(object sender, EventArgs e) + { + f1.SendCommand("{UnblankScreen}"); + Debug.WriteLine("Unblanking Screen"); + } + + private void button9_Click(object sender, EventArgs e) + { + f1.SendCommand("{BlankScreen}"); + Debug.WriteLine("Blanking Screen"); + } + + public void Hook_KeyUp(KeyboardHook.VKeys key) + { + + } + + public static void ShuttingDown() + { + hook.Uninstall(); + } + + int MouseSpeed; + public void Hook_KeyDown(KeyboardHook.VKeys key) + { + Debug.WriteLine(key); + + switch (key) + { + + case KeyboardHook.VKeys.MULTIPLY: + + f1.SendCommand("{UnlockKeyboard}"); + Console.Beep(1200, 250); + + break; + + case KeyboardHook.VKeys.SUBTRACT: + + Thread thr = new Thread(() => + { + Console.Beep(2000, 250); + }); + + f1.SendCommand("{LockKeyboard}"); + thr.Start(); + + break; + + case KeyboardHook.VKeys.ADD: + + f1.SendCommand("{ScreenOFF}"); + + Console.Beep(650, 250); + + break; + + case KeyboardHook.VKeys.NUMPAD8: + + f1.SendCommand("{moveu}" + MouseSpeed + "{/moveu}"); + + break; + + case KeyboardHook.VKeys.NUMPAD2: + + f1.SendCommand("{moved}" + MouseSpeed + "{/moved}"); + + break; + + case KeyboardHook.VKeys.NUMPAD4: + + f1.SendCommand("{movel}" + MouseSpeed + "{/movel}"); + + break; + + case KeyboardHook.VKeys.NUMPAD6: + + f1.SendCommand("{mover}" + MouseSpeed + "{/mover}"); + + break; + + case KeyboardHook.VKeys.NUMPAD5: + + f1.SendCommand("{click}"); + + break; + + case KeyboardHook.VKeys.APPS: + + f1.SendCommand("key: "); + + break; + } + + } + + private void button10_Click(object sender, EventArgs e) + { + f1.SendCommand("{ShowTV}"); + } + private void button11_Click(object sender, EventArgs e) + { + f1.SendCommand("{HideTV}"); + } + + private void textBox1_TextChanged(object sender, EventArgs e) + { + try + { + MouseSpeed = int.Parse(textBox1.Text); + } + catch (Exception ex) + { } + } + } +} diff --git a/src/Form2.resx b/src/Form2.resx new file mode 100755 index 0000000..29dcb1b --- /dev/null +++ b/src/Form2.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/src/KeyboardHook1.cs b/src/KeyboardHook1.cs new file mode 100755 index 0000000..9d8be71 --- /dev/null +++ b/src/KeyboardHook1.cs @@ -0,0 +1,538 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using System.Runtime.InteropServices; +using System.Diagnostics; +using System.Windows.Input; +using System.Security.Permissions; + +namespace KeyboardHook1 +{ + + /// + /// Class for intercepting low level keyboard hooks + /// + public class KeyboardHook + { + + /// + /// Virtual Keys + /// + public enum VKeys//Vkeys //ACTUAL VKEYS, CHANGED OUT FOR UPDATED KEYS + { + // Losely based on http://www.pinvoke.net/default.aspx/Enums/VK.html + LBUTTON = 0x01, // Left mouse button + RBUTTON = 0x02, // Right mouse button + CANCEL = 0x03, // Control-break processing + MBUTTON = 0x04, // Middle mouse button (three-button mouse) + XBUTTON1 = 0x05, // Windows 2000/XP: X1 mouse button + XBUTTON2 = 0x06, // Windows 2000/XP: X2 mouse button + // 0x07 // Undefined + BACK = 0x08, // BACKSPACE key + TAB = 0x09, // TAB key + // 0x0A-0x0B, // Reserved + CLEAR = 0x0C, // CLEAR key + RETURN = 0x0D, // ENTER key + // 0x0E-0x0F, // Undefined + SHIFT = 0x10, // SHIFT key + CONTROL = 0x11, // CTRL key + MENU = 0x12, // ALT key + PAUSE = 0x13, // PAUSE key + CAPITAL = 0x14, // CAPS LOCK key + KANA = 0x15, // Input Method Editor (IME) Kana mode + HANGUL = 0x15, // IME Hangul mode + // 0x16, // Undefined + JUNJA = 0x17, // IME Junja mode + FINAL = 0x18, // IME final mode + HANJA = 0x19, // IME Hanja mode + KANJI = 0x19, // IME Kanji mode + // 0x1A, // Undefined + ESCAPE = 0x1B, // ESC key + CONVERT = 0x1C, // IME convert + NONCONVERT = 0x1D, // IME nonconvert + ACCEPT = 0x1E, // IME accept + MODECHANGE = 0x1F, // IME mode change request + SPACE = 0x20, // SPACEBAR + PRIOR = 0x21, // PAGE UP key + NEXT = 0x22, // PAGE DOWN key + END = 0x23, // END key + HOME = 0x24, // HOME key + LEFT = 0x25, // LEFT ARROW key + UP = 0x26, // UP ARROW key + RIGHT = 0x27, // RIGHT ARROW key + DOWN = 0x28, // DOWN ARROW key + SELECT = 0x29, // SELECT key + PRINT = 0x2A, // PRINT key + EXECUTE = 0x2B, // EXECUTE key + SNAPSHOT = 0x2C, // PRINT SCREEN key + INSERT = 0x2D, // INS key + DELETE = 0x2E, // DEL key + HELP = 0x2F, // HELP key + KEY_0 = 0x30, // 0 key + KEY_1 = 0x31, // 1 key + KEY_2 = 0x32, // 2 key + KEY_3 = 0x33, // 3 key + KEY_4 = 0x34, // 4 key + KEY_5 = 0x35, // 5 key + KEY_6 = 0x36, // 6 key + KEY_7 = 0x37, // 7 key + KEY_8 = 0x38, // 8 key + KEY_9 = 0x39, // 9 key + // 0x3A-0x40, // Undefined + KEY_A = 0x41, // A key + KEY_B = 0x42, // B key + KEY_C = 0x43, // C key + KEY_D = 0x44, // D key + KEY_E = 0x45, // E key + KEY_F = 0x46, // F key + KEY_G = 0x47, // G key + KEY_H = 0x48, // H key + KEY_I = 0x49, // I key + KEY_J = 0x4A, // J key + KEY_K = 0x4B, // K key + KEY_L = 0x4C, // L key + KEY_M = 0x4D, // M key + KEY_N = 0x4E, // N key + KEY_O = 0x4F, // O key + KEY_P = 0x50, // P key + KEY_Q = 0x51, // Q key + KEY_R = 0x52, // R key + KEY_S = 0x53, // S key + KEY_T = 0x54, // T key + KEY_U = 0x55, // U key + KEY_V = 0x56, // V key + KEY_W = 0x57, // W key + KEY_X = 0x58, // X key + KEY_Y = 0x59, // Y key + KEY_Z = 0x5A, // Z key + LWIN = 0x5B, // Left Windows key (Microsoft Natural keyboard) + RWIN = 0x5C, // Right Windows key (Natural keyboard) + APPS = 0x5D, // Applications key (Natural keyboard) + // 0x5E, // Reserved + SLEEP = 0x5F, // Computer Sleep key + NUMPAD0 = 0x60, // Numeric keypad 0 key + NUMPAD1 = 0x61, // Numeric keypad 1 key + NUMPAD2 = 0x62, // Numeric keypad 2 key + NUMPAD3 = 0x63, // Numeric keypad 3 key + NUMPAD4 = 0x64, // Numeric keypad 4 key + NUMPAD5 = 0x65, // Numeric keypad 5 key + NUMPAD6 = 0x66, // Numeric keypad 6 key + NUMPAD7 = 0x67, // Numeric keypad 7 key + NUMPAD8 = 0x68, // Numeric keypad 8 key + NUMPAD9 = 0x69, // Numeric keypad 9 key + MULTIPLY = 0x6A, // Multiply key + ADD = 0x6B, // Add key + SEPARATOR = 0x6C, // Separator key + SUBTRACT = 0x6D, // Subtract key + DECIMAL = 0x6E, // Decimal key + DIVIDE = 0x6F, // Divide key + F1 = 0x70, // F1 key + F2 = 0x71, // F2 key + F3 = 0x72, // F3 key + F4 = 0x73, // F4 key + F5 = 0x74, // F5 key + F6 = 0x75, // F6 key + F7 = 0x76, // F7 key + F8 = 0x77, // F8 key + F9 = 0x78, // F9 key + F10 = 0x79, // F10 key + F11 = 0x7A, // F11 key + F12 = 0x7B, // F12 key + F13 = 0x7C, // F13 key + F14 = 0x7D, // F14 key + F15 = 0x7E, // F15 key + F16 = 0x7F, // F16 key + F17 = 0x80, // F17 key + F18 = 0x81, // F18 key + F19 = 0x82, // F19 key + F20 = 0x83, // F20 key + F21 = 0x84, // F21 key + F22 = 0x85, // F22 key, (PPC only) Key used to lock device. + F23 = 0x86, // F23 key + F24 = 0x87, // F24 key + // 0x88-0X8F, // Unassigned + NUMLOCK = 0x90, // NUM LOCK key + SCROLL = 0x91, // SCROLL LOCK key + // 0x92-0x96, // OEM specific + // 0x97-0x9F, // Unassigned + LSHIFT = 0xA0, // Left SHIFT key + RSHIFT = 0xA1, // Right SHIFT key + LCONTROL = 0xA2, // Left CONTROL key + RCONTROL = 0xA3, // Right CONTROL key + LMENU = 0xA4, // Left MENU key + RMENU = 0xA5, // Right MENU key + BROWSER_BACK = 0xA6, // Windows 2000/XP: Browser Back key + BROWSER_FORWARD = 0xA7, // Windows 2000/XP: Browser Forward key + BROWSER_REFRESH = 0xA8, // Windows 2000/XP: Browser Refresh key + BROWSER_STOP = 0xA9, // Windows 2000/XP: Browser Stop key + BROWSER_SEARCH = 0xAA, // Windows 2000/XP: Browser Search key + BROWSER_FAVORITES = 0xAB, // Windows 2000/XP: Browser Favorites key + BROWSER_HOME = 0xAC, // Windows 2000/XP: Browser Start and Home key + VOLUME_MUTE = 0xAD, // Windows 2000/XP: Volume Mute key + VOLUME_DOWN = 0xAE, // Windows 2000/XP: Volume Down key + VOLUME_UP = 0xAF, // Windows 2000/XP: Volume Up key + MEDIA_NEXT_TRACK = 0xB0,// Windows 2000/XP: Next Track key + MEDIA_PREV_TRACK = 0xB1,// Windows 2000/XP: Previous Track key + MEDIA_STOP = 0xB2, // Windows 2000/XP: Stop Media key + MEDIA_PLAY_PAUSE = 0xB3,// Windows 2000/XP: Play/Pause Media key + LAUNCH_MAIL = 0xB4, // Windows 2000/XP: Start Mail key + LAUNCH_MEDIA_SELECT = 0xB5, // Windows 2000/XP: Select Media key + LAUNCH_APP1 = 0xB6, // Windows 2000/XP: Start Application 1 key + LAUNCH_APP2 = 0xB7, // Windows 2000/XP: Start Application 2 key + // 0xB8-0xB9, // Reserved + OEM_1 = 0xBA, // Used for miscellaneous characters; it can vary by keyboard. + // Windows 2000/XP: For the US standard keyboard, the ';:' key + OEM_PLUS = 0xBB, // Windows 2000/XP: For any country/region, the '+' key + OEM_COMMA = 0xBC, // Windows 2000/XP: For any country/region, the ',' key + OEM_MINUS = 0xBD, // Windows 2000/XP: For any country/region, the '-' key + OEM_PERIOD = 0xBE, // Windows 2000/XP: For any country/region, the '.' key + OEM_2 = 0xBF, // Used for miscellaneous characters; it can vary by keyboard. + // Windows 2000/XP: For the US standard keyboard, the '/?' key + OEM_3 = 0xC0, // Used for miscellaneous characters; it can vary by keyboard. + // Windows 2000/XP: For the US standard keyboard, the '`~' key + // 0xC1-0xD7, // Reserved + // 0xD8-0xDA, // Unassigned + OEM_4 = 0xDB, // Used for miscellaneous characters; it can vary by keyboard. + // Windows 2000/XP: For the US standard keyboard, the '[{' key + OEM_5 = 0xDC, // Used for miscellaneous characters; it can vary by keyboard. + // Windows 2000/XP: For the US standard keyboard, the '\|' key + OEM_6 = 0xDD, // Used for miscellaneous characters; it can vary by keyboard. + // Windows 2000/XP: For the US standard keyboard, the ']}' key + OEM_7 = 0xDE, // Used for miscellaneous characters; it can vary by keyboard. + // Windows 2000/XP: For the US standard keyboard, the 'single-quote/double-quote' key + OEM_8 = 0xDF, // Used for miscellaneous characters; it can vary by keyboard. + // 0xE0, // Reserved + // 0xE1, // OEM specific + OEM_102 = 0xE2, // Windows 2000/XP: Either the angle bracket key or the backslash key on the RT 102-key keyboard + // 0xE3-E4, // OEM specific + PROCESSKEY = 0xE5, // Windows 95/98/Me, Windows NT 4.0, Windows 2000/XP: IME PROCESS key + // 0xE6, // OEM specific + PACKET = 0xE7, // Windows 2000/XP: Used to pass Unicode characters as if they were keystrokes. The VK_PACKET key is the low word of a 32-bit Virtual Key value used for non-keyboard input methods. For more information, see Remark in KEYBDINPUT, SendInput, WM_KEYDOWN, and WM_KEYUP + // 0xE8, // Unassigned + // 0xE9-F5, // OEM specific + ATTN = 0xF6, // Attn key + CRSEL = 0xF7, // CrSel key + EXSEL = 0xF8, // ExSel key + EREOF = 0xF9, // Erase EOF key + PLAY = 0xFA, // Play key + ZOOM = 0xFB, // Zoom key + NONAME = 0xFC, // Reserved + PA1 = 0xFD, // PA1 key + OEM_CLEAR = 0xFE // Clear key + } + + public enum TranslationKeys + { + // Losely based on http://www.pinvoke.net/default.aspx/Enums/VK.html + //NULL = 0x00, //I ADDED THIS ONE MYSELF <----------------------------------- + LBUTTON = 0x01, // Left mouse button + RBUTTON = 0x02, // Right mouse button + CANCEL = 0x03, // Control-break processing + MBUTTON = 0x04, // Middle mouse button (three-button mouse) + XBUTTON1 = 0x05, // Windows 2000/XP: X1 mouse button + XBUTTON2 = 0x06, // Windows 2000/XP: X2 mouse button + // 0x07 // Undefined + BACKSPACE = 0x08, // BACKSPACE key + TAB = 0x09, // TAB key + // 0x0A-0x0B, // Reserved + CLEAR = 0x0C, // CLEAR key + RETURN = 0x0D, // ENTER key + // 0x0E-0x0F, // Undefined + SHIFT = 0x10, // SHIFT key + CONTROL = 0x11, // CTRL key + ALT = 0x12, // ALT key + PAUSE = 0x13, // PAUSE key + CAPITAL = 0x14, // CAPS LOCK key + KANA = 0x15, // Input Method Editor (IME) Kana mode + HANGUL = 0x15, // IME Hangul mode + // 0x16, // Undefined + JUNJA = 0x17, // IME Junja mode + FINAL = 0x18, // IME final mode + HANJA = 0x19, // IME Hanja mode + KANJI = 0x19, // IME Kanji mode + // 0x1A, // Undefined + ESCAPE = 0x1B, // ESC key + CONVERT = 0x1C, // IME convert + NONCONVERT = 0x1D, // IME nonconvert + ACCEPT = 0x1E, // IME accept + MODECHANGE = 0x1F, // IME mode change request + SPACE = 0x20, // SPACEBAR + PAGEUP = 0x21, // PAGE UP key + PAGEDOWN = 0x22, // PAGE DOWN key + END = 0x23, // END key + HOME = 0x24, // HOME key + LEFT = 0x25, // LEFT ARROW key + UP = 0x26, // UP ARROW key + RIGHT = 0x27, // RIGHT ARROW key + DOWN = 0x28, // DOWN ARROW key + SELECT = 0x29, // SELECT key + PRINT = 0x2A, // PRINT key + EXECUTE = 0x2B, // EXECUTE key + SNAPSHOT = 0x2C, // PRINT SCREEN key + INSERT = 0x2D, // INS key + DELETE = 0x2E, // DEL key + HELP = 0x2F, // HELP key + KEY_0 = 0x30, // 0 key + KEY_1 = 0x31, // 1 key + KEY_2 = 0x32, // 2 key + KEY_3 = 0x33, // 3 key + KEY_4 = 0x34, // 4 key + KEY_5 = 0x35, // 5 key + KEY_6 = 0x36, // 6 key + KEY_7 = 0x37, // 7 key + KEY_8 = 0x38, // 8 key + KEY_9 = 0x39, // 9 key + // 0x3A-0x40, // Undefined + KEY_A = 0x41, // A key + KEY_B = 0x42, // B key + KEY_C = 0x43, // C key + KEY_D = 0x44, // D key + KEY_E = 0x45, // E key + KEY_F = 0x46, // F key + KEY_G = 0x47, // G key + KEY_H = 0x48, // H key + KEY_I = 0x49, // I key + KEY_J = 0x4A, // J key + KEY_K = 0x4B, // K key + KEY_L = 0x4C, // L key + KEY_M = 0x4D, // M key + KEY_N = 0x4E, // N key + KEY_O = 0x4F, // O key + KEY_P = 0x50, // P key + KEY_Q = 0x51, // Q key + KEY_R = 0x52, // R key + KEY_S = 0x53, // S key + KEY_T = 0x54, // T key + KEY_U = 0x55, // U key + KEY_V = 0x56, // V key + KEY_W = 0x57, // W key + KEY_X = 0x58, // X key + KEY_Y = 0x59, // Y key + KEY_Z = 0x5A, // Z key + LWIN = 0x5B, // Left Windows key (Microsoft Natural keyboard) + RWIN = 0x5C, // Right Windows key (Natural keyboard) + APPS = 0x5D, // Applications key (Natural keyboard) + // 0x5E, // Reserved + SLEEP = 0x5F, // Computer Sleep key + NUMPAD0 = 0x60, // Numeric keypad 0 key + NUMPAD1 = 0x61, // Numeric keypad 1 key + NUMPAD2 = 0x62, // Numeric keypad 2 key + NUMPAD3 = 0x63, // Numeric keypad 3 key + NUMPAD4 = 0x64, // Numeric keypad 4 key + NUMPAD5 = 0x65, // Numeric keypad 5 key + NUMPAD6 = 0x66, // Numeric keypad 6 key + NUMPAD7 = 0x67, // Numeric keypad 7 key + NUMPAD8 = 0x68, // Numeric keypad 8 key + NUMPAD9 = 0x69, // Numeric keypad 9 key + MULTIPLY = 0x6A, // Multiply key + ADD = 0x6B, // Add key + SEPARATOR = 0x6C, // Separator key + SUBTRACT = 0x6D, // Subtract key + DECIMAL = 0x6E, // Decimal key + DIVIDE = 0x6F, // Divide key + F1 = 0x70, // F1 key + F2 = 0x71, // F2 key + F3 = 0x72, // F3 key + F4 = 0x73, // F4 key + F5 = 0x74, // F5 key + F6 = 0x75, // F6 key + F7 = 0x76, // F7 key + F8 = 0x77, // F8 key + F9 = 0x78, // F9 key + F10 = 0x79, // F10 key + F11 = 0x7A, // F11 key + F12 = 0x7B, // F12 key + F13 = 0x7C, // F13 key + F14 = 0x7D, // F14 key + F15 = 0x7E, // F15 key + F16 = 0x7F, // F16 key + F17 = 0x80, // F17 key + F18 = 0x81, // F18 key + F19 = 0x82, // F19 key + F20 = 0x83, // F20 key + F21 = 0x84, // F21 key + F22 = 0x85, // F22 key, (PPC only) Key used to lock device. + F23 = 0x86, // F23 key + F24 = 0x87, // F24 key + // 0x88-0X8F, // Unassigned + NUMLOCK = 0x90, // NUM LOCK key + SCROLL = 0x91, // SCROLL LOCK key + // 0x92-0x96, // OEM specific + // 0x97-0x9F, // Unassigned + LSHIFT = 0xA0, // Left SHIFT key + RSHIFT = 0xA1, // Right SHIFT key + LCONTROL = 0xA2, // Left CONTROL key + RCONTROL = 0xA3, // Right CONTROL key + LMENU = 0xA4, // Left MENU key + RMENU = 0xA5, // Right MENU key + BROWSER_BACK = 0xA6, // Windows 2000/XP: Browser Back key + BROWSER_FORWARD = 0xA7, // Windows 2000/XP: Browser Forward key + BROWSER_REFRESH = 0xA8, // Windows 2000/XP: Browser Refresh key + BROWSER_STOP = 0xA9, // Windows 2000/XP: Browser Stop key + BROWSER_SEARCH = 0xAA, // Windows 2000/XP: Browser Search key + BROWSER_FAVORITES = 0xAB, // Windows 2000/XP: Browser Favorites key + BROWSER_HOME = 0xAC, // Windows 2000/XP: Browser Start and Home key + VOLUME_MUTE = 0xAD, // Windows 2000/XP: Volume Mute key + VOLUME_DOWN = 0xAE, // Windows 2000/XP: Volume Down key + VOLUME_UP = 0xAF, // Windows 2000/XP: Volume Up key + MEDIA_NEXT_TRACK = 0xB0,// Windows 2000/XP: Next Track key + MEDIA_PREV_TRACK = 0xB1,// Windows 2000/XP: Previous Track key + MEDIA_STOP = 0xB2, // Windows 2000/XP: Stop Media key + MEDIA_PLAY_PAUSE = 0xB3,// Windows 2000/XP: Play/Pause Media key + LAUNCH_MAIL = 0xB4, // Windows 2000/XP: Start Mail key + LAUNCH_MEDIA_SELECT = 0xB5, // Windows 2000/XP: Select Media key + LAUNCH_APP1 = 0xB6, // Windows 2000/XP: Start Application 1 key + LAUNCH_APP2 = 0xB7, // Windows 2000/XP: Start Application 2 key + // 0xB8-0xB9, // Reserved + OEM_1 = 0xBA, // Used for miscellaneous characters; it can vary by keyboard. + // Windows 2000/XP: For the US standard keyboard, the ';:' key + OEM_PLUS = 0xBB, // Windows 2000/XP: For any country/region, the '+' key + OEM_COMMA = 0xBC, // Windows 2000/XP: For any country/region, the ',' key + OEM_MINUS = 0xBD, // Windows 2000/XP: For any country/region, the '-' key + OEM_PERIOD = 0xBE, // Windows 2000/XP: For any country/region, the '.' key + OEM_2 = 0xBF, // Used for miscellaneous characters; it can vary by keyboard. + // Windows 2000/XP: For the US standard keyboard, the '/?' key + OEM_3 = 0xC0, // Used for miscellaneous characters; it can vary by keyboard. + // Windows 2000/XP: For the US standard keyboard, the '`~' key + // 0xC1-0xD7, // Reserved + // 0xD8-0xDA, // Unassigned + OEM_4 = 0xDB, // Used for miscellaneous characters; it can vary by keyboard. + // Windows 2000/XP: For the US standard keyboard, the '[{' key + OEM_5 = 0xDC, // Used for miscellaneous characters; it can vary by keyboard. + // Windows 2000/XP: For the US standard keyboard, the '\|' key + OEM_6 = 0xDD, // Used for miscellaneous characters; it can vary by keyboard. + // Windows 2000/XP: For the US standard keyboard, the ']}' key + OEM_7 = 0xDE, // Used for miscellaneous characters; it can vary by keyboard. + // Windows 2000/XP: For the US standard keyboard, the 'single-quote/double-quote' key + OEM_8 = 0xDF, // Used for miscellaneous characters; it can vary by keyboard. + // 0xE0, // Reserved + // 0xE1, // OEM specific + OEM_102 = 0xE2, // Windows 2000/XP: Either the angle bracket key or the backslash key on the RT 102-key keyboard + // 0xE3-E4, // OEM specific + PROCESSKEY = 0xE5, // Windows 95/98/Me, Windows NT 4.0, Windows 2000/XP: IME PROCESS key + // 0xE6, // OEM specific + PACKET = 0xE7, // Windows 2000/XP: Used to pass Unicode characters as if they were keystrokes. The VK_PACKET key is the low word of a 32-bit Virtual Key value used for non-keyboard input methods. For more information, see Remark in KEYBDINPUT, SendInput, WM_KEYDOWN, and WM_KEYUP + // 0xE8, // Unassigned + // 0xE9-F5, // OEM specific + ATTN = 0xF6, // Attn key + CRSEL = 0xF7, // CrSel key + EXSEL = 0xF8, // ExSel key + EREOF = 0xF9, // Erase EOF key + PLAY = 0xFA, // Play key + ZOOM = 0xFB, // Zoom key + NONAME = 0xFC, // Reserved + PA1 = 0xFD, // PA1 key + OEM_CLEAR = 0xFE // Clear key + } + + /// + /// Internal callback processing function + /// + private delegate IntPtr KeyboardHookHandler(int nCode, IntPtr wParam, IntPtr lParam); + private KeyboardHookHandler hookHandler; + + /// + /// Function that will be called when defined events occur + /// + /// VKeys + public delegate void KeyboardHookCallback(VKeys key); + + #region Events + public event KeyboardHookCallback KeyDown; + public event KeyboardHookCallback KeyUp; + #endregion + + /// + /// Hook ID + /// + private IntPtr hookID = IntPtr.Zero; + + /// + /// Install low level keyboard hook + /// + public void Install() + { + int a = 0; + int b = 0; + a ^= b; + hookHandler = HookFunc; + hookID = SetHook(hookHandler); + } + + /// + /// Remove low level keyboard hook + /// + public void Uninstall() + { + UnhookWindowsHookEx(hookID); + } + + /// + /// Registers hook with Windows API + /// + /// Callback function + /// Hook ID + private IntPtr SetHook(KeyboardHookHandler proc) + { + using (ProcessModule module = Process.GetCurrentProcess().MainModule) + return SetWindowsHookEx(13, proc, GetModuleHandle(module.ModuleName), 0); + } + + /// + /// Default hook call, which analyses pressed keys + /// + private IntPtr HookFunc(int nCode, IntPtr wParam, IntPtr lParam) + { + if (nCode >= 0) + { + int iwParam = wParam.ToInt32(); + + if ((iwParam == WM_KEYDOWN || iwParam == WM_SYSKEYDOWN)) + if (KeyDown != null) + KeyDown((VKeys)Marshal.ReadInt32(lParam)); + if ((iwParam == WM_KEYUP || iwParam == WM_SYSKEYUP)) + if (KeyUp != null) + KeyUp((VKeys)Marshal.ReadInt32(lParam)); + } + + return CallNextHookEx(hookID, nCode, wParam, lParam); + } + + /// + /// Destructor. Unhook current hook + /// + ~KeyboardHook() + { + Uninstall(); + } + + /// + /// Low-Level function declarations + /// + #region WinAPI + private const int WM_KEYDOWN = 0x100; + private const int WM_SYSKEYDOWN = 0x104; + private const int WM_KEYUP = 0x101; + private const int WM_SYSKEYUP = 0x105; + + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] + private static extern IntPtr SetWindowsHookEx(int idHook, KeyboardHookHandler 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); + #endregion + } +} \ No newline at end of file diff --git a/src/Program.cs b/src/Program.cs new file mode 100755 index 0000000..7c9861a --- /dev/null +++ b/src/Program.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Runtime.InteropServices; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace ControlCenter +{ + static class Program + { + /// + /// The main entry point for the application. + /// + static string appGuid = ((GuidAttribute)Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(GuidAttribute), true)[0]).Value; + [STAThread] + static void Main() + { + + using (Mutex mutex = new Mutex(false, "Global\\" + appGuid)) + { + if (!mutex.WaitOne(0, false)) + { + MessageBox.Show("Program instance is already running!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new Form1()); + } + } + } +} diff --git a/src/Properties/AssemblyInfo.cs b/src/Properties/AssemblyInfo.cs new file mode 100755 index 0000000..0903f34 --- /dev/null +++ b/src/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("ControlCenter")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("ControlCenter")] +[assembly: AssemblyCopyright("Copyright © 2020")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("1309cb00-06eb-4962-9b20-adf929b654d7")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// 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")] diff --git a/src/Properties/Resources.Designer.cs b/src/Properties/Resources.Designer.cs new file mode 100755 index 0000000..8547974 --- /dev/null +++ b/src/Properties/Resources.Designer.cs @@ -0,0 +1,71 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace ControlCenter.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // 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", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ControlCenter.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/src/Properties/Resources.resx b/src/Properties/Resources.resx new file mode 100755 index 0000000..ffecec8 --- /dev/null +++ b/src/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/src/Properties/Settings.Designer.cs b/src/Properties/Settings.Designer.cs new file mode 100755 index 0000000..4d00358 --- /dev/null +++ b/src/Properties/Settings.Designer.cs @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace ControlCenter.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/src/Properties/Settings.settings b/src/Properties/Settings.settings new file mode 100755 index 0000000..abf36c5 --- /dev/null +++ b/src/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + +