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