RT
在Delphi编写的服务中,如何实现定义一个全局快捷键并相应?
在Delphi编写的服务中,如何实现定义一个全局快捷键并相应?
解决方案 »
- delphi 高手来指点一下!
- 这个问题真的让我费解。求救!!!
- DELPHI7如何操作XML文件
- 问一下,Delphi中的VCL组件究竟是如何显示出来,是windows有图形化的功能还是,用了Windows系统给DelphiWinAPI
- 请教下面代码Delphi的VB实现?300分跪求
- 同一个程序,如何判断只能打开一个!
- 请问怎么读取注册表中的双字节值(Dword)?
- 女生就不能学编程吗?
- 一段时间没来,连版面换了都不知道,呵呵,散点分,顺便求个算法,如下:
- 请问各位哪有介绍用DELPHI学习COM,COM+的书咯?我怎么找到的都是用C++的咯! -
- 关于获取 mpeg 视频文件 缩略图 以及 播放列表显示问题
- delphi 控件设计期属性无法应用到运行期
上个图让你看看吧,代码如下:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, RXShell;
type
TFrmKey = class(TForm)
Label1: TLabel;
BitBtn1: TBitBtn;
RxTrayIcon1: TRxTrayIcon;
ComboBox1: TComboBox;
BitBtn2: TBitBtn;
Label2: TLabel;
procedure FormCreate(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
//procedure WMHotKey(var Msg: TWMHotKey);
_HotKey:Integer;
procedure HotKey(var Msg:Tmessage);message WM_HOTKEY;
end;
var
FrmKey: TFrmKey;
implementationuses ShellApi;{$R *.dfm}
procedure doNotifyIconData(aType: String);
var
lpData: PNotifyIconData; //引用单元 uses ShellApi;
begin
lpData := new(PNotifyIconDataA);
lpData.cbSize := 88;
lpData.Wnd := FrmKey.Handle;
lpData.hIcon := Application.Icon.Handle;
lpData.uID :=0;
lpData.uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
if (aType = 'add') then
Shell_NotifyIcon(NIM_ADD, lpData)
else if (aType = 'del') then
Shell_NotifyIcon(NIM_DELETE, lpData);
dispose(lpData);
end;
procedure TFrmKey.HotKey(var Msg:Tmessage);
begin
{ if ((Msg.LParamHi=vk_F1) or (Msg.LParamHi=vk_F2) or (Msg.LParamHi=vk_F3) or (Msg.LParamHi=vk_F4) or
(Msg.LParamHi=vk_F5) or (Msg.LParamHi=vk_F6) or (Msg.LParamHi=vk_F7) or (Msg.LParamHi=vk_F8) or
(Msg.LParamHi=vk_F9) or (Msg.LParamHi=vk_F10) or (Msg.LParamHi=vk_F11) or (Msg.LParamHi=vk_F12)) then
begin }
if self.Visible then
begin
doNotifyIconData('del');
self.Visible:=false;
end
else
begin
doNotifyIconData('add');
self.Visible:=true;
end;
//end;
end;
procedure TFrmKey.FormCreate(Sender: TObject);
begin
//初始化功能键列表 F1---F12
ComboBox1.Clear;
ComboBox1.Items.Add('请选择功能热键');
ComboBox1.Items.Add('F1');
ComboBox1.Items.Add('F2');
ComboBox1.Items.Add('F3');
ComboBox1.Items.Add('F4');
ComboBox1.Items.Add('F5');
ComboBox1.Items.Add('F6');
ComboBox1.Items.Add('F7');
ComboBox1.Items.Add('F8');
ComboBox1.Items.Add('F9');
ComboBox1.Items.Add('F10');
ComboBox1.Items.Add('F11');
ComboBox1.Items.Add('F12');
ComboBox1.ItemIndex:=0; //定义到F1上 self.Position:=poDesktopCenter; //窗体 居中显示
end;
procedure TFrmKey.BitBtn1Click(Sender: TObject);
begin
_HotKey:=GlobalAddAtom('HotKey')-$C000; case ComboBox1.ItemIndex of
1:
begin
Label1.Caption:='键盘输入检测快捷键 热键为:F1 ';
RegisterHotKey(Handle,_HotKey,0,vk_F1); {取出用户设定的热键,把vk_F2变一下即可}
doNotifyIconData('add');
end;
2:
begin
Label1.Caption:='键盘输入检测快捷键 热键为:F2 ';
RegisterHotKey(Handle,_HotKey,0,vk_F2); {取出用户设定的热键,把vk_F2变一下即可}
doNotifyIconData('add');
end;
3:
begin
Label1.Caption:='键盘输入检测快捷键 热键为:F3 ';
RegisterHotKey(Handle,_HotKey,0,vk_F3); {取出用户设定的热键,把vk_F2变一下即可}
doNotifyIconData('add');
end;
4:
begin
Label1.Caption:='键盘输入检测快捷键 热键为:F4 ';
RegisterHotKey(Handle,_HotKey,0,vk_F4); {取出用户设定的热键,把vk_F2变一下即可}
doNotifyIconData('add');
end;
5:
begin
RegisterHotKey(Handle,_HotKey,0,vk_F5); {取出用户设定的热键,把vk_F2变一下即可}
Label1.Caption:='键盘输入检测快捷键 热键为:F5 ';
doNotifyIconData('add');
end;
6:
begin
Label1.Caption:='键盘输入检测快捷键 热键为:F6 ';
RegisterHotKey(Handle,_HotKey,0,vk_F6); {取出用户设定的热键,把vk_F2变一下即可}
doNotifyIconData('add');
end;
7:
begin
Label1.Caption:='键盘输入检测快捷键 热键为:F7 ';
RegisterHotKey(Handle,_HotKey,0,vk_F7); {取出用户设定的热键,把vk_F2变一下即可}
doNotifyIconData('add');
end;
8:
begin
Label1.Caption:='键盘输入检测快捷键 热键为:F8 ';
RegisterHotKey(Handle,_HotKey,0,vk_F8); {取出用户设定的热键,把vk_F2变一下即可}
doNotifyIconData('add');
end;
9:
begin
Label1.Caption:='键盘输入检测快捷键 热键为:F9 ';
RegisterHotKey(Handle,_HotKey,0,vk_F9); {取出用户设定的热键,把vk_F2变一下即可}
doNotifyIconData('add');
end;
10:
begin
Label1.Caption:='键盘输入检测快捷键 热键为:F10 ';
RegisterHotKey(Handle,_HotKey,0,vk_F10); {取出用户设定的热键,把vk_F2变一下即可}
doNotifyIconData('add');
end;
11:
begin
Label1.Caption:='键盘输入检测快捷键 热键为:F11 ';
RegisterHotKey(Handle,_HotKey,0,vk_F11); {取出用户设定的热键,把vk_F2变一下即可}
doNotifyIconData('add');
end;
12:
begin
Label1.Caption:='键盘输入检测快捷键 热键为:F12 ';
RegisterHotKey(Handle,_HotKey,0,vk_F12); {取出用户设定的热键,把vk_F2变一下即可}
doNotifyIconData('add');
end;
end;end;
procedure TFrmKey.BitBtn2Click(Sender: TObject);
begin
UnRegisterHotKey(handle,_HotKey);//注消热键
end;
end.
如果还是不懂的话,可以关注一下我的QQ号,我将完整代码传给你的
我的做法是Service里加一个Form(不显示),来进行消息处理。
Demo也写了,用 RegisterHotKey注册热键,Procedure XXXX(var msg:Tmessage);message WM_HOTKEY;用来响应,但是没成功。
失败的原因 不知道是没注册上热键,还是Form上就没收到WM_HOTKEY?
定义热键能有用?
别看代码多,其实省略去一些重复的,关键代码不外乎那么几行