我正在使用虚拟键盘问题是当我按下虚拟键盘上的键时,需要发送数据的窗口失去焦点。我怎么能避免这种情况?
答案 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()
来读取光标的坐标。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导出。