簡體   English   中英

C ++ Win32防止窗口激活允許輸入

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM