求助定义了全局热键,但没有反映,请帮忙看一下代码问题(100分)

  • 主题发起人 主题发起人 jimsavage
  • 开始时间 开始时间
J

jimsavage

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TForm1.WMHotKey(var Msg: TWMHotKey);
begin
//如果按下热键
if msg.HotKey=id_k then
keyevent('abcde');
if msg.HotKey=id_l then
keybd_event(68, 0, 0, 0);
keybd_event(68, 0, KEYEVENTF_KEYUP, 0);
end;

procedure TForm1.FormCreate(Sender: TObject);
Const
VK_k=ord('K');
VK_l=ord('L');
begin
if GlobalFindAtom('HotKey_d')=0 then
begin
//注册全局热键Ctrl+k Ctrl+l
id_k:=GlobalAddAtom('HotKey_d');
id_l:=GlobalAddAtom('HotKey_D');
RegisterHotKey(handle,id_k,mod_CONTROL,VK_k);
RegisterHotKey(handle,id_l,mod_CONTROL,VK_l);
end;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
UnregisterHotKey(handle,id_k);
GlobalDeleteAtom(id_k);
UnregisterHotKey(handle,id_l);
GlobalDeleteAtom(id_l);
end;

procedure Tform1.keyevent(str:string);
var
i : integer;
c : byte;
begin
keybd_event(13, MapVirtualKey(13, 0), 0, 0);
keybd_event(13, MapVirtualKey(13, 0), KEYEVENTF_KEYUP, 0);
for i := 1 to Length(str) do
begin
c := VkKeyScan(str) and 255; //输入文字
keybd_event(c,0,0,0);
keybd_event(c,0,KEYEVENTF_KEYUP,0);
end;
keybd_event(13, MapVirtualKey(13, 0), 0, 0);
keybd_event(13, MapVirtualKey(13, 0), KEYEVENTF_KEYUP, 0);
end;
end.
 
有人帮忙看一下吗?谢谢!
 
可以把“VK_k”.“VK_l”换成具体的ASCII码且不要带"$"来试试。
如:RegisterHotKey(handle, id_k, mod_CONTROL, 75);
RegisterHotKey(handle, id_l, mod_CONTROL, 76);
 
还是没有反映哦
 
没仔细研究,不知你注意没有一些小问题。

有没有写入: uses Clipbrd ;

vk_F1 vk_F2等特殊键注册行 VK_k VK_l等好像没用,最好改成具体的ASCII码。

还有:id_k:=GlobalAddAtom('HotKey_d'); id_l:=GlobalAddAtom('HotKey_D');
那样的话 id_k就等于id_l 就会同时执行 WMHotKey过程下的所有指令(按那个热键
都执行的是一样的)

还有: if msg.HotKey=id_l then
keybd_event(68, 0, 0, 0);
keybd_event(68, 0, KEYEVENTF_KEYUP, 0);

应该是:if msg.HotKey=id_l then
begin
keybd_event(68, 0, 0, 0);
keybd_event(68, 0, KEYEVENTF_KEYUP, 0);
end;


procedure Tform1.keyevent(str:string); 写成函数形式有返回值好判断测试一些。
如果 WMHotKey 和 keyevent过程没问题的话 我想可能是 使用全局热键后再模拟按键
两者有冲突 (我是这么想的不知道对不对)。
 
还是我来吧,你在热键的响应函数中使用了keyevent,但是这时,你的ctrl键还是处在按下状态,所以系统响应的不是abcde的按键,而是加上了ctrl的组合键,你在响应keyevent的时候先模拟ctrl键的keyup,然后就可以了。
 
后退
顶部