【发布时间】:2014-08-05 18:37:18
【问题描述】:
我正在尝试为现有应用程序(我无法控制)制作自定义屏幕键盘
我打算使用它的程序只需要某些键(数字+一些字母)并且正在触摸屏环境中使用
但是,由于屏幕空间非常宝贵,因此使用内置屏幕键盘是不可能的。
因此,我正在尝试使用 Win32 制作一个基于 GUI 的简单 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
关于我哪里出错/还有什么可以尝试的任何建议?
谢谢
詹姆斯
【问题讨论】:
-
处理
WM_MOUSEACTIVATE消息并返回MA_NOACTIVATE。 -
我尝试在 switch(M) 部分下添加一个额外的案例,这样做但它仍然不起作用,窗口仍然聚焦,我收到一个错误提示,告诉我我的类型不能,那是放那个箱子的正确地方吗?
-
请记住,要从对话过程中返回一个值,您需要使用
SetWindowLongPtr(hWnd, DWLP_MSGRESULT, <value>);而不是简单地返回它。 -
不知道 - 刚开始学习 C/C++,但现在我按一个按钮时整个对话框都消失了,并且没有输入任何文本?
标签: c++ windows winapi win32gui