Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Globalne wykrywanie wciśniętego klawisza C++


Rekomendowane odpowiedzi

Opublikowano

Witam. Już od kilku dni męczę się z tym problemem, aby po wciśnięciu danego klawisza uruchomić daną funkcję, gdy program konsolowy jest zminimalizowany. Próbowałem już wielu kodów, lecz przeważnie nie wiedziałem jak użyć tego kodu, lub nie chciało się skompilować. Do kompilacji używam programu Dev C++ . Może mnie ktoś nakierować na rozwiązanie mojego problemu ??

Kocham mpcforum.pl!!!

18706.png

Opublikowano

Aby program przechwytywał wszystkie komunikaty z klawiatury, musisz założyć niskopoziomowy hak na klawiaturę.

 

Przykładowy kod wyświetlający wciśnięty klawisz:

 

 

#include <iostream>
#include <Windows.h>
 
HHOOK hook;
 
LRESULT CALLBACK LLKeyboardProc(int code, WPARAM wParam, LPARAM lParam)
{
    LPKBDLLHOOKSTRUCT kbStruct = (LPKBDLLHOOKSTRUCT)lParam;
 
    if (code >= 0)
    {
        if (wParam == WM_KEYDOWN)
        {
            BYTE kbState[256];
            GetKeyboardState(kbState);
            LPWSTR buffer = new WCHAR[16];
            ToUnicode(kbStruct->vkCode, kbStruct->scanCode, kbState, buffer, 16, 0);
            wprintf(buffer);
            delete[] buffer;
        }
    }
    return CallNextHookEx(hook, code, wParam, lParam);
}
 
int main() 
{
    hook = SetWindowsHookEx(WH_KEYBOARD_LL, LLKeyboardProc, 0, 0);
    while (GetMessage(0, 0, 0, 0)){}
}

 

 

 

Opublikowano

Wielkie dzięki kolego. A gdy chciałbym wciśnięty klawisz do warunku If to muszę to zmienić z Unikode w string za pomocą WideCharToMultiByte ?? Jeśli tak to w jaki sposob ??

Kocham mpcforum.pl!!!

18706.png

Opublikowano

A gdy chciałbym wciśnięty klawisz do warunku If 

 

Wtedy porównujesz element vkCode z struktury LPKBDLLHOOKSTRUCT z kodem wirtualnego klawisza. Ich lista jest dostępna pod tym adresem.

 

Przykład:

 

 

#include <iostream>
#include <Windows.h>
 
HHOOK hook;
 
LRESULT CALLBACK LLKeyboardProc(int code, WPARAM wParam, LPARAM lParam)
{
    LPKBDLLHOOKSTRUCT kbStruct = (LPKBDLLHOOKSTRUCT)lParam;
 
    if (code >= 0)
    {
        if (wParam == WM_KEYDOWN)
        {
            if (kbStruct->vkCode == 0x50)
                MessageBox(0, "Wciśnięto klawisz P", 0, MB_ICONINFORMATION);
        }
    }
    return CallNextHookEx(hook, code, wParam, lParam);
}
 
int main() 
{
    hook = SetWindowsHookEx(WH_KEYBOARD_LL, LLKeyboardProc, 0, 0);
    while (GetMessage(0, 0, 0, 0)){}
}

 

 

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...