有关于快捷键(50分)

  • 主题发起人 主题发起人 凌云客
  • 开始时间 开始时间

凌云客

Unregistered / Unconfirmed
GUEST, unregistred user!
  小弟写了一个托盘程序,没有可视窗口,现在要实现以下功能:
  按下一组快捷键,执行程序中的某一个过程。关键疑问在于:如何让程序运行在后台
而接受快捷键,跳转到前台,并且执行一个过程。
  请各位大侠赐教。
 
注册系统级的热键
登记全局热键

全局热键
通常在自己的程序里定义热键,只能在自己的应用窗口范围内使用,未免使用起来受到一定的限制。
如果能在自己的应用程序里定义能被所有窗口访问的热键,应该是比较具有现实意义的。要定义一个全局热键,通常有三个步骤:
1。定义 Windows 的消息 WM_HOTKEY 的 HOOK 链,即 procedure myshortcut(var message: TMessage);
message WM_HOTKEY;
2。向 Windows 加入一个全局原子 hotkey : GlobalAddAtom(’hotkey’)
并保留其句柄
3。向 Windows 登记热键链: RegisterHotKey( 应用句柄
全局原子句柄
mod_control,88 );
其中,RegisterHotKey 函数原形如下
BOOL RegisterHotKey(
HWND hWnd
// 连接热键的窗口句柄
int id
// 全局原子句柄
UINT fsModifiers
// 热键修饰标志
UINT vk // 虚拟键盘码
);
这里,fsModifiers 是指虚拟键盘码 vk 结合何种键一起生成 WM_HOTKEY 的消息,它是下列三值的组合:
MOD_ALT // ALT 键必须按下
MOD_CONTROL // CTRL 键必须按下
MOD_SHIFT // SHIFT 键必须按下
有了这些准备,你就可以定义自己喜欢的方式了。下面是一个范例,当 CTRL + Q 在任何时候被按下时,都会打出 “你好,Crtl + Q 被按下” 的信息。
type
TForm1 = class(TForm)

procedure FormCreate(Sender: TObject);

procedure FormDestroy(Sender: TObject);


protected

procedure myshortcut(var message: TMessage); message WM_HOTKEY;

private

{ Private-Deklarationen }

public

{ Public-Deklarationen }

end;


var

Form1: TForm1;

id:Integer;


implementation


{$R *.DFM}


procedure TForm1.myshortcut(var message: TMessage);

begin

ShowMessage('你好,Crtl + Q 被按下');

end;


procedure TForm1.FormCreate(Sender: TObject);

begin

id:=GlobalAddAtom('hotkey');

RegisterHotKey(handle,id,mod_control,88);

end;


procedure TForm1.FormDestroy(Sender: TObject);

begin

UnRegisterHotKey(handle,id); //别忘了在退出时取消定义

end;
 
到深度历险去下控件。
 
  谢谢两位。我比较喜欢fanren945的回答,所以给他40分,剩下的10分给redsky.l。
再次表示感谢。
 
后退
顶部