[StructLayout(LayoutKind.Sequential)]
public class KBDLLHOOKSTRUCT
{
public uint vkCode;
public uint scanCode;
public KBDLLHOOKSTRUCTFlags flags;
public uint time;
public UIntPtr dwExtraInfo;
}
[Flags]
public enum KBDLLHOOKSTRUCTFlags : uint {
LLKHF_EXTENDED = 0x01,
LLKHF_INJECTED = 0x10,
LLKHF_ALTDOWN = 0x20,
LLKHF_UP = 0x80,
}
private static IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam)
{
if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
{
KBDLLHOOKSTRUCT kbd = (KBDLLHOOKSTRUCT) Marshal.PtrToStructure(lParam, typeof(KBDLLHOOKSTRUCT));
Debug.WriteLine(kbd.vkCode); // ***** your code here *****
}
return CallNextHookEx(_hookID, nCode, wParam, lParam);
}
<StructLayout(LayoutKind.Sequential)> _
Public Structure KBDLLHOOKSTRUCT
Public vkCode As UInt32
Public scanCode As UInt32
Public flags As KBDLLHOOKSTRUCTFlags
Public time As UInt32
Public dwExtraInfo As UIntPtr
End Structure
<Flags()> _
Public Enum KBDLLHOOKSTRUCTFlags As UInt32
LLKHF_EXTENDED = &H1
LLKHF_INJECTED = &H10
LLKHF_ALTDOWN = &H20
LLKHF_UP = &H80
End Enum
<StructLayout(LayoutKind.Sequential)> _
Public Class KBDLLHOOKSTRUCT
public vkCode As UInt32
public scanCode As UInt32
public flags As UInt32
public time As UInt32
public dwExtraInfo As UIntPtr
End Class
This is named "struct" to be consistent with the Windows API name, but it is defined as a class since it is passed as a pointer (AKA reference) in SetWindowsHookEx and CallNextHookEx. Or it can be defined as a struct and passed with ref (ByRef in VB.NET).
http://msdn.microsoft.com/en-us/library/windows/desktop/ms644967(v=vs.85).aspx