Jak zrealizovat "keyboard hook" pod Windows XP? – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Jak zrealizovat "keyboard hook" pod Windows XP? – C / C++ – Fórum – Programujte.comJak zrealizovat "keyboard hook" pod Windows XP? – C / C++ – Fórum – Programujte.com

 

oxidián0
Grafoman
13. 9. 2015   #1
-
0
-

Mám toto:

// keyboard hook
HHOOK hook;
KBDLLHOOKSTRUCT kbdStruct;

LRESULT __stdcall HookCallback(int nCode, WPARAM wParam, LPARAM lParam);
LRESULT __stdcall HookCallback(int nCode, WPARAM wParam, LPARAM lParam)
{
    if (nCode >= 0){
        // the action is valid: HC_ACTION.
        if (wParam == WM_KEYDOWN){
            // lParam is the pointer to the struct containing the data needed, so cast and assign it to kdbStruct.
            kbdStruct = *((KBDLLHOOKSTRUCT*)lParam);
            if (kbdStruct.vkCode == VK_F1) // a key (non-system) is pressed.
              MessageBox(NULL, "F1 is pressed!", "key pressed", MB_ICONINFORMATION);
        }
    }
    // call the next hook in the hook chain
    return CallNextHookEx(hook, nCode, wParam, lParam);
}

void SetHook(){ 
  hook = SetWindowsHookEx(WH_KEYBOARD_LL, HookCallback, NULL, 0);
  DWORD dw = GetLastError();
	if (!(hook = SetWindowsHookEx(WH_KEYBOARD_LL, HookCallback, NULL, 0)))
      MessageBox(NULL, "Failed to install hook!", "Error", MB_ICONERROR);
}

void ReleaseHook()
{
    UnhookWindowsHookEx(hook);
}
LRESULT CALLBACK MapWndProc(HWND window, UINT msg, WPARAM wParam, LPARAM lParam)
{
	LRESULT ret = 0;
	int i;

	switch (msg)
	{
	case WM_CREATE:
		ret = 0;
    SetHook();
		OnWM_Create(window, (CREATESTRUCT*)lParam);
		break;
...
}
}

Nejde mi zavést ten hook:

  hook = SetWindowsHookEx(WH_KEYBOARD_LL, HookCallback, NULL, 0);
  DWORD dw = GetLastError();


chyba 1428

Windows Error 1428 : ERROR_HOOK_NEEDS_HMOD: Cannot set nonlocal hook without a module handle.

Je mi jasné, že tam mám načíst nějaký module, knihovnu, ale nevím jakou a jak. Jak tam dostat ten handle?

Je to převzaté odsud:

http://www.unknowncheats.me/forum/c-and-c/83707-setwindowshookex-example.html

jenže to je verze která pod XP nejede pravděpodobně proto že je tam chybná syntaxe, a podle toho co jsem vyledal na netu tak v C# ve Windows 7 to jede, ale chyba v argumentu 3 a 4 tam je. Hledal jsem jednoduchý příklad pro C++ běžící pod XP a nenašel jsem nic.

Nahlásit jako SPAM
IP: 78.45.87.–
oxidián0
Grafoman
14. 9. 2015   #2
-
0
-

Už jsem přišel na jednodušší řešení, než akcelerátory a registrování hooku.

Mám však dotaz k funkci GetKeyState, je tam příklad kde se používá toto:

#define SHIFTED 0x8000 
nVirtKey = GetKeyState(VK_SHIFT); 
if (nVirtKey & SHIFTED) 
{ 
// Perform your action
}

To je skvělý trik jak celou věc zjednodušit, ale zajímá mě, jeslti se dá podobnou metodou zjistit jestli je při tom stisknutý ctrl nebo nějaká číslice? Prostě jak mám zjistit ten hexadecimální kód, protože na stránce s virtuálními klíči nic takového není.

Nahlásit jako SPAM
IP: 78.45.87.–
ondrej39+1
Věrný člen
14. 9. 2015   #3
-
0
-

#2 oxidián
Klíče k jednotlivých klávesám se dají najít zde. Nevím, jestli je to to, cos hledal :).

Nahlásit jako SPAM
IP: 79.141.243.–
Inject all the dependencies!
oxidián0
Grafoman
14. 9. 2015   #4
-
0
-

Psal jsem:

"Prostě jak mám zjistit ten hexadecimální kód, protože na stránce s virtuálními klíči nic takového není." Ta hodnota SHIFTED 0x8000 tu zjistili odkud? Chci něco jako CONTROL 0x..... pro to abych to mohl binárně použít jako masku.
 

Nahlásit jako SPAM
IP: 78.45.87.–
ondrej39+1
Věrný člen
14. 9. 2015   #5
-
0
-

#4 oxidián
Použij 0x8000 vždycky. Je to flag, kterým se zjišťuje, zda je klávesa stisknutá, nebo ne. Pokud provedeš logický and mezi výsledkem funkce GetKeyState() a hexadecimální hodnotou 0x8000 a výsledek toho andu bude logická 1, pak je klávesa stisknutá. Více přímo na msdn zde.

Nahlásit jako SPAM
IP: 79.141.243.–
Inject all the dependencies!
oxidián0
Grafoman
14. 9. 2015   #6
-
0
-

Dík za odkaz, tento je fakt užitečný. Píše se tam:

"In all four of the keyboard messages discussed so far, the wParam parameter contains the virtual-key code of the key. The lParam parameter contains some miscellaneous information packed into 32 bits. You typically do not need the information in lParam. One flag that might be useful is bit 30, the "previous key state" flag, which is set to 1 for repeated key-down messages."

Takže pokud chci zjistit jestli ctrl bylo nebo nebylo zmáčknuto dvakrát za sebou ale dlouhze nebo jednou, ale dlouze, tak musím vždy testovat ten bit 30?

Nahlásit jako SPAM
IP: 78.45.87.–
ondrej39+1
Věrný člen
15. 9. 2015   #7
-
0
-

#6 oxidián
Nevím, vyzkoušej, uvidíš, ve WinAPI jsem nedělal prakticky vůbec nic.

Nahlásit jako SPAM
IP: 79.141.243.–
Inject all the dependencies!
oxidián0
Grafoman
15. 9. 2015   #8
-
0
-

Nejlepší pro mě bude použít WM_KEYUP

Nahlásit jako SPAM
IP: 78.45.87.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 30 hostů

Podobná vlákna

Programy pod windows — založil Jakub Vojáček

Delphi pod Windows 7 — založil jozosandy

Kompliace PERLu pod Windows — založil General

Problem len pod Windows 7 — založil Tomas

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý