我想在程序的运行过程中,比如说按 F10 键便呼出一窗体!可是按了后呼出的窗体会被原窗体所遮挡。但别的f1-f12却正常,不知道为什么?

解决方案 »

  1.   

    使用Hook技术,把呼出的窗体激活并提到最前面,API就搞定了
      

  2.   

    有一个简单的投机取巧的方法可以实现:
    在你的主窗体Form1上放一个MainMenu,随便设置一个菜单项(是否顶级菜单项都无所谓),将它的ShortCut属性设为F10,在它的OnClick事件中写:
    procedure TForm1.xxx1Click(Sender: TObject);
    begin
     form2.Show; //或form2.ShowModal;
    end;
    然后将该菜单项的Visible设为false,如果你没有别的菜单项,你会发现运行后根本不会出现菜单栏;如果你有其它菜单项,你会发现运行后该项根本不会出现在菜单中。但是,当你按下F10.......
      

  3.   

    好做啊,
    自己看看
    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;    procedure TForm1.FormDestroy(Sender: TObject);
    begin
     globalDeleteatom(aatom);
    end;end.
      

  4.   

    为什么要那么麻烦,在show之后用application.bringtofront;就可以了。
    好象也可以用myform.bringtofront
      

  5.   

    oracle_lover(数据库情人) 讲得不错