快捷键不生效如何解决(100分)

  • 主题发起人 huabinhong
  • 开始时间
H

huabinhong

Unregistered / Unconfirmed
GUEST, unregistred user!
我的问题是这样的,我在主程序界面中定义了一快捷键ALT+D,在另一窗体FORM1中也定义了一快捷键
当我把住窗体隐藏以后,FORM1中的快捷键就不能用了,请高手赐教!
 
这个快捷键只能用在窗口得到焦点的情况下,如果想在没有获得焦点的情况需要用到RegisterHotKey
 
用下面的方法:
全局热键

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;

interface

uses
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.
 
要定义一个系统级的热键,用下面的控件可以办到:
http://click.alltheweb.com/go2/2/atw/1cDC338E00/MixILGZ0cA/ftp/ftp.informatik.rwth-aachen.de/pub/mirror/delphi.icm.edu.pl/ftp/d30free/hotkeymg.zip
 
我指的是在Form1中的快捷键ALT+D不能用,换句话说,在主窗体中有快捷键Shift + D,
在Form1种文本框,此时在文本框中输入文字时,按Shift + D 不能输入大写字符D。
 
顶部