IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: C# odchytávání klávesových zkratek

Aktivity
Avatar
jaroox
Člen
Avatar
jaroox:23.9.2017 18:42

Ahoj. Narazil jsem na problém při vývoji jedné aplikace. Jde o to, že potřebuji, aby program běžel na pozadí a aby se při dané klávesové zkratce objevilo třeba okno programu. Všechno, co jsem našel, fungovalo jen v oknech, ale ne mimo ně. Pak jsem také našel řešení pomocí timeru, jehož princip využívá keylogger, který je popsán v článcích na tomto webu. Ale takové řešení se mi zdá neefektivní. Proto se chci zeptat, jestli někdo neví, jak na to. Děkuji za Vaše rady. :)

 
Odpovědět
23.9.2017 18:42
Avatar
Nahoru Odpovědět
23.9.2017 21:41
Neaktivní uživatelský účet
Avatar
jaroox
Člen
Avatar
Odpovídá na Neaktivní uživatel
jaroox:23.9.2017 21:51

Něco podobného už jsem našel. Problém je ale v tom, že aby to fungovalo, musím mít spuštěné nějaké okno.

 
Nahoru Odpovědět
23.9.2017 21:51
Avatar
Odpovídá na jaroox
Neaktivní uživatel:23.9.2017 21:54

A je problém spustit okno, schovat ho a odstranit z lišty?

Nahoru Odpovědět
23.9.2017 21:54
Neaktivní uživatelský účet
Avatar
jaroox
Člen
Avatar
jaroox:23.9.2017 21:58

No... Celkem je, protože znalý uživatel Windows 10 ho uvidí.

 
Nahoru Odpovědět
23.9.2017 21:58
Avatar
Odpovídá na jaroox
Neaktivní uživatel:23.9.2017 22:44

A co se snažíš udělat? Aby to odchytávalo klávesy a uživatel o tom nevěděl?

Nahoru Odpovědět
23.9.2017 22:44
Neaktivní uživatelský účet
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na jaroox
Martin Dráb:24.9.2017 1:47

Nevím, jak v C#, ale zřejmě hledáš něco, co dělá funkce RegisterHotKey (https://msdn.microsoft.com/…=vs.85).aspx). Pokud je stisknuta tebou zaregistrovaná klávesnová zkratka, pošle se zpráva WM_HOTKEY oknu, jehož handle jsi uvedl v prvním parametru volání této funkce. Pokud jsi tam uvedl NULL, tak se zpráva pošle vláknu, která tu klávesovou zkratu registrovalo (což pravděpodobně chceš).

Znamená to ale, že vlákno, které klávesovou zkratku registruje, musí mít smyčku zpráv (obvykle ve smyčce přijímat zprávy funkcí GetMessage či PeekMessage).

Na tom Stack Overflow zřejmě ukazují tento postup (ale je to zabalené do .NETových tříd), takže když se podíváš na třídu HotKey do dokumentace, mohl bys najít, jak zajistit posílání zpráv vláknu.

Alternativou je použití háku WH_KEYBOARD_LL, leč tam také to vlákno musí mít smyčku zpráv, navíc není úplně triviální napsat handler pro ten hák tak, aby ostatní aplikace fungovalo jako doposud. Také by šlo použít WH_KEYBOARD, ale to znamená dát handler toho háku do separádní DLL knihovny, což asi nccheš...

Nic z toho není C#, na druhou stranu, ty funkce tam jdou doimportovat.

Nahoru Odpovědět
24.9.2017 1:47
2 + 2 = 5 for extremely large values of 2
Avatar
jaroox
Člen
Avatar
Odpovídá na Neaktivní uživatel
jaroox:24.9.2017 12:51

Moje aplikace poběží z 90% času na pozadí. Nechci mít permanentně otevřené nějaké okno. Po stisku dané klávesové zkratky by se mělo okno pro uživatele otevřít a pak bude na něm, co s ním udělá.

 
Nahoru Odpovědět
24.9.2017 12:51
Avatar
jaroox
Člen
Avatar
Odpovídá na Martin Dráb
jaroox:24.9.2017 12:53

Nakonec jsem našel tuto třídu (https://stackoverflow.com/…-application - řešení s nejlepším hodnocením), který plně vyhovuje mým požadavkům.

 
Nahoru Odpovědět
24.9.2017 12:53
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na jaroox
Martin Dráb:24.9.2017 13:04

Ano, skryté okno je také řešení.

Nahoru Odpovědět
24.9.2017 13:04
2 + 2 = 5 for extremely large values of 2
Avatar
Petr Čech
Tvůrce
Avatar
Petr Čech:24.9.2017 14:28

Mimochodem.. já používám knihovnu MouseKeyHook - má to dostatečnou úroveň abstrakce, takže se nemusíš hrabat ve Windows API: https://www.nuget.org/…ouseKeyHook/

Nahoru Odpovědět
24.9.2017 14:28
the cake is a lie
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 11 zpráv z 11.