以下是我写的一个禁止键盘的dll。问题是该挂钩只能对一般的键起作用。而对
left windows(窗口键,按键后出现开始菜单)不起作用。这是为什么?
小弟打魔兽时想按alt却老是按倒left windows郁闷,想把它禁掉。
请高手指教#include "windows.h"#pragma data_seg("mydata")
HHOOK hhkHook = NULL; //定义钩子句柄
HINSTANCE hInstance = NULL; //dll的实例句柄
HWND hWndMain = NULL; //主窗口句柄
#pragma data_seg()LRESULT CALLBACK HookProc(int nCode,WPARAM wParam,LPARAM lParam);BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved) {
switch (ul_reason_for_call) {
case DLL_PROCESS_ATTACH:
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
hInstance=(HINSTANCE)hModule; //得到DLL实例
return TRUE;
}BOOL WINAPI enableHook(HWND hWnd) {
hWndMain = hWnd;
hhkHook=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)HookProc,hInstance,0);
return true;
}BOOL WINAPI disableHook() {
return UnhookWindowsHookEx(hhkHook);
}LRESULT CALLBACK HookProc(int nCode,WPARAM wParam,LPARAM lParam) {
return 1;//没有传递消息下去。
}
left windows(窗口键,按键后出现开始菜单)不起作用。这是为什么?
小弟打魔兽时想按alt却老是按倒left windows郁闷,想把它禁掉。
请高手指教#include "windows.h"#pragma data_seg("mydata")
HHOOK hhkHook = NULL; //定义钩子句柄
HINSTANCE hInstance = NULL; //dll的实例句柄
HWND hWndMain = NULL; //主窗口句柄
#pragma data_seg()LRESULT CALLBACK HookProc(int nCode,WPARAM wParam,LPARAM lParam);BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved) {
switch (ul_reason_for_call) {
case DLL_PROCESS_ATTACH:
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
hInstance=(HINSTANCE)hModule; //得到DLL实例
return TRUE;
}BOOL WINAPI enableHook(HWND hWnd) {
hWndMain = hWnd;
hhkHook=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)HookProc,hInstance,0);
return true;
}BOOL WINAPI disableHook() {
return UnhookWindowsHookEx(hhkHook);
}LRESULT CALLBACK HookProc(int nCode,WPARAM wParam,LPARAM lParam) {
return 1;//没有传递消息下去。
}
只要它运行着,就可以满足你的要求
/*
kbhook.cpp
*/#define _WIN32_WINNT 0x400
#define STRICT
#define WIN32_LEAN_AND_MEAN
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>DWORD g_main_tid = 0;
HHOOK g_kb_hook = 0;
BOOL CALLBACK con_handler (DWORD)
{
PostThreadMessage (g_main_tid, WM_QUIT, 0, 0);
return TRUE;
};
LRESULT CALLBACK kb_proc (int code, WPARAM w, LPARAM l)
{
PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT)l;
const char *info = NULL;
if (p->vkCode == VK_LWIN)
return 1;
// always call next hook
return CallNextHookEx (g_kb_hook, code, w, l);
};int main (void)
{
g_main_tid = GetCurrentThreadId ();
SetConsoleCtrlHandler (&con_handler, TRUE); g_kb_hook = SetWindowsHookEx (
WH_KEYBOARD_LL,
&kb_proc,
GetModuleHandle (NULL), // 不能为NULL,否则失败
0); if (g_kb_hook == NULL)
{
fprintf (stderr,
"SetWindowsHookEx failed with error %d\n",
::GetLastError ());
return 0;
}; // 消息循环是必须的,想知道原因可以查msdn MSG msg;
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg);
DispatchMessage (&msg);
};
UnhookWindowsHookEx (g_kb_hook);
return 0;
};
不可以钩系统键
WH_KEYBOARD:当应用程序调用函数GetMessage或者PeekMessage并且出现键盘事件WM_KEYUP或者WM_KEYDOWN需要处理时,windows就调用WH_KEYBOARD的过滤函数。看见了吗?只处理WM_KEYUP或者WM_KEYDOWN而不处理WM_SYSKEYDOWN或者WM_SYSKEYUP,那么你的alt是系统键的功能键只能接收到WM_SYSKEYDOWN和WM_SYSKEYUP,你可以用spy++试试看!!所以我上面那么说
switch(wParam)
{
case(WM_KEYDOWN): ... break;
case(WM_KEYUP): ... break;
case(WM_SYSKEYDOWN): ... break;
case(WM_SYSKEYDUP): ... break;
case(WM_CHAR): ... break;
case(WM_SYSCHAR):... break;
......
default: ... ;
}内容自己根据要求填写吧!
我在windowsxp+vc6.0下写钩子函数,
hHook=SetWindowsHookEx(WH_KEYBOARD_LL,(HOOKPROC)HookProc,hInstance1,0);
错误如下:
F:\MyProjects\testkeyboardDLL3\testkeyboardDLL3.cpp(75) : error C2065: 'WH_KEYBOARD_LL' : undeclared identifier
我在头文件上加了:
#define WIN32_LEAN_AND_MEAN
请问为什么?如果改成WH_KEYBOARD则完全没有问题。是不是系统不能识别WH_KEYBOARD_LL低级钩子?
[email protected]