前两天提问的键盘钩子问题还没有解决,现在问题更加明确的,但奇怪的让我摸不到头脑.请看如下代码:
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
unsigned int scanCode = lParam;
BYTE keyStateArr[256] = {0};
WORD word = 0;
char ch = 'p';
FILE *fp = NULL; if( nCode >= 0 )
{
if(!(lParam & 0x80000000))//如果键正被按下
{
GetKeyboardState(keyStateArr);
ToAscii(wParam, scanCode, keyStateArr, &word, 0);
ch = (char) word;
fp = fopen("liran.txt", "a+");
fwrite(&ch, sizeof(ch), 1, fp);
fclose(fp);
}
}
return 1;
}
请注意红色部分的代码,是跟踪记录按键的信息。
请注意黄色的return 1,是屏蔽按键向主窗口发送的消息。
当我执行了这段程序后,键盘确实被屏蔽了。说明当按键盘的时候确实执行了该函数。
但奇怪的问题出现了。注意中间红色的代码, 这段代码只有在,运行这个DLL程序的VC窗口下,按下键盘才能执行。而在其他的窗口下不会去执行。
也就是说在其他的窗口下按下键盘,它执行了KeyboardProc这个函数却自动的跳过了红色的代码,return 1;了。
难道是因为
GetKeyboardState(keyStateArr);
ToAscii(wParam, scanCode, keyStateArr, &word, 0);
fopen("liran.txt", "a+");
fwrite(&ch, sizeof(ch), 1, fp);
fclose(fp);
这几个函数只存放在执行hookDLL的主程序的虚拟地址中。
而其他的进程看不到这几个函数????????
请高手帮我分析一下吧,我已经尽力了。
先感谢一下。
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
unsigned int scanCode = lParam;
BYTE keyStateArr[256] = {0};
WORD word = 0;
char ch = 'p';
FILE *fp = NULL; if( nCode >= 0 )
{
if(!(lParam & 0x80000000))//如果键正被按下
{
GetKeyboardState(keyStateArr);
ToAscii(wParam, scanCode, keyStateArr, &word, 0);
ch = (char) word;
fp = fopen("liran.txt", "a+");
fwrite(&ch, sizeof(ch), 1, fp);
fclose(fp);
}
}
return 1;
}
请注意红色部分的代码,是跟踪记录按键的信息。
请注意黄色的return 1,是屏蔽按键向主窗口发送的消息。
当我执行了这段程序后,键盘确实被屏蔽了。说明当按键盘的时候确实执行了该函数。
但奇怪的问题出现了。注意中间红色的代码, 这段代码只有在,运行这个DLL程序的VC窗口下,按下键盘才能执行。而在其他的窗口下不会去执行。
也就是说在其他的窗口下按下键盘,它执行了KeyboardProc这个函数却自动的跳过了红色的代码,return 1;了。
难道是因为
GetKeyboardState(keyStateArr);
ToAscii(wParam, scanCode, keyStateArr, &word, 0);
fopen("liran.txt", "a+");
fwrite(&ch, sizeof(ch), 1, fp);
fclose(fp);
这几个函数只存放在执行hookDLL的主程序的虚拟地址中。
而其他的进程看不到这几个函数????????
请高手帮我分析一下吧,我已经尽力了。
先感谢一下。
另外你需要知道,在VC中调试DLL是单进程的,其它进程中执行DLL中的代码VC是不会有反应的,你可以根据liran.txt中的记录来看。
你把就的别的程序切换为前台窗口时,系统又分配一个DLL页面给这个前台程序.你的记录文件liran.txt被运行这个DLL程序的VC窗口
的DLL页面占用,所以文件记录不到其他的窗口.我也不知道上面我说的对不对.
你改一下程序试试就知道,先定义全局变量
TCHAR reco[255];
static int i=0;
上面为全局变量if(!(lParam & 0x80000000))//如果键正被按下
{
reco[i]=(TCHAR)wParam;
i++;
}
你再把reco显示出来看,你会发现不同的进程有独立的不同的记录