Feedback

C# - GlobalHook Klasse

Veröffentlicht von am 27.08.2012
(0 Bewertungen)
GFU-Schulungen  [Anzeige]

VB.NET 2017/2015/2013 Aufbau

Nach dieser Schulung können Sie mittels objektorientierter Modelle in VB.NET 2017/2015/2013 wiederverwendbare Elemente eigenständig erstellen.

Visual Studio Team Foundation Server 2017/2015 (TFS) für Projektmitglieder - Kompakt

Nach Teilnahme an dieser Schulung sind Ihnen die Grundlagen von ALM geläufig. Sie planen und steuern Projekte effizient mit dem Visual Studio Team Foundation Server.

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Windows.Forms;


namespace Utilities {
   class globalKeyboardHook {
       #region Constant, Structure and Delegate Definitions
       
       public delegate int keyboardHookProc(int code, int wParam, ref keyboardHookStruct lParam);
       
       public struct keyboardHookStruct {
           public int vkCode;
           public int scanCode;
           public int flags;
           public int time;
           public int dwExtraInfo;
       }
       
       const int WH_KEYBOARD_LL = 13;
       const int WM_KEYDOWN = 0x100;
       const int WM_KEYUP = 0x101;
       const int WM_SYSKEYDOWN = 0x104;
       const int WM_SYSKEYUP = 0x105;
       
       #endregion
       
       
       keyboardHookProc khp;
       
       
       #region Instance Variables
       public List<Keys> HookedKeys = new List<Keys>();
       
       IntPtr hhook = IntPtr.Zero;
       #endregion
       
       #region Events
       
       public event KeyEventHandler KeyDown;
       
       
       public event KeyEventHandler KeyUp;
       
       #endregion
       
       #region Constructors and Destructors
       
       
       
       public globalKeyboardHook() {
           khp = new keyboardHookProc(hookProc);
           hook();
       }
       
       
       ~globalKeyboardHook() {
           unhook();
       }
       #endregion
       
       #region Public Methods
       
       public void hook() {
           IntPtr hInstance = LoadLibrary("User32");
           hhook = SetWindowsHookEx(WH_KEYBOARD_LL, khp, hInstance, 0);
       }
       
       public void unhook() {
           UnhookWindowsHookEx(hhook);
       }
       
       
       
       public int hookProc(int code, int wParam, ref keyboardHookStruct lParam) {
           if (code >= 0) {
               Keys key = (Keys)lParam.vkCode;
               if (HookedKeys.Contains(key)) {
                   KeyEventArgs kea = new KeyEventArgs(key);
                   if ((wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN) && (KeyDown != null)) {
                       KeyDown(this, kea) ;
                   } else if ((wParam == WM_KEYUP || wParam == WM_SYSKEYUP) && (KeyUp != null)) {
                       KeyUp(this, kea);
                   }
                   if (kea.Handled)
                       return 1;
               }
           }
           return CallNextHookEx(hhook, code, wParam, ref lParam);
       }
       
       #endregion
       
       #region DLL imports
       
       [DllImport("user32.dll")]
       static extern IntPtr SetWindowsHookEx(int idHook, keyboardHookProc callback, IntPtr hInstance, uint threadId);
       
       
       
       [DllImport("user32.dll")]
       static extern bool UnhookWindowsHookEx(IntPtr hInstance);
       
      
       
       [DllImport("user32.dll")]
       static extern int CallNextHookEx(IntPtr idHook, int nCode, int wParam, ref keyboardHookStruct lParam);
      
       
      
       [DllImport("kernel32.dll")]
       static extern IntPtr LoadLibrary(string lpFileName);
       
       #endregion
   }
}
Abgelegt unter Utilities, Globalhook, hook, klasse.

1 Kommentare zum Snippet

mb schrieb am 20.04.2016:
Hallo,

ich grundegenommen finde ich das Teil richtig klasse.

ABER: Man kann nicht unterscheiden, ob jemand ein Buchstabe oder Tab und gleichzeitig dabei Shift bedrückt hält. Im Object lParam geibt es zwar den Shift als true oder false, jedoch bleibt der IMMER false.

Gibt es dafür irgendwie Abhilfe ?

 

Logge dich ein, um hier zu kommentieren!