SendInput do zminimalizowanego okna

SendInput do zminimalizowanego okna
Hodor
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 337
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:

Kopiuj
#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:

Kopiuj
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.

Jacek Milewski
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 30
0

podpinam się do pytania

overcq
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 402
1

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

UZ
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 36
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():

Kopiuj
#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);
}

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.