Delphi编写的服务中如何实现定义全局快捷键?

plushenkolxx 2012-05-25 05:43:51
RT
在Delphi编写的服务中,如何实现定义一个全局快捷键并相应?
...全文
336 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
海宏AA 2013-09-10
  • 打赏
  • 举报
回复
TAction
山东蓝鸟贵薪 2012-06-01
  • 打赏
  • 举报
回复
奇怪了呀,怎么看不出帖子是否结了呀
山东蓝鸟贵薪 2012-05-30
  • 打赏
  • 举报
回复
努力学习中
加强科技新技能......
kaikai_kk 2012-05-30
  • 打赏
  • 举报
回复
2楼小鸟给的代码已经很完整了,LZ不会copy下来试一下吗?
别看代码多,其实省略去一些重复的,关键代码不外乎那么几行
一如当初 2012-05-30
  • 打赏
  • 举报
回复
没做过,但是我在想,服务程序运行在SYSTEM下,工作在不同的桌面
定义热键能有用?
plushenkolxx 2012-05-30
  • 打赏
  • 举报
回复
自己再顶一下,求高手指导。
一剑飘雪 2012-05-30
  • 打赏
  • 举报
回复
无外乎就是 监听键盘
响应消息
kaikai_kk 2012-05-26
  • 打赏
  • 举报
回复
小鸟越来越强了
山东蓝鸟贵薪 2012-05-26
  • 打赏
  • 举报
回复

上个图让你看看吧,代码如下:
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;
implementation

uses 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号,我将完整代码传给你的
SQLDebug_Fan 2012-05-26
  • 打赏
  • 举报
回复
可以注册热键消息
plushenkolxx 2012-05-26
  • 打赏
  • 举报
回复
首先感谢各位关注此贴。
我的做法是Service里加一个Form(不显示),来进行消息处理。
Demo也写了,用 RegisterHotKey注册热键,Procedure XXXX(var msg:Tmessage);message WM_HOTKEY;用来响应,但是没成功。
失败的原因 不知道是没注册上热键,还是Form上就没收到WM_HOTKEY?

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