Перехват и предотвращение нажатия клавиши ALT для указанного окна c - PullRequest
0 голосов
/ 09 мая 2020

Я создал приложение C#, которое принимает другой обработчик окна и его процесс, как в этом сообщении , я могу отправить некоторую команду из моего приложения в окно через PostMessage, и это окно реагирует соответственно даже когда неактивен.

Проблема возникает, когда я нажимаю ALT и это окно реагирует на ALT + my_key_command как горячую клавишу. Объясните, пожалуйста, как предотвратить обработку события нажатия клавиши ALT в указанном окне c из моего приложения? Возможно ли это?

Я хочу закрыть только это окно для клавиши ALT. Вот пример:

    [DllImport("user32.dll")]
    static extern bool PostMessage(IntPtr hWnd, UInt32 Msg, int wParam, int lParam);

    [DllImport("user32.dll")]
    private static extern IntPtr GetForegroundWindow();

    [DllImport("user32.dll", SetLastError = true)]
    private static extern int GetWindowThreadProcessId(IntPtr hWnd, out int lpdwProcessId);

    [STAThread]
    static async Task Main()
    {
        await Task.Delay(TimeSpan.FromSeconds(5));
        IntPtr window = GetForegroundWindow();

        while (true)
        {
            int processId;
            GetWindowThreadProcessId(window, out processId);
            Process[] processes = Process.GetProcessesByName("iexplorer");
            var process = findProcessById(processes, processId);
            if (process != null)
            {
                PostMessage(process.MainWindowHandle, WM_KEYDOWN, 0x74, 0);
            }
            Thread.Sleep(5000);
        }
    }

    static private Process findProcessById(Process[] processes, int id)
    {
        Process result = null;
        foreach (Process proc in processes)
        {
            if (proc.Id == id)
                result = proc;
        }
        return result;
    }

1 Ответ

0 голосов
/ 11 мая 2020

Этот код хорошо подходит для этих целей, но приложение обрабатывает команды ALT + F5 и F5 по-разному, поэтому мне вообще не нужны ALT + F5. Вот почему я сначала думаю заблокировать клавишу ALT.

Пожалуйста, используйте SetWindowsHookEx и WH_KEYBOARD .

Вам нужно ввести dll, содержащую крючок клавиатуры в целевую программу. Установив крючок клавиатуры и предотвратив возврат клавиши ALT.

Пример кода: (C ++)

.dll:

// dllmain.cpp : Defines the entry point for the DLL application.
#include "pch.h"
#include <windows.h>
#include <iostream>
#include <stdio.h>

HINSTANCE hinst;
#pragma data_seg(".shared")
HHOOK hhk;
#pragma data_seg()

LRESULT CALLBACK wireKeyboardProc(int code, WPARAM wParam, LPARAM lParam) {
    if (code >= 0)
    {       
        switch (wParam)
        {
             case VK_MENU:
             {
                 return 1;
             }
        }
    }
    return CallNextHookEx(hhk, code, wParam, lParam);
}

extern "C" __declspec(dllexport) void install(unsigned long threadID) {
    hhk = SetWindowsHookEx(WH_KEYBOARD, wireKeyboardProc, hinst, threadID);
}
extern "C" __declspec(dllexport) void uninstall() {
    UnhookWindowsHookEx(hhk);
}

BOOL WINAPI DllMain(__in HINSTANCE hinstDLL, __in  DWORD fdwReason, __in  LPVOID lpvReserved) {
    hinst = hinstDLL;
    return TRUE;
}

. cpp

#include <Windows.h>
#include <stdio.h>
#include <tchar.h>

unsigned long GetTargetThreadIdFromWindow(const char* className, const char* windowName)
{
    HWND targetWnd;
    HANDLE hProcess;
    unsigned long processID = 0;

    targetWnd = FindWindow(className, windowName);
    return GetWindowThreadProcessId(targetWnd, &processID);
}

int main() {
    unsigned long threadID = GetTargetThreadIdFromWindow("Notepad", "1.txt - Notepad"); // Use Notepad for test
    printf("TID: %i", threadID);

    HINSTANCE hinst = LoadLibrary(_T("Mydll.dll"));

    if (hinst) {
        typedef void (*Install)(unsigned long);
        typedef void (*Uninstall)();

        Install install = (Install)GetProcAddress(hinst, "install");
        Uninstall uninstall = (Uninstall)GetProcAddress(hinst, "uninstall");

        install(threadID);

        MSG msg = {};

        while (GetMessage(&msg, NULL, 0, 0)) {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }

        uninstall();
    }

    return 0;
}

Я использую блокнот в качестве тестового объекта, и он отлично работает. Это код c ++, вы можете преобразовать его в код C # в соответствии с вашими потребностями.

...