Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi sendMessage versagt -.- (https://www.delphipraxis.net/115320-sendmessage-versagt.html)

64Jabor 10. Jun 2008 12:07


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:
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;
Das ist die Prozedur in dem Hook, die den F9-Tastendruck abfängt! Das funktioniert DEFINITIV, habe ich per MessageBox getestet!
Die zweite Prozedur ist in meinem Programm und reagiert auf die Media-Tasten:

Delphi-Quellcode:
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;
Habe es auch schon mit einem direkten WM_APPCOMMAND senden versucht, aber funktinierte auch nicht:

Delphi-Quellcode:
sendMessage(WindowHandle, WM_APPCOMMAND, 0, APPCOMMAND_MEDIA_PLAY_PAUSE);
Ich komm da nicht mehr weiter -.-

Plz help!
mfg 64Jabor

sirius 10. Jun 2008 12:24

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?

Luckie 10. Jun 2008 12:40

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.

Apollonius 10. Jun 2008 12:47

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.

sirius 10. Jun 2008 12:51

Re: sendMessage versagt -.-
 
Zitat:

Zitat von Apollonius
Ich rate mal munter drauflos und vermute, dass WindowHandle eine globale Variable ist

Ach, du bist ein Fuchs! :mrgreen:

Aber es funktioniert definitiv :cat:

Apollonius 10. Jun 2008 13:03

Re: sendMessage versagt -.-
 
Was meinst du mit "es funktioniert definitiv"?

rollstuhlfahrer 10. Jun 2008 14:44

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

shmia 10. Jun 2008 15:03

Re: sendMessage versagt -.-
 
Arbeitest du unter Windows Vista?
Zitat:

Microsoft Windows Vista and later.
Message posting is subject to User Interface Privilege Isolation (UIPI). The thread of a process can post messages only to message queues of threads in processes of lesser or equal integrity level. When a message is blocked by UIPI the last error, retrieved with GetLastError, is set to 5 (access denied)

64Jabor 10. Jun 2008 17:41

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...

Apollonius 10. Jun 2008 18:37

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 14:03 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz