Win32 API で透明ウィンドウからのマウス入力をブロックする方法は?

ベーン

作成しているプログラムが所有していないプロセスにメイン ウィンドウがあります。Windows Hookこのメイン ウィンドウに子ウィンドウを追加する目的で、このプロセスに DLL を挿入するために使用しています。

私の最終目標はWS_EX_LAYERED、内部に色付きの境界線を作成できるが、中央部分を透明にしてマウス クリックを許可するウィンドウを作成することでした。この部分は完全に機能します。

WNDCLASS wndClass = {};
wndClass.style = CS_HREDRAW | CS_VREDRAW;
wndClass.lpfnWndProc = OverlayProc;
wndClass.hInstance = g_TargetInstance;
wndClass.hbrBackground = (HBRUSH)CreateSolidBrush(RGB(0, 255, 255));
wndClass.lpszClassName = "OVERLAY";

RegisterClass(&wndClass);
g_Window = CreateWindowEx(WS_EX_LAYERED | WS_EX_TRANSPARENT, "OVERLAY", nullptr,
    WS_CHILDWINDOW, rect.left, rect.top, rect.right+1, rect.bottom+1, data->hwnd, nullptr, g_TargetInstance, nullptr);

SetLayeredWindowAttributes(g_Window, RGB(0, 255, 255), 0, LWA_COLORKEY);

ShowWindow(g_Window, SW_SHOW);
UpdateWindow(g_Window);

これの 2 番目の部分は、親ウィンドウへのすべてのマウス入力を条件付きでブロックしたかったことです。WS_EX_LAYEREDウィンドウの透明部分ではこれを行うことができなかったのでSTATIC、メイン ウィンドウの子として2 番目の透明コントロールを作成しようとしましたが、これもマウス入力をブロックしません。

また、シミュレートされたマウス クリックを、 への呼び出しPostMessage、引き渡しWM_LBUTTONDOWN、およびを介して親ウィンドウに送信していますWM_LBUTTONUP透明なウィンドウを介して親ウィンドウへのすべてのマウス入力をブロックするにはどうすればよいですか?

ベーン

これは、兄弟コントロール上に描画された単純な透明ウィンドウでは実行できないようです。私が行ったことは、メイン ウィンドウの WndProc 関数を置き換えてマウス メッセージをインターセプトするために使用するプロセスにフックSetWindowHookExを追加するWH_GETMESSAGEために使用することでした。シミュレートされたマウス メッセージにwParam引数の特定の値をタグ付けして、プロシージャがシミュレートされ、その値を削除して、親ウィンドウに渡します。

クリック メッセージで「タグ」値が検出されない場合、マウス メッセージを飲み込み、元の WndProc 関数に渡しません。

インジェクションされた WndProc 置換

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData)
{
    switch (uMsg)
    {
        case WM_LBUTTONDOWN:
            wParam -= 11141008;
            if (wParam != MK_LBUTTON && !g_Paused)
                return 0;
            break;

        case WM_LBUTTONUP:
            wParam -= 11141008;
            if (wParam != 0 && !g_Paused)
                return 0;
            break;

        case WM_MOUSEHOVER:
        case WM_MOUSEMOVE:
            if (!g_Paused)
                return 0;
    }

    return DefSubclassProc(hWnd, uMsg, wParam, lParam);
}

Windows フック関数のスニペット

//...
switch (data->message)
{
    case (WM_USER + 1):
    {
        g_Paused = FALSE;
        //...
        SetWindowSubclass(data->hwnd, WndProc, 1, 0);
        break;
    }

    case (WM_USER + 2):
    {
        RemoveWindowSubclass(data->hwnd, WndProc, 1);
        //...
        break;
    }
}
//...

ウィンドウ フック関数内のコードを使用して、メイン プロセス ウィンドウをサブクラス化し、独自の WndProc 関数を挿入して、マウス入力を希望どおりに処理します。

これは、ウィンドウを物理的にクリックせずにマウス クリックを「シミュレート」するために使用されるコードです。wParamこのクリックがシミュレートされたものであり、ユーザーが生成したものではないことを識別するための付加価値に注意してください

void Window::LeftClick(DWORD x, DWORD y, DWORD delayMillis)
{
    LPARAM lparam = MAKELPARAM(x, y);

    lock_guard<mutex> lock(this->m_ClickMutex);

    PostMessage(this->m_Window, WM_LBUTTONDOWN, 11141008 + MK_LBUTTON, lparam);
    this_thread::sleep_for(std::chrono::milliseconds(delayMillis));
    PostMessage(this->m_Window, WM_LBUTTONUP, 11141008, lparam);
}

また、私の言葉の選択をridrid笑し、キーボード入力をシミュレートするsimulatedために使用PostMessageすることに対する追加の批判をridrid笑していたコメントの人のために、(私の目的のために)完璧かつ非常に確実に機能する私のキーボード入力テスト方法を次に示します。

