请教如何通过字符串来注册热键?(100分)

  • 主题发起人 gzwatson
  • 开始时间
G

gzwatson

Unregistered / Unconfirmed
GUEST, unregistred user!
比如有一个字符串要s:='Alt+D',我现在想通过registerhotkey函数过注册一个热键Alt+D,该怎么办呢?
谢谢!!
 
自己分析字符串呀。
 
要自己分析:
var
m,k:integer;

s:=uppercase(s);
if pos('ALT+',s)>0 then m:=MOD_Alt; /// m:=(m or MOD_ALT)
if pos('+D',s)>0 then k:=VK_D;

registerhotkey(.....,m,k);






70. 编写后台监控软件,注册全局热键
后台监控软件,为了达到隐蔽监控的目的,应该满足正常运行时,不显示在任务栏上,在按Ctrl+Alt+Del出现的任务列表中也不显示,管理员可以通过热键调出隐藏的运行界面。要作到这些,必须把当前进程变为一个系统服务,并且定义全局热键。
一、把当前进程变为一个系统服务:
目的是在任务列表中把程序隐藏起来。调用API函数RegisterServiceProcess实现。
二、定义全局热键(本例中定义热键Ctrl+Del+R),步骤:
1、定义捕获Windows消息WM_HOTKEY的钩子函数,即:
procedure WMHotKey(var Msg : TWMHotKey); message WM_HOTKEY;
2、向Windows加入一个全局原子 Myhotkey: GlobalAddAtom('MyHotkey'),
并保留其句柄。
3、向Windows登记热键:调用API函数RegisterHotKey实现。
三、设计界面和源程序:
unit Unit1;
interface
uses
Windows, Messages, Forms, Dialogs, Classes, Controls, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{热键标识ID}
id: Integer;
procedure WMHotKey(var Msg : TWMHotKey); message WM_HOTKEY;
{ Privat-Declarations}
public
{ Public-Declarations}
end;
var
Form1 : TForm1;
implementation
const RSP_SIMPLE_SERVICE=1;
function RegisterServiceProcess (dwProcessID, dwType: DWord) : DWord; stdcall; external 'KERNEL32.DLL';
{$R *.DFM}

{捕获热键消息}
procedure TForm1.WMHotKey (var Msg : TWMHotKey);
begin
if msg.HotKey = id then
ShowMessage('Ctrl+Alt+R键被按下!');
form1.Visible :=true;
end;
procedure TForm1.FormCreate(Sender: TObject);
Const {ALT、CTRL和R键的虚拟键值}
MOD_ALT = 1;
MOD_CONTROL = 2;
VK_R = 82;
begin
{首先判断程序是否已经运行}
if GlobalFindAtom('MyHotkey') = 0 then
begin
{注册全局热键Ctrl + Alt + R}
id:=GlobalAddAtom('MyHotkey');
RegisterHotKey(handle,id,MOD_CONTROL+MOD_Alt,VK_R);
end
else halt;
end;
{把当前进程变为一个系统服务,从而在任务列表中把程序隐藏起来}
procedure TForm1.Button1Click(Sender: TObject);
begin
RegisterServiceProcess(GetCurrentProcessID,RSP_SIMPLE_SERVICE);
form1.Hide;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
close;
end;
{退出时释放全局热键}
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
UnRegisterHotKey(handle,id);
GlobalDeleteAtom(id);
end;
end.
四、说明:在后台监控软件中使用以上功能,可真正实现隐蔽运行,热键调出,便于管理员进行管理。程序在Win98,Delphi5.0中运行通过。
以下是注册F9、F10两个全局热键的情况:
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 }
public
{ Public declarations }
procedure WMHotKey(var Msg : TWMHotKey); message WM_HOTKEY;
end;
var
Form1: TForm1;
F9_ID,F10_ID:integer;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
if GlobalFindAtom('MyF9HotKey') = 0 then
begin
F9_ID:=GlobalAddAtom('MyF9HotKey');
RegisterHotKey(handle,F9_id,0,VK_F9);
end;
if GlobalFindAtom('MyF10HotKey') = 0 then
begin
F10_ID:=GlobalAddAtom('MyF10HotKey');
RegisterHotKey(handle,F10_id,0,VK_F10);
end ;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
UnRegisterHotKey(handle,F9_id);
GlobalDeleteAtom(F9_id);
UnRegisterHotKey(handle,F10_id);
GlobalDeleteAtom(F10_id);
end;
procedure TForm1.WMHotKey(var Msg: TWMHotKey);
begin
if msg.HotKey = F9_id then form1.hide;
if msg.HotKey = F10_id then form1.show;
end;
end.
 
我想知道能不能利用texttoshortcut函数将字符串转换为Tshortcut类型,然后分别提取modifiers和virtual key?
谢谢!
 
可以的,但这样做似乎不比自己些个函数更简单:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
procedure WMHotKey(var Message: TMessage); message WM_HOTKEY;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation
uses menus;

{$R *.DFM}

procedure TForm1.WMHotKey(var Message: TMessage);
begin
application.Restore;
application.bringtofront;
showmessage('CTRL-F7 pressed!');
end;

procedure TForm1.FormCreate(Sender: TObject);
var
sc: TShortCut;
Modifiers, vk: Word;
Shift: TShiftState;
begin
sc := TextToShortCut('CTRL+F7');
ShortCutToKey(sc, vk, Shift);
Modifiers:=0;
if ssShift in Shift then Modifiers:= Modifiers or MOD_SHIFT;
if ssCtrl in Shift then Modifiers:= Modifiers or MOD_CONTROL;
if ssAlt in Shift then Modifiers:= Modifiers or MOD_ALT;

RegisterHotKey(Handle,123,Modifiers,vk);
end;

end.
 
多人接受答案了。
 
顶部