避免窗口获得焦点

时间:2011-11-14 16:55:59

标签: delphi winapi

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

4 个答案:

答案 0 :(得分: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;

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

答案 1 :(得分:4)

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

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

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

答案 2 :(得分:1)

这有帮助吗?

procedure WMMouseActivate(var Message: TWMMouseActivate); message WM_MOUSEACTIVATE;

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

答案 3 :(得分:1)

使用无法获得键盘焦点但只响应鼠标输入的类。

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