我想做一个功能,有点象 笔记本电脑的调节屏幕高度的时候,弹出那个提示窗口我做了个dll的keyboard hook,dll里面添加了一个CDialog类,
 dll项目是向导创建的 相关代码
DllExport void WINAPI Install()
{
Hook=(HHOOK)SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)LauncherHook,theApp.m_hInstance,0);
}DllExport void WINAPI UnInstall()
{
::SendMessageW(test.m_hWnd,WM_CLOSE,0,0);
UnhookWindowsHookEx(Hook);
}//显示CDialog的代码extern "C" __declspec(dllexport) void Show() //order 0 gte mute 1 get vlame
 {
 AFX_MANAGE_STATE(AfxGetStaticModuleState());
 if(!test.create) 
 {
 test.Create(IDD_DIALOG1);
 test.ShowWindow(SW_SHOWNOACTIVATE);
 }
 else
 {
 test.ShowWindow(SW_SHOWNOACTIVATE);
 } }
//dll是在mfc程序里面调用的在mfc的initDialog里面 调用 
Install();在mfc退出时调用了 
UnInstall();
功能基本实现,但是有个问题,大概是这样的当当前窗口是这个mfc程序时,按键,dialog窗口显示出来,然后几秒后隐藏,再次按键时显示出来,又消失,这样重复嘛
只要每次按键时当前窗口是mfc,mfc程序退出就没问题
但是当有一次按键,当前窗口不是这个mfc时,比如是某个游戏,退出游戏时,游戏会报错,当前窗口是资源管理器时,退出mfc ,mfc会报错,然后资源管理器就出错请达人指教~~

解决方案 »

  1.   

    Hook=(HHOOK)SetWindowsHookEx(WH_KEYBOARD_LL,(HOOKPROC)LauncherHook,theApp.m_hInstance,0);下低级钩
      

  2.   


    我照你的寫的,改了代碼,當我按下 F6鍵時,程序無響應
    但是我改回去,就ok,是不是我的代碼有錯誤?我的LauncherHook代碼如下LRESULT CALLBACK LauncherHook(int nCode,WPARAM wParam,LPARAM lParam)
    {
    LRESULT Result=CallNextHookEx(Hook,nCode,wParam,lParam);
    if(nCode==HC_ACTION)
    {
    if(true|(lParam & 0x80000000))
    {
    switch(wParam)
    {
    case VK_F6 :
    Show();
    break;
                                    .......
    }
    } }
    return Result;
    }
      

  3.   

    LauncherHook中
    return CallNextHookEx(Hook,code,wParam,lParam);
    试试
      

  4.   


    WH_KEYBOARD_LL这个貌似在NT中才能用
      

  5.   

    NT支持难道基于NT的系统就不支持?我在XP和Vista下都用过
      

  6.   


    試過了,剛才上面我說反應,是我程序在處理消息時,處理錯誤應該是這樣
    LRESULT CALLBACK LauncherHook(int nCode,WPARAM wParam,LPARAM lParam)
    {
    LRESULT Result=CallNextHookEx(Hook,nCode,wParam,lParam);
    if(nCode==HC_ACTION)
    {
    LPKBDLLHOOKSTRUCT p =(LPKBDLLHOOKSTRUCT)lParam;
    if(true|(lParam & 0x80000000)&&(p->flags&0x80))
    {
    switch(p->vkCode)
    {
    case VK_F6 : //VK_VOLUME_DOWN :
                                    Show(0);
    break;
                              .........
    }
    } }
    return Result;
    }
    這樣會好一點點,至少退出時,會出現中斷,不會直接讓 vstdio 重啟,但是報錯的問題還是在~