我是一个才学习delphi的小菜鸟,最近我想编写一个游戏辅助的小程序,想加入这个功能:在游戏中按下小键盘的“*”键,就可以把小程序呼出到当前窗口(就像金山游侠那样),请问该怎样实现?
我到处碰了钉子才到这里来的,没人愿意回答也是我意料当中的事,不过谁不是从菜鸟开始学的啊?
能有人来看看这个帖子,我已经很感激了,谢谢。

解决方案 »

  1.   

    procedure WMHotkeyHandle(var Msg:TMessage);message WM_HOTKEY; //响应敏感键按键消息var
      HotkeyId: THandle;procedure TForm1.WMHotkeyHandle(var Msg:TMessage);
    begin
      if (Msg.LParamHi=$41) and (msg.lparamLo=MOD_CONTROL or mod_Alt) then
        begin
          Msg.Result:=1; //该消息已经处理
          ShowMessage('');
        end;
    end;procedure TForm1.BitBtn1Click(Sender: TObject);
    begin
    //建立热键
      HotkeyId:=GlobalAddAtom(Pchar('UserDefineHotKey'))-$C000; //减去$C000是为了保证取值范围的限制
      RegisterHotkey(Handle,Hotkeyid,MOD_CONTROL or MOD_Alt, $41);//敏感键为ctrl+Alt+A
    end;procedure TForm1.BitBtn2Click(Sender: TObject);
    begin
    //释放热键
      UnRegisterhotkey(Handle,HotkeyId);
      DeleteAtom(HotKeyID);
    end;
      

  2.   

    转一个超级猛料上面的文章:在WINDOWS系统下,应用程序常常要截获其他程序的消息,并加以处理(例如跟踪键盘或鼠标的按键状况等)。现在,我们假设在前台进行正常操作,在后台利用HOOK程序为系统安装一个键盘挂钩,当有按键操作时,系统发给键盘挂钩对应的消息,而这些消息被HOOK程序截获,并加以相应的处理,这样就可以监视键盘的使用状况了。    一.实现方法  DELPHI提供了强大的可视化集成开发环境,它使得在Windows下的应用程序开发变得更加广泛,因此我们将用DELPHI编写一个动态链接库,然后在主程序中加以调用以实现系统挂钩的设置。具体步骤如下:  * 用DELPHI创建一个使用键盘挂钩的动态链接库HK.DLL  * 用DELPHI编写一个使用上述DLL的可执行文件HOOK.EXE  二.实现步骤  1.创建动态链接库  * 选择FILE菜单中的NEW选项,选择DLL产生一个新的模板,保存为HK.DPR  library HK .  uses   SysUtils,   Classes,   hkproc in 'hkproc.pas'; //挂钩函数在文件中的定义   exports //DLL的输出函数   EnableHotKeyHook,   DisableHotKeyHook;    begin   hNextHookProc :=0;   Assign(f,'c:.txt');//将捕获的键值存入C盘的“code.txt”文件中   Reset(f); //初始化“code.txt”文件   procSaveExit := ExitProc; //DLL释放时解除挂钩   ExitProc := @HotKeyHookExit;  end.  * 选择FILE菜单中的NEW选项,选择UNIT生成HKPROC.PAS  unit hkproc;  interface  uses   Windows,Messages;  var   f :file of char;  c:char;  i :integer;  j :integer;   hNextHookProc : HHook;   procSaveExit : Pointer;  function KeyboardHookHandler(iCode : Integer;   wParam : WPARAM;   lParam : LPARAM) : LRESULT; stdcall ; export;  function EnableHotKeyHook : BOOL ; export ;  function DisableHotKeyHook : BOOL; export ;  procedure HotKeyHookExit ; far ;  implementation  function KeyboardHookHandler(iCode : Integer;   WParam : WPARAM;   lParam : LPARAM) : LRESULT ;stdcall ; export;  const   _KeyPressMask = $80000000 ;  begin   Result :=0;   if iCode <0 then   begin   Result :=CallNextHookEx(hNextHookProc,iCode,   wParam,lParam);   Exit;   end;   if((lParam and _KeyPressMask)=0) then   begin   i:=getkeystate($10); //返回Shift键的状态   j:=getkeystate($14); //返回Caps Lock键的状态   if((j and 1)=1 )then //判断CapsLock是否按下   begin   //判断Shift 是否按下   if ((i and _KeyPressMask)=_KeyPressMask) then   begin   if (wparam<65) then //判断是字母键还是数字键   begin   c:=chr(wparam-16);   end   else   begin   c:= chr(wparam+32);   end;   end   else   begin   if (wparam<65) then   begin   c:=chr(wparam);   end   else   begin   c:=chr(wparam);   end;   end;   end   else   begin   if ((i and _KeyPressMask)=_KeyPressMask) then   begin   if (wparam<65) then   begin   c:=chr(wparam-16);   end   else   begin   c:= chr(wparam);   end;   end   else   begin   if (wparam<65) then   begin   c:=chr(wparam);   end   else   begin   c:=chr(wparam+32);   end;   end;   end;   seek(f,FileSize(f));   write(f,c); //将捕获的键码存入文件   end;  end;    function EnableHotKeyHook:BOOL;export;  begin  Result:=False;  if hNextHookProc <> 0 then exit;  hNextHookProc:=SetWindowsHookEx(WH_KEYBOARD,  KeyboardHookHandler,Hinstance,0);  Result:=hNextHookProc <>0 ;  end;    function DisableHotKeyHook:BOOL; export;  begin   if hNextHookPRoc <> 0 then   begin   UnhookWindowshookEx(hNextHookProc);   hNextHookProc:=0;   Messagebeep(0);   Messagebeep(0);     end;   Result:=hNextHookPRoc=0;  end;    procedure HotKeyHookExit;  begin   if hNextHookProc <> 0 then DisableHotKeyHook;   close(f); //关闭文件并自动解除挂钩   ExitProc:=procSaveExit;  end;  end.  * 将程序编译后生成一个名为HK.DLL的动态链接库文件并存入“c:”目录下。     2.创建调用DLL的EXE程序HOOK.EXE  * 选择FILE菜单中的NEW选项,在New Items窗口中,选择Application选项。在窗体Form中,加入两个按键,一个定义为挂钩,另一个定义为解脱,同时加入一个文本框以提示挂钩的设置状况。将Unit1存为“c:.pas”,其相应的代码如下:  
      

  3.   

    procedure FormCreate(Sender: TObject);procedure sethook1Click(Sender: TObject);procedure endhook1Click(Sender: TObject);procedure FormDestroy(Sender: TObject);procedure Close1Click(Sender: TObject);private{ Private declarations }nid:tnotifyicondata;normalicon:ticon;public{ Public declarations }procedure icontray(var msg:tmessage);message mi_iconevent;end;varForm1: TForm1;implementation{$R *.DFM}function setkeyhook:bool;external 'keyspy.dll';function endkeyhook:bool;external 'keyspy.dll';procedure tform1.icontray(var msg:tmessage);varpt:tpoint;beginif msg.lparam=wm_lbuttondown thensethook1click(self);if msg.LParam=wm_rbuttondown thenbegingetcursorpos(pt);setforegroundwindow(handle);popupmenu1.popup(pt.x,pt.y);end;end;procedure TForm1.FormCreate(Sender: TObject);beginnormalicon:=ticon.create;application.title:=caption;nid.cbsize:=sizeof(nid);nid.wnd:=handle;nid.uid:=icon_id;nid.uflags:=nif_icon or nif_message or nif_tip;nid.ucallbackmessage:=mi_iconevent;nid.hIcon :=normalicon.handle;strcopy(nid.sztip,pchar(caption));nid.uFlags:=nif_message or nif_icon or nif_tip;shell_notifyicon(nim_add,@nid);SetWindowLong(Application.Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW);end;procedure TForm1.sethook1Click(Sender: TObject);beginsetkeyhook;end;procedure TForm1.endhook1Click(Sender: TObject);beginendkeyhook;end;procedure TForm1.FormDestroy(Sender: TObject);beginnid.uFlags :=0;shell_notifyicon(nim_delete,@nid);end;procedure TForm1.Close1Click(Sender: TObject);beginapplication.terminate;end;该程序虽然只用了几个shellai函数,但是它涉及到了在Delphi中对DLL的引用、钩子实现、对指示区的操作、用户定义消息的处理、文件的读写等比较重要的内容,我相信这篇文章能对许多Delphi的初学者有所帮助。