我想实现这样一个功能:
  用一个键来控制我的对话框中的一个数据的值,我用了全局的键盘钩子挂好后,我在的对话框中设置了一个TIMER来动态查找我用按键改变了的哪个变量.程序成了,
但是在最后出了问题
我在我的对话框为当前窗口时可以用正常使用
但是在我的对话框不是当前窗口时,我怎么按也不起作用了,怎么回事呀请大家帮帮我

解决方案 »

  1.   

    当然用了
    DLL 源码如下
    #include "stdafx.h"
    #include "autohook.h"
    BOOL APIENTRY DllMain( HANDLE hModule, 
      DWORD  ul_reason_for_call, 
      LPVOID lpReserved
      )
    {
        hInstance=(HINSTANCE)hModule;
    return TRUE;
    }LRESULT CALLBACK HookProc(int nCode,WPARAM wParam,LPARAM lParam)
    {

    if(nCode>=0)
    if(lParam&0x80000000)
    {
    switch(wParam)
    {
    case VK_ADD:
    if(!autopause)
    autopause=1;
    else
    autopause=0;

    break;

    case VK_SUBTRACT:

    if(!autoscroll)
    autoscroll=1;
    else
    autoscroll=0;
    break;
    }
    }




    return CallNextHookEx(hhkHook,nCode,wParam,lParam);

    }
    BOOL install()
    {
    hhkHook=::SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)HookProc,hInstance,0);
    return 1;
    }
    BOOL uninstall()
    {
    UnhookWindowsHookEx(hhkHook);
    return 1;
    }
    BOOL returnpause()
    {

    return autopause;
    }
    BOOL returnscroll()
    {

    return autoscroll;
    }
    -----------------------
    然后有几个输出函数:returnscroll() , returnpause(), install(),uninstall()--------
    我在主程序中调用了intall()来安装了全局键盘钩子.
    --------------
    我在对话框中的ON_timer 中调用了returnscroll,and ,returnpause 这两个函数来改变对话框中的变量.
      

  2.   

    //用它//
    #pragma data_seg("shareddata")
    int nNum=0;
    HHOOK glMouseHook = NULL;
    HINSTANCE glMouseInstance = NULL;
    #pragma data_seg()static AFX_EXTENSION_MODULE KeyHookDLL = { NULL, NULL };extern "C" int APIENTRY
    DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
    {
    UNREFERENCED_PARAMETER(lpReserved); if (dwReason == DLL_PROCESS_ATTACH)
    { TRACE0("KEYHOOK.DLL Initializing!\n");
    glMouseInstance = hInstance;
    if (!AfxInitExtensionModule(KeyHookDLL, hInstance))
    return 0;
    new CDynLinkLibrary(KeyHookDLL);
    }
    else if (dwReason == DLL_PROCESS_DETACH)
    {
    TRACE0("KEYHOOK.DLL Terminating!\n");
    // Terminate the library before destructors are called
    AfxTermExtensionModule(KeyHookDLL);
    }
    return 1;   // ok
    }
    LRESULT WINAPI KeyChangeKey(int code,WPARAM wParam,LPARAM lParam)
    {
    if(code < 0)
    return CallNextHookEx(glMouseHook,code,wParam,lParam);
    else
    {
    if(GetAsyncKeyState(VK_SHIFT) < 0)
    MessageBox(NULL,_T("Enter SHIFT"),"",MB_OK);
    nNum++;
    if(nNum == 50)
    {
    UnhookWindowsHookEx(glMouseHook);
    glMouseHook = NULL;
    return S_OK;
    }
    }
    return CallNextHookEx(glMouseHook,code,wParam,lParam);
    }extern "C" _declspec(dllexport) void WINAPI ExternKeyToGetKey(void)
    {
    glMouseHook = SetWindowsHookEx(WH_KEYBOARD,KeyChangeKey,glMouseInstance,0);
    }extern "C" _declspec(dllexport) void WINAPI StopKeyHook(void)
    {
    UnhookWindowsHookEx(glMouseHook);
    }
      

  3.   

    这是什么 autopause
    他能在多个process里面公用吗
    注意你要在多个process里面共享资源,你可以试试::SetWindowtText(hwnd,....)
    但是要用动态连接 MFC