DLL中的主代码如下:
function KeyboardHookHandler(iCode: Integer;wParam:
 WPARAM; lParam: LPARAM): LRESULT;stdcall;export;
 const _KeyPressMask=$80000000;
//var
 //f:textfile;
 //temp:string;
begin
 result:=0;
 if iCode<0 then
   Result:=CallNextHookEx(hHook,iCode,wParam,lParam);
//侦测Ctrl+Alt+F12组合键
 if ((lParam and _KeyPressMask)=0)
    and (GetKeyState(vk_Control)<0)
    and (getKeyState(vk_menu)<0) and (wParam=vk_F12) then
    begin
     if HideHook then
      begin
       showmessage('HideHook:true;显示');
       showWindow(hbefore,SW_SHOW);
       hideHook:=false;
      end
     else
      begin
       showmessage('HideHook:false;隐藏');
       showWindow(hbefore,SW_HIDE);
       hideHook:=true;
      end
    end;
end;
//-这里hbefore是由调用程序传过来的,程序窗口句柄。
function EnableHideHook(hFrmHandle:longint):BOOL; export;
begin
 Result:=false;
 if hHook<>0 then
   exit;//已经有一个HOOK存在
 hHook:=SetWindowsHookEx(WH_KEYBOARD,KeyboardHookHandler,HInstance,0);
 hbefore:=hFrmHandle;
 Result:=hHook<>0;
end;
=====================
//调用程序代码
procedure THideForm.Button1Click(Sender: TObject);
begin
  if EnableHideHook(HideForm.Handle) then
   showMessage('HotKy Testing...');
end;
=====================
现在问题是,只有调用程序为当前窗口,才能正常显示/隐藏该窗口,否则发送的showMessage(),就没有用处。
请大家帮忙解决。

解决方案 »

  1.   

    实现钩子的dll对于每个被注入的进程都有一个独立的映射,也就是说每个进程中的钩子都是相对独立的。在注册钩子时传入的hbefore不会被所有的钩子共享,所以会出现这个问题。
    解决可以有不同的途径:
    1.不传入handle,而是在钩子中通过FindWindow得到需要操作窗口的handle
    2.传入handle,开辟一块进程间共享的内存保存该值
    3.只是想给自己的开发的软件增加一些快捷健功能的话,那不必用钩子来实现这样的功能,在程序里面使用GetKeyState就可以了,不用写dll,只是需要放在一个定时器里面。
      

  2.   

    hahafan(注意!此人前途迷茫)正解,以楼主的代码来说直接在主程序RegisterHotKey就可以了,没必要用钩子
      

  3.   

    用RegisterHotKey在Win98下运行游戏时有时好像不能响应,在XP下倒是可以,我以前就遇到过这种情。
    不知道直接用GetKeyState是否可以,做个死循环不停地Getkeystate,不知能否在游戏状态下也能用,现在没机会测试,搂主可以试试看