<---------键盘挂钩问题讨论----------->
以下是我写的一个禁止键盘的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;//没有传递消息下去。
}
问题点数:0、回复次数:24Top
1 楼rivershan(阿门)回复于 2004-04-04 14:35:57 得分 0
比较特殊吧,不清楚Top
2 楼SmileAndHappy(快乐男孩)回复于 2004-04-05 18:31:24 得分 0
不给分就没人来吗?Top
3 楼Lostinet(Hello)回复于 2004-04-07 10:58:50 得分 0
这个是有希望的。VirtualPC不就是钩了嘛。
Top
4 楼wlzqi(wlzqi)回复于 2004-04-07 18:04:08 得分 0
哈哈Top
5 楼_foo(莫依[双双朵朵])回复于 2004-04-07 18:19:13 得分 0
试试WH_KEYBOARD_LL HookTop
6 楼xstring(麻雀)回复于 2004-04-07 20:38:05 得分 0
看看以下这段程序
只要它运行着,就可以满足你的要求
/*
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;
};
Top
7 楼kugou123(酷狗)(彪悍的人生,不需要解释 www.xiaozhou.net)回复于 2004-04-08 21:15:40 得分 0
是不是WIN键只能用低级键盘钩子才能钩上啊?用普通的键盘钩子怎么不行?我试过用普通的键盘钩子对左边的WIN键挂钩,结果不成功。Top
8 楼lmfweng(心飞)回复于 2004-04-09 16:59:31 得分 0
我觉得这样做了,还是不能对ALT+CTRL+DEL使它挂起。Top
9 楼kuangjingbo(正在学习windows)回复于 2004-04-09 22:19:17 得分 0
WH_KEYBOARD
不可以钩系统键Top
10 楼kugou123(酷狗)(彪悍的人生,不需要解释 www.xiaozhou.net)回复于 2004-04-09 22:28:46 得分 0
那应该怎样实现啊?关注……Top
11 楼kuangjingbo(正在学习windows)回复于 2004-04-09 22:30:04 得分 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++试试看!!
所以我上面那么说Top
12 楼kuangjingbo(正在学习windows)回复于 2004-04-09 22:37:40 得分 0
可以用WH_GETMESSAGE钩子,然后判断消息的内容:
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: ... ;
}
内容自己根据要求填写吧!
Top
13 楼kugou123(酷狗)(彪悍的人生,不需要解释 www.xiaozhou.net)回复于 2004-04-14 10:35:13 得分 0
我试试看。Top
14 楼kugou123(酷狗)(彪悍的人生,不需要解释 www.xiaozhou.net)回复于 2004-04-16 10:47:58 得分 0
我查过MSDN,在WH_KEYBOARD_LL的说明中表示,该键盘低级钩子是可以钩住系统键的,一般的WH_KEYBOARD钩子则不行。Top
15 楼zhi_liu6(野战炮)回复于 2004-04-16 22:11:44 得分 0
要钩ctrl + alt + del只能打driver的主意Top
16 楼yafizyh(亚斐)回复于 2004-04-18 01:10:40 得分 0
键盘系统键可以被发现,但是按键引发的作用在键盘消息进入应用程序的消息队列前已经被处理了,所以禁止系统键靠钩子是不行的。Top
17 楼yifengling0(逸枫)回复于 2004-04-19 10:26:08 得分 0
WH_KEYBOARD_LL
这个可以钩到的。~~
以前写过一个把。。win键改成。esc键的程序。
在vc知识库有一个钩ctl+alt+del的程序。。看看那个
Top
18 楼ahao(天·狼·星星)回复于 2004-04-19 19:50:19 得分 0
那个不是用钩子,用的是gina.dllTop
19 楼lmfweng(心飞)回复于 2004-04-20 09:54:56 得分 0
那个我去看了一下,有些程序那上面要动态调用msgina.dll,但实际上不能调用,如它不调用那个文件,可以吗,如果要调用它,但因为它没有.lib导入文件。所以我觉得不能如那个vc学习的11章那上面所谈的那样,可以动态调用msgina.dll,请问这些问题可以如何解决。在线等。Top
20 楼ahao(天·狼·星星)回复于 2004-04-20 10:09:36 得分 0
你说的什么呀?Top
21 楼nf3()回复于 2004-04-26 23:07:36 得分 0
upTop
22 楼angelcool(快乐需要创造)回复于 2004-05-03 17:29:47 得分 0
mark
Top
23 楼lflch(巴格)回复于 2004-05-03 21:22:35 得分 0
mark
Top
24 楼lg13579(lg)回复于 2004-05-07 13:22:11 得分 0
hi!我想问你个问题,
我在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低级钩子?
ludayi2003@yahoo.com.cnTop




