![]() |
sendMessage versagt -.-
Hallo DP,
ich habe einen DLL-Hook programmiert, der jeden Tastendruck der F9-Taste abfängt und stattdessen oder eher gesagt zusätzlich :P an ein anderes Programm von mir, welches den Hook nutzt, einen Tastendruck der Media-Tasten simulieren soll. Dazu habe ich folgende Prozeduren:
Delphi-Quellcode:
Das ist die Prozedur in dem Hook, die den F9-Tastendruck abfängt! Das funktioniert DEFINITIV, habe ich per MessageBox getestet!
function KeyboardHookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin Result := CallNextHookEx(HookHandle, nCode, wParam, lParam); KeyUp := ((lParam and (1 shl 31)) <> 0); case nCode < 0 of TRUE: exit; //wenn code kleiner 0 wird nix gemacht FALSE: begin if not KeyUp then begin case wParam of VK_F9: begin PostMessage(WindowHandle, WM_KEYDOWN, VK_PLAY, 0); PostMessage(WindowHandle, WM_KEYUP, VK_PLAY, 0); end; end; end; end; end; end; Die zweite Prozedur ist in meinem Programm und reagiert auf die Media-Tasten:
Delphi-Quellcode:
Habe es auch schon mit einem direkten WM_APPCOMMAND senden versucht, aber funktinierte auch nicht:
procedure TJP.HookMessage(var Msg: TMessage);
begin case Msg.lParam of APPCOMMAND_MEDIA_PREVIOUSTRACK: BtnBackClick(BtnBack); APPCOMMAND_MEDIA_NEXTTRACK: BtnNextClick(BtnNext); APPCOMMAND_MEDIA_STOP:BtnStopClick(BtnStop); APPCOMMAND_MEDIA_PLAY_PAUSE: BtnPlayPauseClick(BtnPlayPause); end; end;
Delphi-Quellcode:
Ich komm da nicht mehr weiter -.-
sendMessage(WindowHandle, WM_APPCOMMAND, 0, APPCOMMAND_MEDIA_PLAY_PAUSE);
Plz help! mfg 64Jabor |
Re: sendMessage versagt -.-
Ich sehe hier nicht durch. In meinen Augen passt der code in dem ersten Delphi-Fentser nicht zu den anderen beiden. Was funktioniert denn eigentlich nun nicht.
Und nebenbei: Was ist Windowhandle bei Postmessage? Oder, wo ist es deklariert? |
Re: sendMessage versagt -.-
Bitte gib deinem Thread einen aussagekräftigen Titel. Zum einem verwendest du die API-Funktion SendMessage gar nicht, sondern PostMessage. Un dich bin mir ziemlich sicher, dass es auch nicht versagt, sondern dass du was falsch machst.
|
Re: sendMessage versagt -.-
Ich rate mal munter drauflos und vermute, dass WindowHandle eine globale Variable ist, deren Wert somit nicht in allen DLL-Instanzen gleich ist, weshalb es nicht funktioniert.
|
Re: sendMessage versagt -.-
Zitat:
Aber es funktioniert definitiv :cat: |
Re: sendMessage versagt -.-
Was meinst du mit "es funktioniert definitiv"?
|
Re: sendMessage versagt -.-
HI,
ich bezweifle, dass WindowHandle stimmt. Ich könnte mit hier zu Testzwecken ein HWND_Broadcast vorstellen, was aber den Nachteil hat, dass auch die nicht angesprochenen Programme Wind davon bekommen. Was natürlich auch geht ist, dass du jedes mal mit FindWindow abfrägst, an welches Handle zu schicken musst. Bernhard |
Re: sendMessage versagt -.-
Arbeitest du unter Windows Vista?
Zitat:
|
Re: sendMessage versagt -.-
Hmk, ich handle das mal ab:
@shima Nein! Ich nutze Windows XP WMC WindowHandle ist das Handle des Programms, welches die DLL lädt, in dem Fall mein MediaPlayer. Diese Funktionen hängen sehr wohl miteinander zusammen, denn ich möchte den Tastendruck der F-Tasten 9 bis 12 in Befehle für meinen MediaPlayer umwandeln. Die zweite Prozedur handelt die Media-Tasten einer Tastatur ab, eben jene will ich ja simulieren! Der dritten Codeausschnitt ist meine sendMessage um die es eigentlich ging, insofern NUTZE ICH sendMessage SEHR WOHL! Zugegeben, der Titelist verbesserungsfähig... Meine Theorie: Nutzer drückt (egal in welchem Programm) zB. die F9-Taste, der globale Hook (siehe Prozedur 1) fängt den Druck ab und schickt per sendMessage oder PostMessage (was ist da egtl der Unterschied ?) die Nachricht, dass die Taste "Play" gedürckt worden ist, die Prozedur die die MediaTaste-Drücke abhandelt, sollte den Druck ebenfalls auswerten. Der 3. Ausschnitt ist meine zweite Idee, direkt einen WM-APPCOMMAND an meinen Player zu senden, sodassper sendMessage die Konstanten für die MediaTasten mitgeschickt werden, das habe ich versucht zu erreichen, funktioniert so aber nicht. Meine Vermutung (deshalb der Titel) ist, dass die Message gar nicht ankommt... |
Re: sendMessage versagt -.-
Genau das habe ich doch gesagt. Wenn du in einer DLL-Instanz WindowHandle auf einen Wert setzt, beeinflusst du damit die anderen DLL-Instanzen nicht - in denen bleibt der Wert auf 0. Lass dir doch mal vor dem PostMessage den Wert des Handle mit einer MessageBox anzeigen.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz