很多软件都是只按下“S”,而不需要按下“ctrl+s”或者"shift+S"就可以调出所需要的面板。请问怎么实现的。

解决方案 »

  1.   

    当然是全局的,有很多输入框,我不可能一个一个的判断吧。就象一般的定义热键一样,不管焦点在哪里,都可以捕获的到,只是不想用“ctrl+s”或者"shift+S"而只想用“S”,因为要改装键盘,没有shift或ctrl了。请问怎么用全局钩子,给个例子可以吗?
      

  2.   

    看看SetWindowsHookEx帮助了,或则上网找找钩子函数等文章,应该不难找到帮助!
      

  3.   

    Form1.KeyPreview := True;procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
    begin
      if key = 's' then
      begin
        Form2.ShowModal;
        Key := #0;
      end;
    end;
      

  4.   

    用cx的控件,只要在caption里设置(&S),这样只要按s就可以了!不用自己写代码!
      

  5.   

    unit Mainform;interfaceuses
      Windows, Messages, SysUtils;type
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
      private
        HotkeyId_Next:integer;
        procedure WNhotkeyhandle(var msg:Tmessage); message WM_HOTKEY;
      public
      end;var
      Form1: TForm1;
      
    implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    begin
        //---------------- 快捷键注册---------------------
        Hotkeyid_Next:=globaladdatom(pchar('Next'))-$C000;
        Registerhotkey(Handle,HotkeyId_Next,Mod_control,VK_F1);
    end;procedure TForm1.WNhotkeyhandle(var msg: Tmessage);  
    begin
      if (msg.LParamHi = VK_F1) and (msg.LParamLo = Mod_control) then 
        begin 
           Showmessage('F1');
         end;
    end;procedure TForm.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
    //----------释放热键-------------------------
      unregisterhotkey(Handle,HotkeyId_Next);
      deleteatom(HotkeyId_Next);
    end;
      

  6.   

    如果需要钩子dll代码,请留下邮箱,我改好后发给你。
      

  7.   

    GARNETT2183(極品狼王) :
      请看清楚问题,我说过,是按下F1,不是按下CTRL+F1. g961681(失败的人):
      CX控件在哪儿下载,能给个地址吗?窗体下既有很多button,也有很多edit, xixuemao(吸血猫):
      [email protected] 谢谢!
      

  8.   

    这样可以的,挺简单procedure TForm1.FormCreate(Sender: TObject);
    begin
      Application.OnMessage:=Self.AppMessage;
    end;procedure TForm1.AppMessage(var Msg: TMsg; var Handled: Boolean);
    begin
      if Msg.message = WM_KEYDOWN then
      begin
        if (Msg.wParam= VK_F1)then
        begin
        ShowMessage('按下了F1');
        Handled := true;
        end;
      end;
    end;