110,539
社区成员
发帖
与我相关
我的任务
分享
HHOOK g_hKeyHook=NULL;
HWND g_hWnd=NULL;
LRESULT CALLBACK KeyboardProc(
int code, // hook code
WPARAM wParam, // virtual-key code
LPARAM lParam // keystroke-message information
)
{
if(VK_SPACE==wParam || VK_RETURN==wParam)//如果是空格键直接返回停止信息继续传递,否则继续传递
return 1;
else
return CallNextHookEx(g_hKeyboard,code,wParam,lParam);
return 1;
} /*传递回调方法名称*/
g_hKeyHook=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,NULL,GetCurrentThreadId());//写在初始化里
UnhookWindowsHookEx(g_hKeyHook);//用完钩子记得移除。
/// <summary>
/// 当前应用程序键盘钩子的回调函数
/// </summary>
/// <returns></returns>
/// <param name="nCode">当前状态</param>
/// <param name="wParam">消息信息</param>
/// <param name="lParam">消息信息</param>
private IntPtr LocalKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam)
/// Return Type: LRESULT->LONG_PTR->int
///code: int
///wParam: WPARAM->UINT_PTR->unsigned int
///lParam: LPARAM->LONG_PTR->int
[System.Runtime.InteropServices.UnmanagedFunctionPointerAttribute(System.Runtime.InteropServices.CallingConvention.StdCall)]
public delegate int HOOKPROC(int code, System.IntPtr wParam, System.IntPtr lParam);
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
public struct HHOOK__ {
/// int
public int unused;
}
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
public struct HINSTANCE__ {
/// int
public int unused;
}
public partial class NativeMethods {
/// Return Type: HHOOK->HHOOK__*
///idHook: int
///lpfn: HOOKPROC
///hmod: HINSTANCE->HINSTANCE__*
///dwThreadId: DWORD->unsigned int
[System.Runtime.InteropServices.DllImportAttribute("user32.dll", EntryPoint="SetWindowsHookExW")]
public static extern System.IntPtr SetWindowsHookExW(int idHook, HOOKPROC lpfn, [System.Runtime.InteropServices.InAttribute()] System.IntPtr hmod, uint dwThreadId) ;
}
/// <summary>
/// 创建一个钩子
/// </summary>
/// <param name="idHook">钩子的类型,表示对系统的哪个对象进行Hook</param>
/// <param name="lpfn">回调函数的地址</param>
/// <param name="hMod">实例句柄</param>
/// <param name="dwThreadId">当前线程ID</param>
/// <returns>钩子的ID,脱钩时需要用到,OOP的方式相当与返回一个对象</returns>
[DllImport("coredll.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr SetWindowsHookEx(int idHook, BackspaceKeyboardHook.HookProc lpfn, IntPtr hMod, uint dwThreadId);