[StructLayout(LayoutKind.Sequential)]
public class KBDLLHOOKSTRUCT
{
public UInt32 vkCode;
public UInt32 scanCode;
public UInt32 flags;
public UInt32 time;
public IntPtr dwExtraInfo;
}
[Flags()]
public enum KBDLLHOOKSTRUCTFlags : int {
LLKHF_EXTENDED = 0x01,
LLKHF_INJECTED = 0x10,
LLKHF_ALTDOWN = 0x20,
LLKHF_UP = 0x80,
}
<StructLayout(LayoutKind.Sequential)> _
Public Structure KBDLLHOOKSTRUCT
Public vkCode As Integer
Public scanCode As Integer
Public flags As KBDLLHOOKSTRUCTFlags
Public time As Integer
Public dwExtraInfo As IntPtr
End Structure
<Flags()> _
Public Enum KBDLLHOOKSTRUCTFlags As Integer
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 IntPtr
End Class
This is named "struct" to be consistent with the Windows API name, but it must be a class since it is passed as a pointer (AKA reference) in in SetWindowsHookEx and CallNextHookEx.