在DLL用看你怎么用的,如果说是插件的话,一般会有一个窗口句柄给你作为父窗口,那么你的这个热键ID是可以在你的TForm1类的成员变量里面的,所以其实用不用这个GlobalAddAtom问题不大的。
我找到了响应热键的方法,具体来说需要调用SetWindowLong(或SetWindowLongPtr)来设置一个新的窗口处理函数,然后在里面拦截WM_HOTKEY消息,给你个示例代码吧,还有问题再说:
[Delphi] 纯文本查看 复制代码 var
old_winproc:WNDPROC;
function MyWndProc(Ahwnd: HWND; uMsg: UINT; wParam: WParam; lParam: LParam):LRESULT;stdcall;
begin
if (uMsg=WM_HOTKEY) and
(
(Lo(lparam)=MOD_CONTROL) and (Hi(lparam)=VK_K) // Ctrl+K
)
then
begin
ShowMessage('XXXXX');
Exit(0);
end;
Result:=CallWindowProc(old_winproc,Ahwnd,uMsg,wParam,lParam);
end;
{ TForm1 }
procedure TForm1.Button1Click(Sender:TObject);
begin
ShowMessage('Hello DLL form');
end;
procedure TForm1.FormCreate(Sender:TObject);
begin
if RegisterHotKey(Handle,123,MOD_CONTROL,VK_K) then // ID = 123, Ctrl+K
MessageBoxA(0,'OK','OK',0)
else
MessageBoxA(0,'Error','Error',0);
NativeInt(old_winproc):=SetWindowLongPtr(Handle,GWL_WNDPROC,NativeInt(@MyWndProc));
end;
procedure TForm1.FormDestroy(Sender:TObject);
begin
UnregisterHotKey(Handle,123); // ID = 123
end; |