在线等待 30分 Delphi7.0中  窗体隐藏后 怎么用热键呼出

解决方案 »

  1.   

    通过设置热键来实现,楼上说的我不是太清楚,不过下面的代码段或许对你有帮助。
    里面有很多没用的, 这是我以前做的一个程序,你可以看一下。
    unit frmmain;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Menus, DB, ADODB, ImgList, ComCtrls, ToolWin, ActnList, Buttons,
      StdCtrls, ExtCtrls, DBCtrls, Grids, DBGrids, XhTray,Qt,Clipbrd,Inifiles;type
      Tmainform = class(TForm)
        MainMenu1: TMainMenu;
        ......
      private
        { Private declarations }
        procedure WndProc(var Message: TMessage); override;
      public
        { Public declarations }
        function GetClassCode(ACodeName:string):string;
      end;var
      mainform: Tmainform;
      PQueryStr,PQueryWhere : string;
      HotKey_A: Integer;
      AFontStyle : array [0..15] of TFontStyles;
    implementationuses dmMain, frmAppendTxt;{$R *.dfm}procedure Tmainform.loginExecute(Sender: TObject);
    begin
    //调用登录窗体
    ......
    end;procedure Tmainform.logoutExecute(Sender: TObject);
    begin
    ......
    end;
    function Tmainform.GetClassCode(ACodeName: string): string;
    var AResulttxt,Atxt : string;
      i,j,Aleng : Integer;
      IfTxt : Boolean;
    begin
      Aleng := Length(ACodeName);
      AResulttxt := '';
      IfTxt := False;
      for i :=1 to Aleng do
      begin
        Atxt := copy(ACodeName,i,1);
        if IfTxt then
          AResulttxt := AResulttxt+Atxt;
        if Atxt = '(' then
          IfTxt := True
        else if Atxt = ')' then
        begin
          IfTxt := False;
          Break;
        end;
      end;
      AResulttxt := copy(AResulttxt,1,Length(AResulttxt)-1);
      Result := AResulttxt;
    end;
    procedure Tmainform.FormCreate(Sender: TObject);
    begin
        hotkey_A :=GlobalAddAtom('hotkey1')-$C000;
        if not RegisterHotKey(handle, HotKey_A, mod_alt or MOD_CONTROL,key_z) then //F1
        begin
          Application.MessageBox('注册快捷键失败!','系统提示',MB_OK+MB_ICONSTOP);
        end;
    end;procedure Tmainform.WndProc(var Message: TMessage);
    begin
      inherited;
      if (Message.LParamHi=key_z) and (Message.LParamLo=mod_alt or MOD_CONTROL) then
      begin
        //在用户按下全局快捷键CTRL+ALT+Z后,实现录入新的文档功能
        //本段代码从剪切板自动获得文本信息添加到程序中文本的位置
        if not AppendTxtForm.Visible then 
        if Clipboard.HasFormat(CF_TEXT) then
        begin
          MainDm.ADOQuery2.Append;
          MainDM.ADOQuery2.FieldByName('TXT_TEXT').Value := Clipboard.AsText;
          MainDM.ADOQuery2.FieldByName('txt_Name').Value := Trim(AppendTxtForm.DBMemo1.Lines.Strings[0]);
          MainDM.ADOQuery2.FieldByName('txt_Caption').Value := Trim(AppendTxtForm.DBMemo1.Lines.Strings[0]);
          AppendTxtForm.Caption :='添加文档';
          if AppendTxtForm.ShowModal=mrOK then
          begin
            try
              MainDM.ADOQuery2.Post;
            except
              Application.MessageBox('保存失败!可能您输入的数据不完整!','',MB_OK+MB_ICONSTOP);
              MainDM.ADOQuery2.Cancel;
            end;
          end
          else begin
            MainDM.ADOQuery2.Cancel;
          end;
        end
        else
        begin
          Application.MessageBox('对不起!不能从剪切板粘贴数据!','提示',MB_OK+MB_ICONSTOP);
        end;  end;
    end;procedure Tmainform.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    var AConfig : TIniFile;
      AStyleID,i : Integer;
    begin
      AStyleID := 0;
      for i :=0 to 15 do
      begin
        if DBMemo1.Font.Style = AFontStyle[i] then
        begin
          AStyleID := i;
          Break;
        end;
      end;
      AConfig := Tinifile.Create(ExtractFilePath(Application.ExeName)+'Config.ini');
      AConfig.WriteString('Base','Color',IntToStr(DBMemo1.Font.Color));
      AConfig.WriteString('Base','Size',IntToStr(DBMemo1.Font.Size));
      AConfig.WriteString('Base','Name',DBMemo1.Font.Name);
      AConfig.WriteString('Base','Charset',IntToStr(DBMemo1.Font.Charset));
      AConfig.WriteString('Base','Style',IntToStr(AStyleID));
      AConfig.Free;
      UnRegisterHotKey(handle, HotKey_A);
    end;
    end.
      

  2.   

    不用那样麻烦吧!看下面的我贴的代码RegisterHotKey函数原型及说明:
    BOOL RegisterHotKey(
      HWND hWnd,         // window to receive hot-key notification
      int id,            // identifier of hot key
      UINT fsModifiers,  // key-modifier flags
      UINT vk            // virtual-key code);
    参数 id为你自己定义的一个ID值,对一个线程来讲其值必需在0x0000 - 0xBFFF范围之内,对DLL来讲其值必需在0xC000 - 0xFFFF 范围之内,在同一进程内该值必须唯一
    参数 fsModifiers指明与热键联合使用按键,可取值为:MOD_ALT MOD_CONTROL MOD_WIN MOD_SHIFT
    参数 vk指明热键的虚拟键码 
    首先(举个例子):  
      RegisterHotKey(handle,globaladdatom('hot key'),MOD_ALT,vk_f12);
    然后在form中声明一个函数(过程):
      procedure hotkey(var msg:tmessage);message wm_hotkey;
    过程如下:
    procedure TForm1.hotkey(var msg:tmessage);
    begin
      if (msg.LParamHi=VK_F12) and (msg.LParamLo=MOD_ALT) then
      begin
       form1.show;
       SetForegroundWindow(handle);
      end;
    end;
    这样,不管你在什么地方,窗口就会显示出来。
    当然,你要GlobalDeleteAtom;unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;type
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
      private
        { Private declarations }
        aatom:atom;
        procedure hotkey(var msg:tmessage);message wm_hotkey;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.DFM}procedure TForm1.FormCreate(Sender: TObject);
    begin
      aatom:=globaladdatom('hot key');
      RegisterHotKey(handle,aatom,MOD_ALT,vk_f12);
    end;procedure TForm1.hotkey(var msg:tmessage);
    begin
      if (msg.LParamHi=VK_F12) and (msg.LParamLo=MOD_ALT) then
        SetForegroundWindow(handle);
    end;
      

  3.   

    两种方法
    1.代码注册热键
    2.三方控件设置热键
    用raize3.10三方控件包  就可以了