避免窗口获得焦点

opc*_*0de 8 delphi winapi

我在虚拟键盘上工作的问题是,当我按下虚拟键盘上的键时,需要发送数据的窗口失去焦点.我怎么能避免这种情况?

Jer*_*non 6

当您的键盘形式获得焦点时,它接收的部分消息是失去焦点的窗口的句柄(wParam).做你需要做的事情并将焦点设置回失去焦点的窗口.

编辑:请参阅WM_SETFOCUS上的文档

编辑2:

此外,您可以在创建自定义表单时使用以下内容:

procedure TMainForm.CreateParams(var Params: TCreateParams) ;
 //const WS_EX_NOACTIVATE = $8000000;
 begin
   inherited;
   Params.ExStyle := Params.ExStyle + WS_EX_NOACTIVATE;
 end;
Run Code Online (Sandbox Code Playgroud)

防止表单激活(从其他表单获取焦点).就像我在评论中提到的那样,你可能应该使用非窗口控制键.


rod*_*igo 5

我见过的唯一方法是使用虚拟键盘禁用窗口EnableWindow(hWnd, FALSE)

现在,如果窗口被禁用,您将不会收到鼠标消息,对吧?你必须选择:

  • 最简单的一个:使用WM_SETCURSOR. 它甚至会发送到禁用的窗口,并且在 lParam 的高位字中您可以看到原始消息的标识符(WM_LBUTTONDOWN 等)。可以使用 读取光标的坐标GetMessagePos()
  • 最酷的一个:使用 windows hook: SetWindowsHookEx(WH_MOUSE, ...)。您将完全控制鼠标消息。