diff --git a/USB Lockdown/App.config b/USB Lockdown/App.config
new file mode 100644
index 0000000..8e15646
--- /dev/null
+++ b/USB Lockdown/App.config
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/USB Lockdown/Form1.Designer.cs b/USB Lockdown/Form1.Designer.cs
new file mode 100644
index 0000000..14e7539
--- /dev/null
+++ b/USB Lockdown/Form1.Designer.cs
@@ -0,0 +1,39 @@
+namespace USB_Lockdown
+{
+ 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.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.Text = "Form1";
+ }
+
+ #endregion
+ }
+}
+
diff --git a/USB Lockdown/Form1.cs b/USB Lockdown/Form1.cs
new file mode 100644
index 0000000..0df705d
--- /dev/null
+++ b/USB Lockdown/Form1.cs
@@ -0,0 +1,20 @@
+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 USB_Lockdown
+{
+ public partial class Form1 : Form
+ {
+ public Form1()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/USB Lockdown/Program.cs b/USB Lockdown/Program.cs
new file mode 100644
index 0000000..9b6a4a1
--- /dev/null
+++ b/USB Lockdown/Program.cs
@@ -0,0 +1,22 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace USB_Lockdown
+{
+ 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/USB Lockdown/Properties/AssemblyInfo.cs b/USB Lockdown/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..bc9e69b
--- /dev/null
+++ b/USB Lockdown/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("USB Lockdown")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("USB Lockdown")]
+[assembly: AssemblyCopyright("Copyright © 2014")]
+[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("ffd4cfc3-e927-47b0-bf44-086a4c339ece")]
+
+// 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/USB Lockdown/Properties/Resources.Designer.cs b/USB Lockdown/Properties/Resources.Designer.cs
new file mode 100644
index 0000000..9779d50
--- /dev/null
+++ b/USB Lockdown/Properties/Resources.Designer.cs
@@ -0,0 +1,71 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.34014
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace USB_Lockdown.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("USB_Lockdown.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/USB Lockdown/Properties/Resources.resx b/USB Lockdown/Properties/Resources.resx
new file mode 100644
index 0000000..af7dbeb
--- /dev/null
+++ b/USB Lockdown/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/USB Lockdown/Properties/Settings.Designer.cs b/USB Lockdown/Properties/Settings.Designer.cs
new file mode 100644
index 0000000..925e397
--- /dev/null
+++ b/USB Lockdown/Properties/Settings.Designer.cs
@@ -0,0 +1,30 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.34014
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace USB_Lockdown.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/USB Lockdown/Properties/Settings.settings b/USB Lockdown/Properties/Settings.settings
new file mode 100644
index 0000000..3964565
--- /dev/null
+++ b/USB Lockdown/Properties/Settings.settings
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/USB Lockdown/USB Lockdown.csproj b/USB Lockdown/USB Lockdown.csproj
new file mode 100644
index 0000000..9889927
--- /dev/null
+++ b/USB Lockdown/USB Lockdown.csproj
@@ -0,0 +1,86 @@
+
+
+
+
+ Debug
+ AnyCPU
+ {347CAF7D-5114-4295-AC5D-13F5ABEC4D1D}
+ WinExe
+ Properties
+ USB_Lockdown
+ USB Lockdown
+ v4.5
+ 512
+
+
+ AnyCPU
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ AnyCPU
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Form
+
+
+ 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/USB Lockdown/USB Lockdown.sln b/USB Lockdown/USB Lockdown.sln
new file mode 100644
index 0000000..b4ecc0b
--- /dev/null
+++ b/USB Lockdown/USB Lockdown.sln
@@ -0,0 +1,22 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Express 2013 for Windows Desktop
+VisualStudioVersion = 12.0.21005.1
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "USB Lockdown", "USB Lockdown.csproj", "{347CAF7D-5114-4295-AC5D-13F5ABEC4D1D}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {347CAF7D-5114-4295-AC5D-13F5ABEC4D1D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {347CAF7D-5114-4295-AC5D-13F5ABEC4D1D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {347CAF7D-5114-4295-AC5D-13F5ABEC4D1D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {347CAF7D-5114-4295-AC5D-13F5ABEC4D1D}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/USB Lockdown/keyboardDisable.cs b/USB Lockdown/keyboardDisable.cs
new file mode 100644
index 0000000..4a219d2
--- /dev/null
+++ b/USB Lockdown/keyboardDisable.cs
@@ -0,0 +1,382 @@
+/// KEYBOARD.CS
+/// (c) 2006 by Emma Burrows
+/// This file contains the following items:
+/// - KeyboardHook: class to enable low-level keyboard hook using
+/// the Windows API.
+/// - KeyboardHookEventHandler: delegate to handle the KeyIntercepted
+/// event raised by the KeyboardHook class.
+/// - KeyboardHookEventArgs: EventArgs class to contain the information
+/// returned by the KeyIntercepted event.
+///
+/// Change history:
+/// 17/06/06: 1.0 - First version.
+/// 18/06/06: 1.1 - Modified proc assignment in constructor to make class backward
+/// compatible with 2003.
+/// 10/07/06: 1.2 - Added support for modifier keys:
+/// -Changed filter in HookCallback to WM_KEYUP instead of WM_KEYDOWN
+/// -Imported GetKeyState from user32.dll
+/// -Moved native DLL imports to a separate internal class as this
+/// is a Good Idea according to Microsoft's guidelines
+/// 13/02/07: 1.3 - Improved modifier key support:
+/// -Added CheckModifiers() method
+/// -Deleted LoWord/HiWord methods as they weren't necessary
+/// -Implemented Barry Dorman's suggestion to AND GetKeyState
+/// values with 0x8000 to get their result
+/// 23/03/07: 1.4 - Fixed bug which made the Alt key appear stuck
+/// - Changed the line
+/// if (nCode >= 0 && (wParam == (IntPtr)WM_KEYUP || wParam == (IntPtr)WM_SYSKEYUP))
+/// to
+/// if (nCode >= 0)
+/// {
+/// if (wParam == (IntPtr)WM_KEYUP || wParam == (IntPtr)WM_SYSKEYUP)
+/// ...
+/// Many thanks to "Scottie Numbnuts" for the solution.
+
+
+using System;
+using System.Diagnostics;
+using System.Windows.Forms;
+using System.Runtime.InteropServices;
+using System.Text;
+
+///
+/// Low-level keyboard intercept class to trap and suppress system keys.
+///
+namespace USB_Lockdown
+{
+ internal class KeyboardLock // ##Made by me! (Needs testing)
+ {
+ private static KeyboardHook KH;
+
+ internal static void enable()
+ {
+ KH = new KeyboardHook();
+ }
+
+ internal static void disable()
+ {
+ KH.Dispose();
+ KH = null;
+ }
+ }
+ public class KeyboardHook : IDisposable
+ {
+ ///
+ /// Parameters accepted by the KeyboardHook constructor.
+ ///
+ public enum Parameters
+ {
+ None,
+ AllowAltTab,
+ AllowWindowsKey,
+ AllowAltTabAndWindows,
+ PassAllKeysToNextApp
+ }
+
+ //Internal parameters
+ private bool PassAllKeysToNextApp = false;
+ private bool AllowAltTab = false;
+ private bool AllowWindowsKey = false;
+
+ //Keyboard API constants
+ private const int WH_KEYBOARD_LL = 13;
+ private const int WM_KEYUP = 0x0101;
+ private const int WM_SYSKEYUP = 0x0105;
+
+ //Modifier key constants
+ private const int VK_SHIFT = 0x10;
+ private const int VK_CONTROL = 0x11;
+ private const int VK_MENU = 0x12;
+ private const int VK_CAPITAL = 0x14;
+
+ //Variables used in the call to SetWindowsHookEx
+ private HookHandlerDelegate proc;
+ private IntPtr hookID = IntPtr.Zero;
+ internal delegate IntPtr HookHandlerDelegate(
+ int nCode, IntPtr wParam, ref KBDLLHOOKSTRUCT lParam);
+
+ ///
+ /// Event triggered when a keystroke is intercepted by the
+ /// low-level hook.
+ ///
+ public event KeyboardHookEventHandler KeyIntercepted;
+
+ // Structure returned by the hook whenever a key is pressed
+ internal struct KBDLLHOOKSTRUCT
+ {
+ public int vkCode;
+ int scanCode;
+ public int flags;
+ int time;
+ int dwExtraInfo;
+ }
+
+ #region Constructors
+ ///
+ /// Sets up a keyboard hook to trap all keystrokes without
+ /// passing any to other applications.
+ ///
+ public KeyboardHook()
+ {
+ proc = new HookHandlerDelegate(HookCallback);
+ using (Process curProcess = Process.GetCurrentProcess())
+ using (ProcessModule curModule = curProcess.MainModule)
+ {
+ hookID = NativeMethods.SetWindowsHookEx(WH_KEYBOARD_LL, proc,
+ NativeMethods.GetModuleHandle(curModule.ModuleName), 0);
+ }
+ }
+
+ ///
+ /// Sets up a keyboard hook with custom parameters.
+ ///
+ /// A valid name from the Parameter enum; otherwise, the
+ /// default parameter Parameter.None will be used.
+ public KeyboardHook(string param)
+ : this()
+ {
+ if (!String.IsNullOrEmpty(param) && Enum.IsDefined(typeof(Parameters), param))
+ {
+ SetParameters((Parameters)Enum.Parse(typeof(Parameters), param));
+ }
+ }
+
+ ///
+ /// Sets up a keyboard hook with custom parameters.
+ ///
+ /// A value from the Parameters enum.
+ public KeyboardHook(Parameters param)
+ : this()
+ {
+ SetParameters(param);
+ }
+
+ private void SetParameters(Parameters param)
+ {
+ switch (param)
+ {
+ case Parameters.None:
+ break;
+ case Parameters.AllowAltTab:
+ AllowAltTab = true;
+ break;
+ case Parameters.AllowWindowsKey:
+ AllowWindowsKey = true;
+ break;
+ case Parameters.AllowAltTabAndWindows:
+ AllowAltTab = true;
+ AllowWindowsKey = true;
+ break;
+ case Parameters.PassAllKeysToNextApp:
+ PassAllKeysToNextApp = true;
+ break;
+ }
+ }
+ #endregion
+
+ #region Check Modifier keys
+ ///
+ /// Checks whether Alt, Shift, Control or CapsLock
+ /// is enabled at the same time as another key.
+ /// Modify the relevant sections and return type
+ /// depending on what you want to do with modifier keys.
+ ///
+ private void CheckModifiers()
+ {
+ StringBuilder sb = new StringBuilder();
+
+ if ((NativeMethods.GetKeyState(VK_CAPITAL) & 0x0001) != 0)
+ {
+ //CAPSLOCK is ON
+ sb.AppendLine("Capslock is enabled.");
+ }
+
+ if ((NativeMethods.GetKeyState(VK_SHIFT) & 0x8000) != 0)
+ {
+ //SHIFT is pressed
+ sb.AppendLine("Shift is pressed.");
+ }
+ if ((NativeMethods.GetKeyState(VK_CONTROL) & 0x8000) != 0)
+ {
+ //CONTROL is pressed
+ sb.AppendLine("Control is pressed.");
+ }
+ if ((NativeMethods.GetKeyState(VK_MENU) & 0x8000) != 0)
+ {
+ //ALT is pressed
+ sb.AppendLine("Alt is pressed.");
+ }
+ Console.WriteLine(sb.ToString());
+ }
+ #endregion Check Modifier keys
+
+ #region Hook Callback Method
+ ///
+ /// Processes the key event captured by the hook.
+ ///
+ private IntPtr HookCallback(
+ int nCode, IntPtr wParam, ref KBDLLHOOKSTRUCT lParam)
+ {
+ bool AllowKey = PassAllKeysToNextApp;
+
+ //Filter wParam for KeyUp events only
+ if (nCode >= 0)
+ {
+ if (wParam == (IntPtr)WM_KEYUP || wParam == (IntPtr)WM_SYSKEYUP)
+ {
+
+ // Check for modifier keys, but only if the key being
+ // currently processed isn't a modifier key (in other
+ // words, CheckModifiers will only run if Ctrl, Shift,
+ // CapsLock or Alt are active at the same time as
+ // another key)
+ if (!(lParam.vkCode >= 160 && lParam.vkCode <= 164))
+ {
+ CheckModifiers();
+ }
+
+ // Check for key combinations that are allowed to
+ // get through to Windows
+ //
+ // Ctrl+Esc or Windows key
+ if (AllowWindowsKey)
+ {
+ switch (lParam.flags)
+ {
+ //Ctrl+Esc
+ case 0:
+ if (lParam.vkCode == 27)
+ AllowKey = true;
+ break;
+
+ //Windows keys
+ case 1:
+ if ((lParam.vkCode == 91) || (lParam.vkCode == 92))
+ AllowKey = true;
+ break;
+ }
+ }
+ // Alt+Tab
+ if (AllowAltTab)
+ {
+ if ((lParam.flags == 32) && (lParam.vkCode == 9))
+ AllowKey = true;
+ }
+
+ OnKeyIntercepted(new KeyboardHookEventArgs(lParam.vkCode, AllowKey));
+ }
+
+ //If this key is being suppressed, return a dummy value
+ if (AllowKey == false)
+ return (System.IntPtr)1;
+ }
+ //Pass key to next application
+ return NativeMethods.CallNextHookEx(hookID, nCode, wParam, ref lParam);
+
+ }
+ #endregion
+
+ #region Event Handling
+ ///
+ /// Raises the KeyIntercepted event.
+ ///
+ /// An instance of KeyboardHookEventArgs
+ public void OnKeyIntercepted(KeyboardHookEventArgs e)
+ {
+ if (KeyIntercepted != null)
+ KeyIntercepted(e);
+ }
+
+ ///
+ /// Delegate for KeyboardHook event handling.
+ ///
+ /// An instance of InterceptKeysEventArgs.
+ public delegate void KeyboardHookEventHandler(KeyboardHookEventArgs e);
+
+ ///
+ /// Event arguments for the KeyboardHook class's KeyIntercepted event.
+ ///
+ public class KeyboardHookEventArgs : System.EventArgs
+ {
+
+ private string keyName;
+ private int keyCode;
+ private bool passThrough;
+
+ ///
+ /// The name of the key that was pressed.
+ ///
+ public string KeyName
+ {
+ get { return keyName; }
+ }
+
+ ///
+ /// The virtual key code of the key that was pressed.
+ ///
+ public int KeyCode
+ {
+ get { return keyCode; }
+ }
+
+ ///
+ /// True if this key combination was passed to other applications,
+ /// false if it was trapped.
+ ///
+ public bool PassThrough
+ {
+ get { return passThrough; }
+ }
+
+ public KeyboardHookEventArgs(int evtKeyCode, bool evtPassThrough)
+ {
+ keyName = ((Keys)evtKeyCode).ToString();
+ keyCode = evtKeyCode;
+ passThrough = evtPassThrough;
+ }
+
+ }
+
+ #endregion
+
+ #region IDisposable Members
+ ///
+ /// Releases the keyboard hook.
+ ///
+ public void Dispose()
+ {
+ NativeMethods.UnhookWindowsHookEx(hookID);
+ }
+ #endregion
+
+ #region Native methods
+
+ [ComVisibleAttribute(false),
+ System.Security.SuppressUnmanagedCodeSecurity()]
+ internal class NativeMethods
+ {
+ [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
+ public static extern IntPtr GetModuleHandle(string lpModuleName);
+
+ [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
+ public static extern IntPtr SetWindowsHookEx(int idHook,
+ HookHandlerDelegate lpfn, IntPtr hMod, uint dwThreadId);
+
+ [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
+ [return: MarshalAs(UnmanagedType.Bool)]
+ public static extern bool UnhookWindowsHookEx(IntPtr hhk);
+
+ [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
+ public static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode,
+ IntPtr wParam, ref KBDLLHOOKSTRUCT lParam);
+
+ [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true, CallingConvention = CallingConvention.Winapi)]
+ public static extern short GetKeyState(int keyCode);
+
+ }
+
+
+ #endregion
+ }
+}
+