Odbieranie zdarzeń spoza fokusu

0

Witam.

Usiłuję napisać prosty program używajac WinAPI, coś ala makro np. naciszkasz F8 a program klika myszą w takim a takim miejscu. No więc przy pomocy tutoriali wiem jak stworzyć okienko, wiem jak sprawdzić czy klawisz jest wciśnięty... problem pojawia się wtedy, gdy chcę spuścić program do paska zadań (bo taki jest główny cel, program chodzi sobie w tle i jak nacisne to F8 to coś się dzieje). Tyle tylko że gdy program traci fokus, przestaje reagować na naciskane klawisze - jak zrobić żeby reagował niezależnie od tego jakie okno jest teraz aktywne?

0

skorzytaj z Hook'ow a gdzie patrz google albo tutaj na pewno gdzies byl jakis artykul na ten temat ;]

0

Szukam, i widzę, ale to wszystko za mądre, pourywane kawałki kodu które ni wiadomo gdzie wstawić i w ogóle dużo ponad moją znajomość C++ o.O.
Czy ktoś nie wie może gdzie znaleźć można PEŁNY przykład zastosowania hooków właśnie w ten sposób (naciskamy klawisz a program coś tam robi niezależnie czy jego okno było aktualnie aktywne czy nie)?

0

no to jak ty chcesz cos pisac nie znajac jezyka? :O

poszukaj WinMacro na codeguru.com albo codeproject.net, dostepna jest tez skompilowana wersja

0

Co do nieznania języka: "nie Od razu Kraków zbudowano":P
Znam podstawy, i cały czas się uczę, ale to co znajduję na ten temat jest jakieś chore... przecież reakcja programu na wciśnięty klawisz jest czynnością tak prostą że chyba MUSI się to dać zrobić jakoś łatwiej niż w tych wszystkich znalezionych przeze mnie przykładach ( które miało po 10 plików źródłowych, wymagały oddzielnych plików dll i właściwie większość funkcji w nich zastosowanych była mi obca). Jedyne do czego doSZEDŁem to to że najprościej będzie zastosować WH_JOURNALRECORD (bo nie wymaga żadnych plików dll i wtedy wszystko się może zawrzeć w jednym pliku z kodem). Tyle tylko ze dalej nie mam pojęcia jak dokładnie to miałoby wyglądać:/

0

a o hotkey'ach to nikt nie słyszał?? poczytać o RegisterHotKey - kiedyś stuknąłem programik do 'zdalnego' sterowania WMP właśnie w oparciu o hotkey'e /znaczy się wmp gdzieś zminimalizowany, a ja sobie pisząć powiedzmy w notatniku steruję poprzez hotkey'e/.

0

ja tez kiedys pisalem taki programik i uzywalem tylko funkcji GetAsyncKeyState i ta funckja zawsze sprawdzala czy wcisnieto jakis klawisz ( tzn z definicji czy wcisnieto od ostatniego wywlania tej funkcji ) i obeszlo sie bez HOOKów i Hotkeyjów :)

0

GetAsyncKeyState - chyba w pętli, a to zajmuje czas procesora... hotkey to najlepsze wyjście /sytem po wciśnięciu klawisza powiadamia program o wywołaniu hotkeya poprzez WM_HOTKEY/

0

Z opisu funkcji RegisterHotkey:

fsModifiers
[in] Specifies keys that must be pressed in combination with the key specified by the uVirtKey parameter in order to generate the WM_HOTKEY message.

Więc odpada, bo naciśnięta musi być kombinacja np. alt/ctrl + klawisz, i nie da się tego ustawić tak żeby reagowało na sam klawisz.

0

jesli na klawisz bez zadnych modyfikatorów, to setwindowshookex() lub jak ktos wczesniej pisał getasyncstate();..
ale o tym problemie pisałem i nikt mi na forum nie pomógł.. więc za pomocą hooka udało mi się zrobić takie rzeczy tylko przy aktywnym programie w którym działała dllka z hookiem

0

przetłumacz to sobie i napisz to w zwykłym exe:

hHook = SetWindowsHookEx(WH_JOURNALRECORD, &HookProc, _hInstance, 0)
// ...
sub HookProc(code:INT, wParam:INT, lParam:EVENTMSG)
   if (lParam.message = WM_KEYDOWN) and (lParam.paramH = 0x42)
      MessageBeep(0)
   endif
   CallNextHookEx(0, code, wParam, lParam)
   return
endsub
  1. ten typ hooka jest tylko globalny
  2. wParam w strukturze EVENTMSG (in case WM_KEYDOWN) jest dziwnym virtual-key code, zamiast VK_F8 - działa 0x42 dla klawisza F8
  3. CallNextHookEx(hHook - jest ignorowane dlatego jest tam zero
  4. Ten hook nie musi nic zwracać

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