【问题标题】:Avoid window getting focus避免窗口获得焦点
【发布时间】:2011-11-14 16:55:58
【问题描述】:

我正在使用虚拟键盘,问题是当我按下虚拟键盘上的一个键时,需要发送数据的窗口失去焦点。我该如何避免呢?

【问题讨论】:

  • virtual keyboard 是什么意思?你在使用类似TTouchKeyboard 的组件吗?

标签: delphi winapi


【解决方案1】:

当您的键盘窗体获得焦点时,它收到的部分消息是失去焦点的窗口句柄 (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;

防止您的表单激活(从另一个表单获取焦点)。就像我在评论中提到的那样,您可能应该对键使用非窗口控件。

【讨论】:

  • 请记住,如果您对键盘按钮使用窗口控件,那么它们也会收到 WM_SETFOCUS 消息。我在回答中写了“表单”,但我的意思是“窗口”,它可以是任何可以接收键盘焦点的窗口控件。
  • 最后一种方法效果很好。还有一个问题,我知道如何截取属于表单的消息,但是如何截取属于控件的消息?任何例子都会很棒。谢谢
  • 使用SetWindowsHookEx() 就像rodrigo 建议的那样。这里有一些信息:delphi.about.com/od/kbwinshell/a/delphi_hook.htm 虽然我不确定它的年龄。
【解决方案2】:

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

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

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

【讨论】:

  • 我一直在寻找一种在禁用窗口中检测按钮按下的方法,而您对 WM_SETCURSOR 的破解是纯粹的天才。
【解决方案3】:

使用一个不能获得键盘焦点,而只响应鼠标输入的类。

解决方案:从 TControl 或 TGraphicControl 派生虚拟键盘,而不是从 TWinControl 或 TCustomControl。

【讨论】:

    【解决方案4】:

    这有帮助吗?

    procedure WMMouseActivate(var Message: TWMMouseActivate); message WM_MOUSEACTIVATE;
    
    procedure TMyForm.WMMouseActivate(var Message: TWMMouseActivate);
    begin
      Message.Result := MA_NOACTIVATE;
    end;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-04
      • 1970-01-01
      • 2011-12-06
      • 2011-03-10
      • 1970-01-01
      相关资源
      最近更新 更多