我的dll部分代码:
LRESULT __declspec(dllexport)__stdcall  CALLBACK KeyboardProc(
  int code,       // hook code
  WPARAM wParam,  // virtual-key code
  LPARAM lParam   // keystroke-message information
)
{
SendMessage(g_hWnd, WM_KEYHOOK, wParam, lParam);
return CallNextHookEx(g_hMyHook, code, wParam, lParam);
}long WINAPI BeginHook(HWND hWnd)
{

g_hinst = (HINSTANCE)::GetModuleHandle("KeyHook.dll");
g_hMyHook = ::SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)KeyboardProc, g_hinst, 0);
int i = ::GetLastError();
if(g_hMyHook != NULL)
{
g_hWnd = hWnd;
return 0;
}
else
{
g_hWnd = 0;
return 1;
}
}long WINAPI EndHook()
{
int iSuccess = 0;
iSuccess = ::UnhookWindowsHookEx(g_hMyHook);
if(iSuccess != 0)
{

return 0;
}
else
{
int i = ::GetLastError();
return 1;
}
}调用的exe的部分代码:
void CTestHookDlg::OnButton1() 
{
// TODO: Add your control notification handler code here
// HINSTANCE hLib = ::LoadLibrary("KeyHook.dll");
// PBEGINHOOK pBeginHook = (PBEGINHOOK)::GetProcAddress((HMODULE)hLib, "BeginHook");
// pBeginHook(this->m_hWnd); 
BeginHook(this->m_hWnd); 
}void CTestHookDlg::OnButton2() 
{
// TODO: Add your control notification handler code here
EndHook();
}LRESULT CTestHookDlg::MyWndProc(WPARAM wParam, LPARAM lParam)
{
::MessageBox(NULL, "a", "b", 0);
return 0;
}
问题是,我的钩子只对测试exe有效,在其他地方按键没任何反应,变成了局部钩子。
谁要是能帮我解决这个问题,我给他一元真钱:D:D:D:D:D

解决方案 »

  1.   

    参考:http://www.vckbase.com/document/viewdoc/?id=263
      

  2.   

    用WH_KEYBOARD_LL创建全局键盘钩子
      

  3.   

    以前碰到过,估计是dll中的全局变量要初始化,不知道你这次的原因了。
      

  4.   

    搞笑啊,我想做线程钩子但怎么写都是全局的,你倒好正好反过来,把第三个参数换theApp.m_hInstance试试
      

  5.   

    真是头疼啊 不知道用WH_KEYBOARD_LL来创建行不行 只是勾键盘消息的
      

  6.   

    g_hinst应该是在DllMain中DllAttach的时候从参数里取的。
    你这样试试,要是好用,记得给我一元真钱。
      

  7.   

    全局钩子都需要做成DLL,DLL是不能直接启动的,需要一个exe文件来调用
      

  8.   

    你的HWND g_hWnd声明的时候应该放在一个共享结里面
    在你的代码前加上#pragma data_seg("MySec")
    HWND g_hWnd=NULL;
    #pragma data_seg()#pragma comment(linker,"/section:MySec,RWS")祝你成功!!
      

  9.   

    或者把你的代码发给我,看我是否能改过来
    [email protected]
      

  10.   

    同意楼上的,看看能不能解决
    g_hWnd应该能在进程间共享,否则在其他进程中无法给你的exe窗口发送消息。
      

  11.   

    也许g_hWnd有问题,把g_hWnd的声明,初始化部分贴出来看看先
      

  12.   

    解决了,没想到是因为我年纪大了,忘了在def文件里改section的说明了,特向大家道个歉,欢迎大家鄙视我。toidAnts(你才无聊呢),你来杭州时联系我,我给钱,哈哈。msn:[email protected]