void GameWindow::KeyPress(UINT vkCode) const
{
    UINT scanCode = MapVirtualKey(vkCode, MAPVK_VK_TO_VSC);
    LPARAM lparam1 = MAKELPARAM(1, scanCode);
    LPARAM lparam2 = MAKELPARAM(1, 0xC000 | scanCode);

    PostMessage(this->m_Window, WM_KEYDOWN, vkCode, lparam1);
    this_thread::sleep_for(chrono::milliseconds(25));
    PostMessage(this->m_Window, WM_KEYUP, vkCode, lparam2);
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Spy ++ Win32 API Spy ++情報からウィンドウインスタンスを取得する

分類Dev

Win32 API、ゲーム用の子ウィンドウを取得

分類Dev

win32 apiを使用してタイトルでウィンドウハンドルを取得する方法はありますか?

分類Dev

Win32 APIの変数を宣言する方法は?

分類Dev

WIN32 API Cプログラム:コンボボックスに空のリストがあるか、CB_ADDSTRINGが入力されているにもかかわらずドロップダウンしない

分類Dev

PythonでWin32 APIを使用する方法

分類Dev

Win32のCortana

分類Dev

Win32 API が CreateWindowW() に失敗する

分類Dev

Win32 APIのwaveInGetErrorText宣言をC#に

分類Dev

Win32 APIを使用してカスタムポップアップウィンドウにEDITコントロールを配置するにはどうすればよいですか?

分類Dev

Win32 APIとJavaソケットフラッシュ(TCP)

分類Dev

Java to Win32 Crypto API

分類Dev

Common Item DialogまたはGetOpenFileNameのどちらを表示するか?(Win32 API)

分類Dev

LinuxのWin32 APIに相当するものは何ですか?

分類Dev

Win32 APIのPosix popen()に相当するものは何ですか?

分類Dev

Win32 APIのPosix popen()に相当するものは何ですか?

分類Dev

JavaからのWin32 APIメソッドの呼び出し

分類Dev

C Win32 Api:編集が終了したら編集ボックスを更新

分類Dev

Win32 API:エアロ効果のあるボタンを作成

分類Dev

Win32 APIのMK_CONTROLとVK_CONTROLの違いは何ですか?

分類Dev

Win32 API:ダイアログウィンドウを開いた後にアプリがフリーズする

分類Dev

Win32 API:編集コントロールでEscキーをキャッチする方法は?

分類Dev

win32apiで印刷する前にセットアップウィンドウを表示する方法は?

分類Dev

Win32スレッド

分類Dev

SendInput(Win32 API)を介したキーボード入力は機能しませんが、ハードウェアは機能します

分類Dev

Masmプログラムが機能しない(Win32 APIを使用-CreateFile)

分類Dev

win32低レベルメッセージAPIを使用したCAdES署名

分類Dev

Win32 APIを使用して開いたアプリケーションのウィンドウ(メモ帳、Word、Outlook、Chromeなど)を管理するにはどうすればよいですか?

分類Dev

Win-32 API関数を介してcmd.exeウィンドウの「スクロールモード」をアクティブ化するにはどうすればよいですか?

Related 関連記事

  1. 1

    Spy ++ Win32 API Spy ++情報からウィンドウインスタンスを取得する

  2. 2

    Win32 API、ゲーム用の子ウィンドウを取得

  3. 3

    win32 apiを使用してタイトルでウィンドウハンドルを取得する方法はありますか?

  4. 4

    Win32 APIの変数を宣言する方法は?

  5. 5

    WIN32 API Cプログラム:コンボボックスに空のリストがあるか、CB_ADDSTRINGが入力されているにもかかわらずドロップダウンしない

  6. 6

    PythonでWin32 APIを使用する方法

  7. 7

    Win32のCortana

  8. 8

    Win32 API が CreateWindowW() に失敗する

  9. 9

    Win32 APIのwaveInGetErrorText宣言をC#に

  10. 10

    Win32 APIを使用してカスタムポップアップウィンドウにEDITコントロールを配置するにはどうすればよいですか?

  11. 11

    Win32 APIとJavaソケットフラッシュ(TCP)

  12. 12

    Java to Win32 Crypto API

  13. 13

    Common Item DialogまたはGetOpenFileNameのどちらを表示するか?(Win32 API)

  14. 14

    LinuxのWin32 APIに相当するものは何ですか?

  15. 15

    Win32 APIのPosix popen()に相当するものは何ですか?

  16. 16

    Win32 APIのPosix popen()に相当するものは何ですか?

  17. 17

    JavaからのWin32 APIメソッドの呼び出し

  18. 18

    C Win32 Api:編集が終了したら編集ボックスを更新

  19. 19

    Win32 API:エアロ効果のあるボタンを作成

  20. 20

    Win32 APIのMK_CONTROLとVK_CONTROLの違いは何ですか?

  21. 21

    Win32 API:ダイアログウィンドウを開いた後にアプリがフリーズする

  22. 22

    Win32 API:編集コントロールでEscキーをキャッチする方法は?

  23. 23

    win32apiで印刷する前にセットアップウィンドウを表示する方法は?

  24. 24

    Win32スレッド

  25. 25

    SendInput(Win32 API)を介したキーボード入力は機能しませんが、ハードウェアは機能します

  26. 26

    Masmプログラムが機能しない(Win32 APIを使用-CreateFile)

  27. 27

    win32低レベルメッセージAPIを使用したCAdES署名

  28. 28

    Win32 APIを使用して開いたアプリケーションのウィンドウ(メモ帳、Word、Outlook、Chromeなど)を管理するにはどうすればよいですか?

  29. 29

    Win-32 API関数を介してcmd.exeウィンドウの「スクロールモード」をアクティブ化するにはどうすればよいですか?

ホットタグ

アーカイブ