c++ Win32防止窗口激活允许输入
C++ Win32 Prevent window Activation allow input
我正在尝试为现有应用程序(我无法控制)自定义屏幕键盘
我打算使用它的程序只需要某些键(数字+一些字母),并且正在触摸屏环境中使用
然而,由于屏幕空间非常宝贵,使用内置的屏幕键盘是不可能的。
因此,我正在尝试使用Win32制作一个简单的GUI,但是我似乎找不到一种方法来防止窗口被激活(正在使用的窗口),同时也不能阻止我能够从所述窗口接收输入。
我已经尝试创建带有标志的窗口来阻止激活- WS_EX_NOACTIVATE然而,当我这样做时,我似乎无法在另一个程序中接收我的模拟输入。
我知道我的输入代码工作(使用睡眠测试,然后点击其他窗口)
我也试过使用ShowWindow在按下按钮后从窗口中删除激活,但无济于事。
我的代码简化为:main.cpp:
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <winable.h>
#include "resource.h"
BOOL CALLBACK DialogProc(HWND H,UINT M,WPARAM W,LPARAM L)
{
switch(M)
{
case WM_INITDIALOG:
{
return TRUE;
}
case WM_CLOSE:
{
EndDialog(H,0);
return TRUE;
}
case WM_COMMAND:
{
ShowWindow(H, SW_SHOWNOACTIVATE);
switch(LOWORD(W))
{
case A_KEY:
{
//Sleep(500);
INPUT ip;
// Set up a generic keyboard event.
ip.type = INPUT_KEYBOARD;
ip.ki.wScan = 0; // hardware scan code for key
ip.ki.time = 0;
ip.ki.dwExtraInfo = 0;
// Press the "A" key
ip.ki.wVk = 0x41; // virtual-key code for the "a" key
ip.ki.dwFlags = 0; // 0 for key press
SendInput(1, &ip, sizeof(INPUT));
// Release the "A" key
ip.ki.dwFlags = KEYEVENTF_KEYUP; // KEYEVENTF_KEYUP for key release
SendInput(1, &ip, sizeof(INPUT));
return TRUE;
};
}
}
}
return FALSE;
}
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
return DialogBox(hInstance, MAKEINTRESOURCE(DLG_MAIN), NULL, (DLGPROC)DialogProc);
}
resource.h:
#include <windows.h>
#define DLG_MAIN 1000
#define A_KEY 2000
resource.rc:
#include "resource.h"
DLG_MAIN DIALOG 0,0,300,111
CAPTION ""
STYLE WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_EX_TOPMOST|DS_SETFOREGROUND//WS_EX_NOACTIVATE
BEGIN
CONTROL "A", A_KEY, "Button", WS_VISIBLE, 2, 2), 20, 20
END
有什么建议,我在哪里做错了/还有什么要尝试?
感谢詹姆斯我不确定您可能有其他要求,但是阅读您的帖子,我认为您可以使用RegisterRawInputDevices功能,该功能允许您从非活动窗口检索输入信息。此外,你的消息循环可能不会从你发布的代码中延迟"很多",因为你可以使用WM_INPUT消息来处理输入信息。
我将添加一个链接到MSDN示例(其中有一个代码片段),而不是在此回复中放置代码片段。该示例可以指导您使用Win32 API中可用的所有相关功能来检索原始输入数据。
关于窗口焦点,您可以在创建窗口时使用WS_EX_NOACTIVATE样式,因为在注册原始输入后您仍然会收到WM_INPUT消息。
最后,请注意,现在Windows有了额外的屏幕虚拟键盘(TabTip)支持,您在操作系统上可能会遇到其他挑战。
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 2D数组来自文本输入,中间有空格
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 检查输入是否不是整数或数字
- 正在尝试了解输入验证循环
- 读取文件并输入到矢量中
- 多个输入输入 for 循环
- 当我输入一个字母时,cin 输入(输入是一个 int),而不是打印错误一次,它打印正确一次,然后在循环的其余部分打印 i
- 将输入输入到 c++ 数组时出现运行时错误
- 它不会打印出基于用户输入 c++ 输入的任务
- 将用户输入验证为整数:用户必须两次输入输入
- 是否可以将输入输入作为参数
- C 必须将输入输入两次
- 在C++程序运行时输入输入值 (./filename.out)
- 即使我做了>> cin ,也不让我输入输入
- 在没有用户输入输入的情况下中断while循环
- visual将c++ Gui中的输入输入到另一个c++程序中
- 在C中输入输入后,输出窗口关闭
- 将Python的输入输入到c++程序中
- 带空格的输入输入所有循环