From d22463649d9dea337f40bd305dc5048e872d6122 Mon Sep 17 00:00:00 2001 From: Allen Wolf <63997543+aaw3@users.noreply.github.com> Date: Tue, 9 Jan 2024 21:08:44 -0600 Subject: [PATCH] Add project --- .gitignore | 228 ++++++++++ src/App.config | 6 + src/ColorViewForm.Designer.cs | 49 +++ src/ColorViewForm.cs | 64 +++ src/ColorViewForm.resx | 120 ++++++ src/CursorPointForm.Designer.cs | 48 +++ src/CursorPointForm.cs | 42 ++ src/CursorPointForm.resx | 120 ++++++ src/Form1.Designer.cs | 58 +++ src/Form1.cs | 538 ++++++++++++++++++++++++ src/Form1.resx | 123 ++++++ src/KeyboardHook1.cs | 335 +++++++++++++++ src/Program.cs | 22 + src/Properties/AssemblyInfo.cs | 36 ++ src/Properties/Resources.Designer.cs | 71 ++++ src/Properties/Resources.resx | 117 ++++++ src/Properties/Settings.Designer.cs | 30 ++ src/Properties/Settings.settings | 7 + src/Windows DLL Function Testing.csproj | 102 +++++ src/Windows DLL Function Testing.sln | 25 ++ 20 files changed, 2141 insertions(+) create mode 100644 .gitignore create mode 100755 src/App.config create mode 100755 src/ColorViewForm.Designer.cs create mode 100755 src/ColorViewForm.cs create mode 100755 src/ColorViewForm.resx create mode 100755 src/CursorPointForm.Designer.cs create mode 100755 src/CursorPointForm.cs create mode 100755 src/CursorPointForm.resx create mode 100755 src/Form1.Designer.cs create mode 100755 src/Form1.cs create mode 100755 src/Form1.resx create mode 100755 src/KeyboardHook1.cs create mode 100755 src/Program.cs create mode 100755 src/Properties/AssemblyInfo.cs create mode 100755 src/Properties/Resources.Designer.cs create mode 100755 src/Properties/Resources.resx create mode 100755 src/Properties/Settings.Designer.cs create mode 100755 src/Properties/Settings.settings create mode 100755 src/Windows DLL Function Testing.csproj create mode 100755 src/Windows DLL Function Testing.sln diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..63beb45 --- /dev/null +++ b/.gitignore @@ -0,0 +1,228 @@ +# The following command works for downloading when using Git for Windows: +# curl -LOf http://gist.githubusercontent.com/kmorcinek/2710267/raw/.gitignore +# +# Download this file using PowerShell v3 under Windows with the following comand: +# Invoke-WebRequest https://gist.githubusercontent.com/kmorcinek/2710267/raw/ -OutFile .gitignore +# +# or wget: +# wget --no-check-certificate http://gist.githubusercontent.com/kmorcinek/2710267/raw/.gitignore + +src/bin/* + +# User-specific files +*.suo +*.user +*.sln.docstates + +# Build results +[Dd]ebug/ +[Rr]elease/ +x64/ +[Bb]in/ +[Oo]bj/ +# build folder is nowadays used for build scripts and should not be ignored +#build/ + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/packages/* +# except build/, which is used as an MSBuild target. +!**/packages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/packages/repositories.config + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +*_i.c +*_p.c +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.scc + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opensdf +*.sdf +*.cachefile + +# Visual Studio profiler +*.psess +*.vsp +*.vspx + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +*.ncrunch* +.*crunch*.local.xml + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.Publish.xml + +# Windows Azure Build Output +csx +*.build.csdef + +# Windows Store app package directory +AppPackages/ + +# Others +*.Cache +ClientBin/ +[Ss]tyle[Cc]op.* +~$* +*~ +*.dbmdl +*.[Pp]ublish.xml +*.pfx +*.publishsettings +modulesbin/ +tempbin/ + +# EPiServer Site file (VPP) +AppData/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file to a newer +# Visual Studio version. Backup files are not needed, because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# vim +*.txt~ +*.swp +*.swo + +# Temp files when opening LibreOffice on ubuntu +.~lock.* + +# svn +.svn + +# CVS - Source Control +**/CVS/ + +# Remainings from resolving conflicts in Source Control +*.orig + +# SQL Server files +**/App_Data/*.mdf +**/App_Data/*.ldf +**/App_Data/*.sdf + + +#LightSwitch generated files +GeneratedArtifacts/ +_Pvt_Extensions/ +ModelManifest.xml + +# ========================= +# Windows detritus +# ========================= + +# Windows image file caches +Thumbs.db +ehthumbs.db + +# Folder config file +Desktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# OS generated files # +Icon? + +# Mac desktop service store files +.DS_Store + +# SASS Compiler cache +.sass-cache + +# Visual Studio 2014 CTP +**/*.sln.ide + +# Visual Studio temp something +.vs/ + +# dotnet stuff +project.lock.json + +# VS 2015+ +*.vc.vc.opendb +*.vc.db + +# Rider +.idea/ + +# Visual Studio Code +.vscode/ + +# Output folder used by Webpack or other FE stuff +**/node_modules/* +**/wwwroot/* + +# SpecFlow specific +*.feature.cs +*.feature.xlsx.* +*.Specs_*.html + +# UWP Projects +AppPackages/ + +##### +# End of core ignore list, below put you custom 'per project' settings (patterns or path) +##### 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/ColorViewForm.Designer.cs b/src/ColorViewForm.Designer.cs new file mode 100755 index 0000000..44ff947 --- /dev/null +++ b/src/ColorViewForm.Designer.cs @@ -0,0 +1,49 @@ +namespace Windows_DLL_Function_Testing +{ + partial class ColorViewForm + { + /// + /// 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.SuspendLayout(); + // + // ColorViewForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(127, 127); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Name = "ColorViewForm"; + this.Text = "ColorViewForm"; + this.Load += new System.EventHandler(this.ColorViewForm_Load); + this.Paint += new System.Windows.Forms.PaintEventHandler(this.ColorViewForm_Paint); + this.ResumeLayout(false); + + } + + #endregion + } +} \ No newline at end of file diff --git a/src/ColorViewForm.cs b/src/ColorViewForm.cs new file mode 100755 index 0000000..217fa2a --- /dev/null +++ b/src/ColorViewForm.cs @@ -0,0 +1,64 @@ +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.Tasks; +using System.Windows.Forms; + +namespace Windows_DLL_Function_Testing +{ + public partial class ColorViewForm : Form + { + public string pposition; + public ColorViewForm(string position) + { + InitializeComponent(); + + pposition = position; + } + + protected override CreateParams CreateParams //Hide in Alt-Tab (If pressing alt-tab while it's showing, it won't work until hiding again) + { + get + { + CreateParams cp = base.CreateParams; + // turn on WS_EX_TOOLWINDOW style bit + cp.ExStyle |= 0x80; + return cp; + } + } + + private void ColorViewForm_Load(object sender, EventArgs e) + { + this.ShowInTaskbar = false; + this.Size = new Size(125 + 3, 125 + 3); + if (pposition == "TLeft") + { + this.Location = new Point((int)(Screen.PrimaryScreen.Bounds.Width * 1.06f) - Screen.PrimaryScreen.Bounds.Width - 1, (int)(Screen.PrimaryScreen.Bounds.Height * 1.10f) - Screen.PrimaryScreen.Bounds.Height - 1); + } + else if (pposition == "TRight") + { + this.Location = new Point((int)(Screen.PrimaryScreen.Bounds.Width / 1.06f) - this.Size.Width - 1, (int)(Screen.PrimaryScreen.Bounds.Height * 1.10f) - Screen.PrimaryScreen.Bounds.Height - 1); + } + else if (pposition == "BLeft") + { + this.Location = new Point((int)(Screen.PrimaryScreen.Bounds.Width * 1.06f) - Screen.PrimaryScreen.Bounds.Width - 1, (int)(Screen.PrimaryScreen.Bounds.Height / 1.10f - this.Size.Height - 1)); + } + else if (pposition == "BRight") + { + this.Location = new Point((int)(Screen.PrimaryScreen.Bounds.Width / 1.06f) - this.Size.Width - 1, (int)(Screen.PrimaryScreen.Bounds.Height / 1.10f) - this.Size.Height - 1); + } + } + + int Width = 3; + private void ColorViewForm_Paint(object sender, PaintEventArgs e) + { + e.Graphics.DrawRectangle(new Pen(Color.Black, Width), new Rectangle(new Point(this.DisplayRectangle.X + 1, this.DisplayRectangle.Y + 1), new Size(this.DisplayRectangle.Width - Width, this.DisplayRectangle.Height - Width))); + //e.Graphics.DrawRectangle(new Pen(Color.Black, 3), new Rectangle(this.Location, new Size(this.Width - 5, this.Height - 5))); + } + } +} diff --git a/src/ColorViewForm.resx b/src/ColorViewForm.resx new file mode 100755 index 0000000..29dcb1b --- /dev/null +++ b/src/ColorViewForm.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/CursorPointForm.Designer.cs b/src/CursorPointForm.Designer.cs new file mode 100755 index 0000000..16dfcb3 --- /dev/null +++ b/src/CursorPointForm.Designer.cs @@ -0,0 +1,48 @@ +namespace Windows_DLL_Function_Testing +{ + partial class CursorPointForm + { + /// + /// 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.SuspendLayout(); + // + // CursorPointForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(800, 450); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Name = "CursorPointForm"; + this.Text = "CursorPointForm"; + this.Load += new System.EventHandler(this.CursorPointForm_Load); + this.ResumeLayout(false); + + } + + #endregion + } +} \ No newline at end of file diff --git a/src/CursorPointForm.cs b/src/CursorPointForm.cs new file mode 100755 index 0000000..2719451 --- /dev/null +++ b/src/CursorPointForm.cs @@ -0,0 +1,42 @@ +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; + +namespace Windows_DLL_Function_Testing +{ + public partial class CursorPointForm : Form + { + public int pwidth; + public int pheight; + public CursorPointForm(int width, int height) + { + InitializeComponent(); + + pwidth = width; + pheight = height; + } + + protected override CreateParams CreateParams //Hide in Alt-Tab (If pressing alt-tab while it's showing, it won't work until hiding again) + { + get + { + CreateParams cp = base.CreateParams; + // turn on WS_EX_TOOLWINDOW style bit + cp.ExStyle |= 0x80; + return cp; + } + } + + private void CursorPointForm_Load(object sender, EventArgs e) + { + this.ShowInTaskbar = false; + this.Size = new Size(pwidth, pheight); + } + } +} diff --git a/src/CursorPointForm.resx b/src/CursorPointForm.resx new file mode 100755 index 0000000..29dcb1b --- /dev/null +++ b/src/CursorPointForm.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/Form1.Designer.cs b/src/Form1.Designer.cs new file mode 100755 index 0000000..775903f --- /dev/null +++ b/src/Form1.Designer.cs @@ -0,0 +1,58 @@ +namespace Windows_DLL_Function_Testing +{ + 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.components = new System.ComponentModel.Container(); + this.t1 = new System.Windows.Forms.Timer(this.components); + this.SuspendLayout(); + // + // t1 + // + this.t1.Tick += new System.EventHandler(this.t1_Tick); + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(800, 450); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Name = "Form1"; + this.Text = "Form1"; + this.WindowState = System.Windows.Forms.FormWindowState.Minimized; + this.Load += new System.EventHandler(this.Form1_Load); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Timer t1; + } +} + diff --git a/src/Form1.cs b/src/Form1.cs new file mode 100755 index 0000000..45e5bb9 --- /dev/null +++ b/src/Form1.cs @@ -0,0 +1,538 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Diagnostics; +using System.Drawing; +using System.Drawing.Imaging; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; +using KeyboardHook1; + +namespace Windows_DLL_Function_Testing +{ + public partial class Form1 : Form + { + public Form1() + { + InitializeComponent(); + } + + KeyboardHook _listener; + List KeysList; + + protected override CreateParams CreateParams //Hide in Alt-Tab (If pressing alt-tab while it's showing, it won't work until hiding again) + { + get + { + CreateParams cp = base.CreateParams; + // turn on WS_EX_TOOLWINDOW style bit + cp.ExStyle |= 0x80; + return cp; + } + } + + + //-------------- + //WINDOW RELATED + //-------------- + [DllImport("user32.dll", EntryPoint = "SetWindowPos")] + public static extern IntPtr SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int x, int Y, int cx, int cy, int wFlags); //https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-setwindowpos + const short HWND_BOTTOM = 1; //SET TO BOTTOM UNTIL REOPENED TO TOP + const short HWND_NOTOPMOST = -2; //TRYS TO ALWAYS BE AT BOTTOM + const short HWND_TOP = 0; //SETS TO TOP UNTIL DIFFERENT PROGRAM OPENED TO TOP + const short HWND_TOPMOST = -1; // KEEP PROGRAM AT TOP ALWAYS + + //NOSIZE + NOMOVE = KEEPTOPMOST + //Not all of the SetWindowsPos Flags: + const short SWP_NOMOVE = 0X2; + const short SWP_NOSIZE = 1; + const short SWP_NOZORDER = 0X4; + const short SWP_SHOWWINDOW = 0x0040; + + //--- + + [DllImport("user32.dll")] + static extern bool SetLayeredWindowAttributes(IntPtr hwnd, uint crKey, byte bAlpha, uint dwFlags); //https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-setlayeredwindowattributes?redirectedfrom=MSDN + public const int GWL_EXSTYLE = -20; + public const int WS_EX_LAYERED = 0x80000; + public const int LWA_ALPHA = 0x2; + public const int LWA_COLORKEY = 0x1; + + [DllImport("user32.dll", EntryPoint = "SetWindowLongA", SetLastError = true)] + private static extern int SetWindowLong(IntPtr hwnd, int nIndex, int dwNewLong); //https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-setwindowlonga + + [DllImport("user32.dll", EntryPoint = "GetWindowLongA", SetLastError = true)] + private static extern int GetWindowLong(IntPtr hwnd, int nIndex); //https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getwindowlonga + + //--- + [DllImport("user32.dll", SetLastError = true)] + static extern IntPtr SetFocus(IntPtr hWnd); //https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-setfocus + + [DllImport("user32.dll", SetLastError = true)] + public static extern IntPtr GetDesktopWindow(); //https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getdesktopwindow + + [DllImport("user32.dll", SetLastError = true)] + public static extern IntPtr GetWindowDC(IntPtr window); //https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getwindowdc + + + + //-------------- + //CURSOR RELATED + //-------------- + [DllImport("user32.dll")] + public static extern bool GetCursorPos(ref Point lpPoint); //https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getcursorpos + + [DllImport("user32.dll")] + public static extern bool SetCursorPos(int x, int y); //https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-setcursorpos + + + int cursorValue; + [DllImport("user32.dll")] + static extern int ShowCursor(bool bShow); //https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-showcursor + + //---------------- + //GRPAHICS RELATED + //---------------- + [DllImport("user32.dll")] + static extern IntPtr GetDC(IntPtr hwnd); //https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getdc + + [DllImport("user32.dll")] + static extern Int32 ReleaseDC(IntPtr hwnd, IntPtr hdc); //https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-releasedc + + [DllImport("gdi32.dll")] + static extern uint GetPixel(IntPtr hdc, int nXPos, int nYPos); //https://docs.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-getpixel + + [DllImport("gdi32.dll", CharSet = CharSet.Auto, SetLastError = true, ExactSpelling = true)] + public static extern int BitBlt(IntPtr hDC, int x, int y, int nWidth, int nHeight, IntPtr hSrcDC, int xSrc, int ySrc, int dwRop); //https://docs.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-bitblt + + ColorViewForm cvf; + CursorPointForm cpf; + + bool ColorViewActive; + bool CVJustDeactivated; + + bool CursorPointActive; + bool CPJustDeactivated; + + bool CursorPixColorActive; + bool CPCJustDeactivated; + + Point pt1; + IntPtr FormHandle; + //SEE NOTE WIN.1 + private void Form1_Load(object sender, EventArgs e) + { + this.ShowInTaskbar = false; + UsingColorViewForm(true); + UsingCursorPoint(true, Color.Red, 1, 1); + + this.Location = new Point(0, 0); + this.Size = new Size(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height); + this.WindowState = FormWindowState.Maximized; + FormHandle = this.Handle; + SetWindowPos(FormHandle, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); + + + //Debug.WriteLine(Screen.PrimaryScreen.Bounds.Width + " " + Screen.PrimaryScreen.Bounds.Height); + pt1 = new Point(); + _listener = new KeyboardHook(); + KeysList = new List(); + _listener.Install(); + _listener.KeyDown += _listener_KeyDown; + _listener.KeyUp += _listener_KeyUp; + + MakeFormTransparent(); + + t1.Enabled = true; + t1.Interval = 10; + this.FormClosing += (osender, eargs) => + { + t1.Tick -= t1_Tick; + _listener.Uninstall(); + }; + } + + bool CVFMHoverEnabled; + public void UsingColorViewForm(bool boolean) + { + if (boolean) + { + //cvf = new ColorViewForm("MHover"); + cvf = new ColorViewForm("MHover"); + + if (cvf.pposition == "MHover") + { + CVFMHoverEnabled = true; + } + + SetWindowPos(cvf.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); + } + } + + public void UsingCursorPoint(bool boolean, Color color, int width, int height) + { + if (boolean) + { + cpf = new CursorPointForm(width, height); + cpf.BackColor = color; + cpf.FormBorderStyle = FormBorderStyle.None; + SetWindowPos(cpf.Handle, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); + } + } + + public void MakeFormTransparent() + { + SetWindowLong(this.Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) ^ WS_EX_LAYERED); + SetLayeredWindowAttributes(Handle, 0, 1, LWA_ALPHA); + } + + Color MousePixelColor; + bool MousePixelPressed; + bool MousePixelPressingStopped; + public void GetPixelAtMousePoint() + { + this.Activate(); + if (!MousePixelPressingStopped) + { + if (!MousePixelPressed) + { + SetWindowPos(FormHandle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); //Not going to hide cursor cause it doesn't matter + MousePixelPressed = true; + } + + GetCursorPos(ref pt1); + MousePixelColor = GetColorAt(pt1); + Debug.WriteLine("The Current Color at Mouse Cursor is: " + MousePixelColor); + } + else + { + SetWindowPos(FormHandle, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); + MousePixelPressed = false; + MousePixelPressingStopped = false; + } + + //if (!MousePixelPressingStopped) + //{ + // if (!MousePixelPressed) + // { + // SetWindowPos(FormHandle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); // SWP_NOZORDER - DON'T USE, SWP_SHOWWINDOW - NOT NEEDED I GUESS + // ShowCursor(false); + // MousePixelPressed = true; + // } + + // GetCursorPos(ref pt1); + // IntPtr hdc = GetDC(IntPtr.Zero); + // uint pixel = GetPixel(hdc, pt1.X, pt1.Y); + // ReleaseDC(IntPtr.Zero, hdc); + // MousePixelColor = Color.FromArgb((int)pixel); + // Console.WriteLine("Color at CURSOR is {0}", MousePixelColor); + //} + //else + //{ + // SetWindowPos(FormHandle, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); + // ShowCursor(true); + // MousePixelPressed = false; + // MousePixelPressingStopped = false; + //} + } + + Bitmap screenPixel = new Bitmap(1, 1, PixelFormat.Format32bppArgb); + public Color GetColorAt(Point location) + { + using (Graphics gdest = Graphics.FromImage(screenPixel)) + { + using (Graphics gsrc = Graphics.FromHwnd(IntPtr.Zero)) + { + IntPtr hSrcDC = gsrc.GetHdc(); + IntPtr hDC = gdest.GetHdc(); + int retval = BitBlt(hDC, 0, 0, 1, 1, hSrcDC, location.X, location.Y, (int)CopyPixelOperation.SourceCopy); + gdest.ReleaseHdc(); + gsrc.ReleaseHdc(); + } + } + + return screenPixel.GetPixel(0, 0); + } + + //public static Color GetColorAt1(int x, int y) //might be better or not + //{ + // IntPtr desk = GetDesktopWindow(); + // IntPtr dc = GetWindowDC(desk); + // int a = (int)GetPixel(dc, x, y); + // ReleaseDC(desk, dc); + // return Color.FromArgb(255, (a >> 0) & 0xff, (a >> 8) & 0xff, (a >> 16) & 0xff); + //} + + bool cvfShown; + + bool cpfShown; + Point cpfPoint; + + int cvfcommonXConfig = 20 - 70 - 1; + int cvfcommonYConfig = - 10 + 60 - 1; + private void _listener_KeyDown(KeyboardHook.VKeys key) + { + if (!KeysList.Contains(key)) + { + KeysList.Add(key); + } + + if (KeysList.Contains(KeyboardHook.VKeys.KEY_C) && KeysList.Contains(KeyboardHook.VKeys.KEY_G)) + { + if (!CursorPixColorActive) + { + CursorPixColorActive = true; + } + } + + if (KeysList.Contains(KeyboardHook.VKeys.KEY_P) && KeysList.Contains(KeyboardHook.VKeys.KEY_C)) + { + if (!CursorPointActive) + { + CursorPointActive = true; + } + } + + if (KeysList.Contains(KeyboardHook.VKeys.LCONTROL) && KeysList.Contains(KeyboardHook.VKeys.LSHIFT) && KeysList.Contains(KeyboardHook.VKeys.KEY_G)) + { + if (!ColorViewActive) + { + ColorViewActive = true; + } + } + + if (KeysList.Contains(KeyboardHook.VKeys.LWIN)) + { + Thread.Sleep(2000); + } + + if (KeysList.Contains(KeyboardHook.VKeys.LCONTROL) && KeysList.Contains(KeyboardHook.VKeys.LSHIFT) && KeysList.Contains(KeyboardHook.VKeys.KEY_F)) + { + GetCursorPos(ref pt1); + Debug.WriteLine("Position At Press: " + pt1); + } + } + + private void _listener_KeyUp(KeyboardHook.VKeys key) + { + KeysList.Remove(key); + + if (key != KeyboardHook.VKeys.KEY_G || key != KeyboardHook.VKeys.KEY_C) + { + CPCJustDeactivated = true; + } + + if (cpfShown && (key != KeyboardHook.VKeys.KEY_C || key != KeyboardHook.VKeys.KEY_P)) + { + CPJustDeactivated = true; + } + + if (MousePixelPressed && (key != KeyboardHook.VKeys.LCONTROL || key != KeyboardHook.VKeys.LSHIFT || key != KeyboardHook.VKeys.KEY_G)) + { + CVJustDeactivated = true; + } + } + + //bool Finished; + //public void TestFunction() //doesn't really work, bitbtl makes so slow. + //{ + // cvf.Show(); + // for (int h = 0; h < 1439; h += 5) + // { + // if (Finished) + // { + // break; + // } + + // for (int w = 0; w < 2559; w += 5) + // { + // if (Finished) + // { + // break; + // } + + // SetCursorPos(w, h); + + // MousePixelColor = GetColorAt1(w, h); + // cvf.BackColor = Color.FromArgb(MousePixelColor.R, MousePixelColor.G, MousePixelColor.B); + + // Debug.WriteLine(MousePixelColor); + + // if (MousePixelColor.R == 74 && MousePixelColor.G == 138 && MousePixelColor.B == 255) + // { + // Finished = true; + // SetCursorPos(w, h); + // Debug.WriteLine("DONE"); + // } + // } + // } + + // Debug.WriteLine("COULD NOT FIND"); + //} + + bool runOnce; + private void t1_Tick(object sender, EventArgs e) + { + //if (!runOnce) + //{ + // TestFunction(); + // runOnce = true; + //} + + if (CursorPixColorActive) + { + GetPixelAtMousePoint(); + + if (CPCJustDeactivated) + { + CursorPixColorActive = false; + CPCJustDeactivated = false; + + MousePixelPressingStopped = true; + GetPixelAtMousePoint(); + SetWindowPos(FormHandle, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); + } + } + + if (CursorPointActive) + { + if (cpf != null) + { + if (!cpfShown) + { + this.Activate(); + SetWindowPos(FormHandle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); + SetFocus(FormHandle); + if (cursorValue > -1) + { + cursorValue = ShowCursor(false); + } + Debug.WriteLine("Cursor Hidden"); + cpf.Show(); + cpfShown = true; + } + + GetCursorPos(ref pt1); + if (cpfPoint.X != pt1.X && cpfPoint.Y != pt1.Y) + { + cpf.Location = pt1; + } + } + else + { + Debug.WriteLine("THE \"CURSOR POINT\" FUNCTION IS CURRENTLY DISABLED."); + } + + if (CPJustDeactivated) + { + CursorPointActive = false; + CPJustDeactivated = false; + + cpf.Hide(); + cpfShown = false; + if (cursorValue < 0) + { + cursorValue = ShowCursor(true); + + } + Debug.WriteLine("Cursor Shown"); + + SetWindowPos(FormHandle, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); + } + } + + if (ColorViewActive) + { + if (!cvfShown) + { + this.Activate(); + SetWindowPos(FormHandle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); + //ShowCursor(false); + cvf.Show(); + cvfShown = true; + } + + GetPixelAtMousePoint();//Just calling function to get mouse pixel + cvf.BackColor = MousePixelColor; + + if (CVFMHoverEnabled) //may need to make compatable with all screens! + { + if (pt1.X < Screen.PrimaryScreen.Bounds.Width - cvf.Size.Width + cvfcommonXConfig && pt1.Y > cvf.Height + cvfcommonYConfig) //no issue + { + cvf.Location = new Point(pt1.X + 20, pt1.Y - cvf.Height - 10); + } + else if ((pt1.X < Screen.PrimaryScreen.Bounds.Width - cvf.Size.Width + cvfcommonXConfig) && !(pt1.Y > cvf.Height + cvfcommonYConfig)) //Top issue + { + cvf.Location = new Point(pt1.X + 20, cvf.Height + cvfcommonYConfig + 20); + } + else if (!(pt1.X < Screen.PrimaryScreen.Bounds.Width - cvf.Size.Width + cvfcommonXConfig) && (pt1.Y > cvf.Height + cvfcommonYConfig)) //Right issue + { + cvf.Location = new Point(Screen.PrimaryScreen.Bounds.Width - cvf.Size.Width * 2 + cvfcommonXConfig - 15, pt1.Y - cvf.Height - 10); + } + else if (!(pt1.X < Screen.PrimaryScreen.Bounds.Width - cvf.Size.Width + cvfcommonXConfig) && !(pt1.Y > cvf.Height + cvfcommonYConfig)) //Top and Right issue + { + cvf.Location = new Point(Screen.PrimaryScreen.Bounds.Width - cvf.Size.Width * 2 + cvfcommonXConfig - 10, cvf.Height + cvfcommonYConfig + 20); + } + + } + + if (CVJustDeactivated) + { + ColorViewActive = false; + CVJustDeactivated = false; + + Debug.WriteLine("Key Released"); + MousePixelPressingStopped = true; + GetPixelAtMousePoint(); + cvf.Hide(); + cvfShown = false; + SetWindowPos(FormHandle, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); + if (cursorValue < 0) + { + cursorValue = ShowCursor(true); + } + Debug.WriteLine("Cursor Shown"); + + SendKeys.Flush(); //may need to remove, just added to fix sticky keys + } + } + } + } +} + +//INDIVIDUAL KEY MEANINGS: +//G: Graphics +//C: Cursor +//P: Point, Relating to Point(); + +//LIST OF KEYBINDS: +// G + C = Graphics at Cursor (Pixel Color) +// C + P = Point at cursor +// LCTRL + LSHIFT + G = Show Graphics at Cursor in ColorViewForm +//LCTRL + LSHIFT + F = GET CURSOR POS ON PRESS + + +//NOTES: +//CSR: + + + +//GFX: + + + +//WIN: +//1. CAN CONTROL OTHER WINDOWS: +//{IntPtr ProcessHandle; +//EX: If you use Process p = new Process() +//p.Filename = "%CHROME DIRECTORY%\CHROME.EXE"; +//ProcessHandle = p.MainWindowHandle; //This might be how it works, I think as long as you assign above it will work properly. +//SetWindowPos(arguments); //Control the window pos and location ehre. +//} + + diff --git a/src/Form1.resx b/src/Form1.resx new file mode 100755 index 0000000..2ee1ef0 --- /dev/null +++ b/src/Form1.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + 17, 17 + + \ No newline at end of file diff --git a/src/KeyboardHook1.cs b/src/KeyboardHook1.cs new file mode 100755 index 0000000..c2c2987 --- /dev/null +++ b/src/KeyboardHook1.cs @@ -0,0 +1,335 @@ +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 + { + // 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 + 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 + } + + /// + /// 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..f255896 --- /dev/null +++ b/src/Program.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace Windows_DLL_Function_Testing +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + 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..61c1d1a --- /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("Windows DLL Function Testing")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Windows DLL Function Testing")] +[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("c69ce6b8-1038-4663-bbae-ef03952ad7dc")] + +// 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..cc354ee --- /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 Windows_DLL_Function_Testing.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("Windows_DLL_Function_Testing.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..744e6b8 --- /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 Windows_DLL_Function_Testing.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 @@ + + + + + + + diff --git a/src/Windows DLL Function Testing.csproj b/src/Windows DLL Function Testing.csproj new file mode 100755 index 0000000..022c0c4 --- /dev/null +++ b/src/Windows DLL Function Testing.csproj @@ -0,0 +1,102 @@ + + + + + Debug + AnyCPU + {C69CE6B8-1038-4663-BBAE-EF03952AD7DC} + WinExe + Windows_DLL_Function_Testing + Windows DLL Function Testing + 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 + + + ColorViewForm.cs + + + Form + + + CursorPointForm.cs + + + Form + + + Form1.cs + + + + + + ColorViewForm.cs + + + CursorPointForm.cs + + + Form1.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/Windows DLL Function Testing.sln b/src/Windows DLL Function Testing.sln new file mode 100755 index 0000000..c9e29bd --- /dev/null +++ b/src/Windows DLL Function Testing.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}") = "Windows DLL Function Testing", "Windows DLL Function Testing.csproj", "{C69CE6B8-1038-4663-BBAE-EF03952AD7DC}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {C69CE6B8-1038-4663-BBAE-EF03952AD7DC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C69CE6B8-1038-4663-BBAE-EF03952AD7DC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C69CE6B8-1038-4663-BBAE-EF03952AD7DC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C69CE6B8-1038-4663-BBAE-EF03952AD7DC}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {2615E1F0-2EAE-4890-8515-266912402768} + EndGlobalSection +EndGlobal