SendInput do zminimalizowanego okna

0

Jest jakiś sposób żeby wykonała się funkcja SendInput() do zminimalizowanego okna (czyli takiego, które nie jest aktywne, nie jest 'na górze') ? Chciałbym wysłać np. keypress '5' do zminimalizowanego Kalkulatora za pomocą SendInput.

Aktualnie mam taki kod:

#define WINVER 0x0500
#include <windows.h>

int main()
{
    Sleep(2000);
    INPUT ip;

    ip.type = INPUT_KEYBOARD;
    ip.ki.time = 0;
    ip.ki.wVk = 0;
    ip.ki.dwExtraInfo = 0;

    ip.ki.dwFlags = KEYEVENTF_SCANCODE;
    ip.ki.wScan = 0x2E; // Unicode for letter 'A'

    // Press
    SendInput(1, &ip, sizeof(INPUT));

    // Release
    ip.ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP;
    SendInput(1, &ip, sizeof(INPUT));
}

Wysyła literę 'a' do aktywnego okna.

Taki kod działa dobrze do zminimalizowanego okna:

PostMessage(FindWindow(NULL, "Kalkulator"), WM_CHAR, '5', 0);

ale muszę skorzystać z SendInput, więc PostMessage, keybd_event(), SendMessage, itp. odpada.

Z góry dzięki za nakierowanie.

0

podpinam się do pytania

1

Z tego, co piszą tutaj, nie jest to możliwe.

3

Niestety, SendInput() nie będzie działał na zminimalizowanym oknie, ponieważ wymaga on, aby okno było aktywne i na górze w stosunku do innych okien. Istnieją jednak pewne sposoby obejścia tego problemu, chociaż wymagają one użycia innych funkcji systemowych i są mniej intuicyjne.

Jednym ze sposobów jest użycie funkcji AttachThreadInput(), która umożliwia przypisanie wątku do okna, co pozwala na wysłanie danych wejściowych do okna, nawet jeśli nie jest ono aktywne. W tym celu należy:

Uzyskać identyfikator wątku procesu, do którego należy okno. Można to zrobić za pomocą funkcji GetWindowThreadProcessId().

Uzyskać identyfikator bieżącego wątku, używając funkcji GetCurrentThreadId().

Wywołać funkcję AttachThreadInput(), przekazując identyfikatory wątków procesu i bieżącego wątku.

Wysłać dane wejściowe do okna za pomocą funkcji SendInput().

Wywołać funkcję AttachThreadInput() ponownie, przekazując wartość FALSE jako trzeci argument, aby zakończyć powiązanie wątków.

Oto przykładowy kod, który wysyła keypress '5' do zminimalizowanego okna Kalkulatora za pomocą funkcji SendInput():

#define WINVER 0x0500
#include <windows.h>

int main()
{
    Sleep(2000);
    INPUT ip;

    ip.type = INPUT_KEYBOARD;
    ip.ki.time = 0;
    ip.ki.wVk = 0;
    ip.ki.dwExtraInfo = 0;

    ip.ki.dwFlags = KEYEVENTF_SCANCODE;
    ip.ki.wScan = 0x06; // Scan code for '5'

    // Get the window handle for the Calculator window
    HWND hwndCalc = FindWindow(NULL, "Kalkulator");

    // Get the thread ID for the Calculator process
    DWORD dwCalcThread = GetWindowThreadProcessId(hwndCalc, NULL);

    // Get the thread ID for the current process
    DWORD dwCurrentThread = GetCurrentThreadId();

    // Attach the input threads
    AttachThreadInput(dwCurrentThread, dwCalcThread, TRUE);

    // Press
    SendInput(1, &ip, sizeof(INPUT));

    // Release
    ip.ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP;
    SendInput(1, &ip, sizeof(INPUT));

    // Detach the input threads
    AttachThreadInput(dwCurrentThread, dwCalcThread, FALSE);
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1