delphi2007 教程

delphi2007 教程

首页 新随笔 联系 聚合 管理
  1013 Posts :: 0 Stories :: 28 Comments :: 0 Trackbacks
一个困扰我几天的问题 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061128134457154.html
郁闷啊!下面这段代码是dll中的键盘钩子的回调函数,想在这个回调函数中打开  
  dll中的窗体!但是现在连编译都过不了。  
   
   
   
  这是drhook   工程文件:  
   
  library   drHook;  
   
  {   Important   note   about   DLL   memory   management:   ShareMem   must   be   the  
      first   unit   in   your   library's   USES   clause   AND   your   project's   (select  
      Project-View   Source)   USES   clause   if   your   DLL   exports   any   procedures   or  
      functions   that   pass   strings   as   parameters   or   function   results.   This  
      applies   to   all   strings   passed   to   and   from   your   DLL--even   those   that  
      are   nested   in   records   and   classes.   ShareMem   is   the   interface   unit   to  
      the   BORLNDMM.DLL   shared   memory   manager,   which   must   be   deployed   along  
      with   your   DLL.   To   avoid   using   BORLNDMM.DLL,   pass   string   information  
      using   PChar   or   ShortString   parameters.   }  
   
  uses  
      SysUtils,  
      Classes,  
      Forms,  
      Unit2   in   'Unit2.pas',  
      Unit1   in   'Unit1.pas'   {Form1};  
   
   
  {$R   *.res}  
   
  exports  
      CreateKeyboardHook,  
      DestroyKeyboardHook;  
  begin  
      hNextHookProc   :=   0;  
      procSaveExit   :=   ExitProc;  
      ExitProc   :=   @KeyboardHookExit;  
  end.  
   
  这是dll中的键盘钩子:  
   
   
  unit   Unit2;  
   
  interface  
   
  uses  
      Windows,   SysUtils;  
  var  
      hNextHookProc:   HHook;  
      procSaveExit:   Pointer;  
   
  function   KeyboardHookProc(code:   Integer;   wparam:   WPARAM;  
      lparam:   LPARAM):   LRESULT   stdcall;   export;  
  function   CreateKeyboardHook:   BOOL;   stdcall;   export;  
  function   DestroyKeyboardHook:   BOOL;   stdcall;   export;  
  procedure   KeyboardHookExit;  
   
  implementation  
   
  var  
      GameSwitch:   Word;         //程序热键  
   
  function   KeyboardHookProc(code:   Integer;   wparam:   WPARAM;  
      lparam:   LPARAM):   LRESULT;  
  const  
      _KeyProcessMask   =   $80000000;  
  begin  
      Result   :=   0;  
      if   code   <   0   then  
      begin  
          Result   :=   Windows.CallNextHookEx(hNextHookProc,   code,   wparam,   lparam);  
          Exit;  
      end;  
      if   ((lparam   and   _KeyProcessMask)   =   0)   and   (wparam   =   GameSwitch)   then  
      begin  
          Application.Handle   :=   GetForegroundWindow;     //返回当前窗口句柄  
          Result   :=   1;  
      end;  
  end;  
   
  function   CreateKeyboardHook:   BOOL;  
  begin  
      Result   :=   false;  
      if   hNextHookProc   <>   0   then  
          exit;  
      hNextHookProc   :=   Windows.SetWindowsHookEx(WH_KEYBOARD,   @KeyboardHookProc,  
          hInstance,   0);  
      Result   :=   hNextHookProc   <>   0;  
  end;  
   
  function   DestroyKeyboardHook:   BOOL;  
  begin  
      if   hNextHookProc   <>   0   then  
      begin  
          Windows.UnhookWindowsHookEx(hNextHookProc);  
          hNextHookProc   :=   0;  
      end;  
      Result   :=   hNextHookProc   =   0;  
  end;  
   
  procedure   KeyboardHookExit;  
  begin  
      if   hNextHookProc   <>   0   then  
          DestroyKeyboardHook;  
      ExitProc   :=   procSaveExit;  
  end;  
   
  Initialization  
      GameSwitch   :=   VK_HOME;  
   
  end.  
   
  这是那个窗体文件,啥都没有,就一个空窗体,我就想让他显示。。。  
  困扰好久了。。。。比较菜  
   
  unit   Unit1;  
   
  interface  
   
  uses  
      Windows,   Messages,   SysUtils,   Variants,   Classes,   Graphics,   Controls,   Forms,  
      Dialogs;  
   
  type  
      TForm1   =   class(TForm)  
      private  
          {   Private   declarations   }  
      public  
          {   Public   declarations   }  
      end;  
   
   
   
   
  var  
      Form1:   TForm1;  
   
  implementation  
   
   
  {$R   *.dfm}  
   
   
  end.  
   
   
  希望那位大哥能指点指点,小弟先谢谢了。。。。  
 

uses  
      Windows,   SysUtils,   Forms;   //   add   Forms  
   
   
  Application声明在Forms单元中,难道你没有看帮助?

zswang(伴水清清)   谢谢你!  
   
  我知道这点,但是加上forms后   那个窗体就调不出来了。。。  
   
  好郁闷。。

posted on 2008-11-27 21:13 delphi2007 阅读(173) 评论(0)  编辑 收藏 引用
只有注册用户登录后才能发表评论。