[geloest] media keys via keyboard hook abfragen?
-
hi,
ich moechte in einem programm auf die "media keys" (play/pause/stop/usw.) reagieren (so wie es der wmp, winamp und co. auch tun).
ich habe nun ein/e/n (was ist der richtige artikel?!) keyboard hook dazu geschrieben und bekomme die tastendruecke der entspr. tasten mit, das ist kein problem.
allerdings muss ich die auch aus der dll in mein hauptprogramm bekommen.
dazu dachte ich an sowas wie eine callback-funktion, aber das wollte mir nicht wirklich gelingen.
ein bool-array fuer den zustand jeder der entspr. tasten in der dll anlegen und exportieren scheint mir irgendwie nicht allzu optimal und wuerde mich nicht weit bringen, weil ich es nicht regelmaessig checken kann.der haupt-loop laeuft in einer klasse, die nichts mit den tasten zu tun hat (mit einem sleep von einigen bis einigen hundert ms nach jedem durchlauf).
ich hoffe, das problem ist einigermassen deutlich geworden.
es faellt mir im moment etwas schwer, das ganze vernuenftig zu formulieren - wahrscheinlich, weil ich gerade genauso unstrukturiert denke wie der code aussieht ...
was waere hier ein sinnvoller loesungsansatz?
evtl. ein extra thread zum checken der tastendruecke?vielen dank im voraus!
... und gute nacht an alle.
mfg,
julian
-
Lies mal die MSDN zu WM_APPCOMMAND!
http://msdn.microsoft.com/en-us/library/ms646275.aspxUnd ShellProc
http://msdn.microsoft.com/en-us/library/ms644991(VS.85).aspxhttp://www.codeguru.com/cpp/w-p/system/keyboard/article.php/c5655
-
vielen dank!
die links haben mir wirklich etwas geholfen, allerdings habe ich immer noch keine window procedure in der ich die WM_APPCOMMAND-messages behandeln koennte, ich habe nichtmal ein fenster (das ganze wird nebenbei ein applet fuer die g15, sprich das interface ist nur auf dem display und ich rufe im main loop nur regelmaessig CEzLCD::Update auf).
d.h. ich suche immer noch einen weg, die tastendruecke in der hook zu erkennen (im link erklaert) und dann in meinem programm checken zu koennen (ohne window proc).
am besten so, dass das ganze innerhalb einer klasse geregelt wird und ich die klasse ueberall benutzen kann, in welchem programm auch immer, also unabhaengig von der window proc.mfg,
julian
-
Dieser Hook sendet IMHO eine Nachricht, and Dein Fenster.
Wenn Du keines hast, dann musst Du eben ein Fenster aufbauen, oder Du musst eine andere Art von IPC verwenden.
-
ok ich hab es nun so implementiert, wie in deinem letzten link (http://www.codeguru.com/cpp/w-p/system/keyboard/article.php/c5655).
dazu habe ich ein unsichtbares fenster erstellt, das die entspr. messages via PostMessage aus der hook-funktion bekommt.das klappt gut, solange mein windows message loop laeuft.
allerdings gibt es den, wie gesagt, eigentlich nicht.der main loop soll in einer anderen klasse laufen, die keine windows message queue hat/braucht/will.
1. kann ich zur not den message loop in einem separaten (worker-)thread ausfuehren?
MSG msg; bool res = true; while( res ) { res = GetMessage( &msg, NULL, 0, 0 ); if( !res ) return 1; TranslateMessage( &msg ); DispatchMessage( &msg ); }2. falls das geht, koennte ich in einer 2. klasse mein fensterchen haben, das message queue zeugs in einem extra thread einrichten und auf media tasten reagieren, ohne vom hauptprogramm abhaengig zu sein?
3. falls das mit der message queue/dem message loop in einem andere als dem main-thread nicht funktioniert, wie sollte ich das ganze dann loesen (falls "das ganze" nicht richtig erklaert wurde, bitte nachfragen!).
danke im voraus!
mfg,
julian
-
ok, problem geloest.

ich habe nun eine wunderbare, selbststaendige klasse, die mich via callback informieren kann, wenn die media-keys gedrueckt werden, und das funktioniert global.
die klasse startet einen extra thread, in welchem ein unsichtbares fenster erstellt und die hook installiert werden und die windows message queue bearbeitet wird.
komplett unabhaengig vom hauptprogramm.danke fuer die hilfe Martin Richter, ohne die links haette ich das wohl nie hinbekommen ...
// edit: ich hab mich zwar ganz schoen bloed angestellt und wuerde mich wundern, wenn das noetig sein sollte, aber notfalls kann ich die klasse auch gerne posten/hochladen ...
mfg,
julian