gpt4 book ai didi

delphi - 键盘 Hook 过程的问题

转载 作者:行者123 更新时间:2023-12-03 18:44:00 30 4
gpt4 key购买 nike

背景:我的表单有一个 TWebBrowser。我想用 ESC 关闭表单,但 TWebBrowser 吃掉了击键 - 所以我决定使用键盘 Hook 。

问题是表单可以同时在多个实例中打开。

无论我做什么,在某些情况下,如果我的表单打开了两个实例,关闭其中一个实例也会关闭另一个实例。

我附上了一些示例代码。关于导致问题的原因有什么想法吗?

var
EmailDetailsForm: TEmailDetailsForm;
KeyboardHook: HHook;

implementation

function KeyboardHookProc(Code: Integer; wParam, lParam: LongInt): LongInt; stdcall;
var
hWnd: THandle;
I: Integer;
F: TForm;
begin
if Code < 0 then
Result := CallNextHookEx(KeyboardHook, Code, wParam, lParam)
else begin
case wParam of
VK_ESCAPE:
if (lParam and $80000000) <> $00000000 then
begin
hWnd := GetForegroundWindow;
for I := 0 to Screen.FormCount - 1 do
begin
F := Screen.Forms[I];
if F.Handle = hWnd then
if F is TEmailDetailsForm then
begin
PostMessage(hWnd, WM_CLOSE, 0, 0);
Result := HC_SKIP;
break;
end;
end; //for
end; //if
else
Result := CallNextHookEx(KeyboardHook, Code, wParam, lParam);
end; //case
end; //if
end;

function TEmailDetailsForm.CheckInstance: Boolean;
var
I, J: Integer;
F: TForm;
begin
Result := false;

J := 0;

for I := 0 to Screen.FormCount - 1 do
begin
F := Screen.Forms[I];
if F is TEmailDetailsForm then
begin
J := J + 1;
if J = 2 then
begin
Result := true;
break;
end;
end;
end;
end;

procedure TEmailDetailsForm.FormCreate(Sender: TObject);
begin
if not CheckInstance then
KeyboardHook := SetWindowsHookEx(WH_KEYBOARD, @KeyboardHookProc, 0, GetCurrentThreadId());
end;

procedure TEmailDetailsForm.FormDestroy(Sender: TObject);
begin
if not CheckInstance then
UnHookWindowsHookEx(KeyboardHook);
end;

最佳答案

你可以用 TApplicationEvents.OnMessage 来做到这一点反而。使用以下代码在应用程序的主窗体上放置一个 TApplicationEvents 组件:

procedure TMainForm.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);
var
C: TControl;
H: HWND;
begin
if (Msg.message = WM_KEYDOWN) and (Msg.wParam = VK_ESCAPE) then begin
H := Msg.hwnd;
while GetParent(H) <> 0 do
H := GetParent(H);
C := FindControl(H);
if C is TEmailDetailsForm then begin
TEmailDetailsForm(C).Close;
Handled := True;
end;
end;
end;

如果您想继续使用键盘 Hook ,您应该只 Hook 一次,而不是每个表单一次,特别是因为您正在覆盖全局变量。尝试添加一个 HookCount 全局变量,如果它是唯一的形式,则仅 Hook /取消 Hook 。

关于delphi - 键盘 Hook 过程的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2576071/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com