[英]C++ Win32 Prevent window Activation allow input
我正在嘗試為現有應用程序制作一個自定義的屏幕鍵盤(我無法控制)
我打算與之一起使用的程序僅需某些鍵(數字+一些字母),並在觸摸屏環境中使用
但是,由於屏幕空間非常昂貴,因此無法使用內置的屏幕鍵盤。
因此,我正在嘗試使用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
關於我要去哪里錯誤/還有其他嘗試的建議嗎?
謝謝
詹姆士
我不確定您可能還有其他要求,但是閱讀您的文章后,我想您可以使用RegisterRawInputDevices功能,該功能允許您從不活動的窗口中檢索輸入信息。 另外,您可以使用WM_INPUT消息來處理輸入信息,因此消息循環可能不會過多地延遲您發布的代碼。
我不會在此答復中放置代碼段,而是將鏈接添加到MSDN示例 (其中包含代碼段)。 該示例可能指導您使用Win32 API中的所有相關功能來檢索原始輸入數據。
關於窗口焦點,您可以在創建窗口時使用WS_EX_NOACTIVATE樣式,因為注冊原始輸入后仍會收到WM_INPUT消息。
最后,請注意,由於Windows對屏幕虛擬鍵盤(TabTip)的額外支持,因此您可能會對操作系統遇到其他挑戰。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.