【发布时间】:2011-11-14 16:55:58
【问题描述】:
我正在使用虚拟键盘,问题是当我按下虚拟键盘上的一个键时,需要发送数据的窗口失去焦点。我该如何避免呢?
【问题讨论】:
-
virtual keyboard是什么意思?你在使用类似TTouchKeyboard的组件吗?
我正在使用虚拟键盘,问题是当我按下虚拟键盘上的一个键时,需要发送数据的窗口失去焦点。我该如何避免呢?
【问题讨论】:
virtual keyboard 是什么意思?你在使用类似TTouchKeyboard 的组件吗?
当您的键盘窗体获得焦点时,它收到的部分消息是失去焦点的窗口句柄 (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;
防止您的表单激活(从另一个表单获取焦点)。就像我在评论中提到的那样,您可能应该对键使用非窗口控件。
【讨论】:
SetWindowsHookEx() 就像rodrigo 建议的那样。这里有一些信息:delphi.about.com/od/kbwinshell/a/delphi_hook.htm 虽然我不确定它的年龄。
我见过的唯一方法是使用虚拟键盘EnableWindow(hWnd, FALSE) 禁用窗口。
现在,如果窗口被禁用,您将不会收到鼠标消息,对吧?您必须选择:
WM_SETCURSOR。它甚至被发送到禁用的窗口,并且在 lParam 的高位字中,您拥有原始消息的标识符(WM_LBUTTONDOWN 等)。可以使用GetMessagePos()读取光标的坐标。SetWindowsHookEx(WH_MOUSE, ...)。您可以完全控制鼠标消息。【讨论】:
使用一个不能获得键盘焦点,而只响应鼠标输入的类。
解决方案:从 TControl 或 TGraphicControl 派生虚拟键盘,而不是从 TWinControl 或 TCustomControl。
【讨论】:
这有帮助吗?
procedure WMMouseActivate(var Message: TWMMouseActivate); message WM_MOUSEACTIVATE;
procedure TMyForm.WMMouseActivate(var Message: TWMMouseActivate);
begin
Message.Result := MA_NOACTIVATE;
end;
【讨论】: