前两天提问的键盘钩子问题还没有解决,现在问题更加明确的,但奇怪的让我摸不到头脑.请看如下代码: 
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的主程序的虚拟地址中。
而其他的进程看不到这几个函数????????
请高手帮我分析一下吧,我已经尽力了。
先感谢一下。  

解决方案 »

  1.   

    SetWindowsHookEx的时候最后参数给0。
    另外你需要知道,在VC中调试DLL是单进程的,其它进程中执行DLL中的代码VC是不会有反应的,你可以根据liran.txt中的记录来看。
      

  2.   

    >>注意中间红色的代码, 这段代码只有在,运行这个DLL程序的VC窗口下,按下键盘才能执行。而在其他的窗口下不会去执行。 说明你安装备的应该是全局钩子吧出现这样的问题可能是因为DLL的页面分配问题引起的,系统给运行这个DLL程序的VC窗口先分配一个页面,执行了红色代码.
    你把就的别的程序切换为前台窗口时,系统又分配一个DLL页面给这个前台程序.你的记录文件liran.txt被运行这个DLL程序的VC窗口
    的DLL页面占用,所以文件记录不到其他的窗口.我也不知道上面我说的对不对.
    你改一下程序试试就知道,先定义全局变量
    TCHAR reco[255];
    static int i=0;
    上面为全局变量if(!(lParam & 0x80000000))//如果键正被按下  
    {  
    reco[i]=(TCHAR)wParam;
    i++;
    }   
    你再把reco显示出来看,你会发现不同的进程有独立的不同的记录