Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Handle des aktuellen Fensters (https://www.delphipraxis.net/30086-handle-des-aktuellen-fensters.html)

glb 19. Sep 2004 18:24


Handle des aktuellen Fensters
 
Hallo Leute,

ich habe hier zwar schon einige Beiträge zu dem Thema gefunden, aber irgendwie ist es doch nicht das was ich brauche....
Vielleicht könnt ihr mir ja direkt helfen....
Also, ich möchte aus einem Delphi-Programm, welches nur als Icon in der SysTray "wartet", Text an der Stelle in einer Anwendung einfügen, wo der Cursor steht.(also FindWindow&Co nützt mir nix)
Dabei soll es egal sein, in welcher Anwendung der Cursor steht .. Word, Excel, Notepad ....(also keine Speziallösung)
Das Problem ist das Ermitteln des Fenster-Handles(sonst habe ich alles zusammen).
Ich hab schon mit GetForegroundWindow rumprobiert, aber irgendwie ist das "Ergebnis" nicht das, was ich will ....
Also, wie bekomme ich das Handle des aktuellen Fensters und wie bekomme ich den Handle des Controls, wo der Cursor steht.
Habt ihre einen Tipp/Rat?
Hmmm .... nochwas, ich habe XP und arbeite mit VMWare unter W2000. Kann es evtl. auch daran liegen, daß VMWare da auch dazwischen funkt und die Handles "durcheinander" bringt?(hab' sowas mal irgendwo gelesen)
Ich mache das, da mein Delphi5 seit der Installation von SP2 nicht mehr funktioniert? :wall:

Danke für die Mühe!!

toms 20. Sep 2004 08:56

Re: Handle des aktuellen Fensters
 
http://www.swissdelphicenter.ch/de/showcode.php?id=306

mumu 21. Sep 2004 13:41

Re: Handle des aktuellen Fensters
 
verwende: GetWindow(GetForegoundWindow(), GW_HWNDNEXT);

das müsste funktionieren...
siehe

GetWindow on MSDN

glb 24. Sep 2004 15:00

Re: Handle des aktuellen Fensters
 
Hallo Leute,

erst nochmal kurz, was ich überhaupt machen will:
- Programm starten, Form wird unsichtbar und es erscheint ein Icon in der SysTray(das tut soweit)
- über die rechte Maustaste über mein Icon erscheint ein Popup-Menü und wenn ich den Menüpunkt "Hallo". Wenn ich nun "Hallo" auswähle soll in dem Fenster(Notepad, Word, Excel, egal was!), wo sich der Cursor befindet das Wort "Hallo" eingefügt werden.


ich habe nun alle(die ich kenne) Funkionen zum Thema "Fenster-Handle ermitteln" ausprobiert. Nichts klappt so richtig.
Jedesmal, wenn ich einen Rechtslklick auf "mein" SysTray-Symbol mache, bekomme ich nur mein Fenster-Handle oder ein Handle eines Controls auf meinem Formular.
Jetzt habe ich mal einen Timer eingebaut, der jede 500ms ein "GetForegroundWindow" absetzt, das ermittelte Handle merke ich mir und verwende dann das, wenn die entsprechende Aktion über das Popup-Menü meines SysTray-icons aufgerufen wird. Das funktioniert!
Ich finde die Lösung aber etwas ... "uncool". Jetzt habe ich mir gedacht, wie wäre es denn, wenn ich einen Hook setze, der mich jedesmal informiert, wenn ein Fenster aktiviert wird. Leider gibt es keinen speziellen WH_WINDOWCHANGE oder sowas. Jetzt habe ich es mal so probiert:

Delphi-Quellcode:
Function myFirstHook(code: Integer;
                   HwParam: WPARAM;
                   HlParam: LPARAM
                   ): LRESULT; Stdcall;
var
    myWnd   : HWND;
begin
  if Code = HC_ACTION    then
  begin
    myWnd := GetFocus();
    if myWnd = 0 then
      myWnd := GetForegroundWindow();
    PostMessage(myHandle, myMessage, myWnd, hlParam);
  end;
  Result := CallNextHookEx(WH_CALLWNDPROC, Code, HwParam, HlParam);
end;
die Werte für myHandle und myMessage habe ich beim Initialisieren des Hooks mitgegeben:

Delphi-Quellcode:
  hDLL := LoadLibrary('Project1.dll');
  if hDLL = 0 then
  begin
    MessageBox(0,'Project1.dll nicht gefunden',
               'kritischer Fehler',MB_OK or MB_ICONSTOP);
    Success := FALSE;
    //Wird Im OnDestroy abgefragt
    Application.Terminate
  end
  else begin
    Success := TRUE;
    //Funktion aus DLL laden
    InitProc := GetProcAddress(hDLL,'DLLInit');
    InitProc(hDLL,TRUE,self.handle,WM_WINDOWCHANGE)

  end;
der Init-Hook sieht so aus:

Delphi-Quellcode:
procedure DLLInit(hDLL: HINST; install: BOOL; aHandle : HWnd; aMessage : Integer); stdcall
begin
  myHandle := aHandle;
  myMessage := aMessage;
  if install = TRUE
  then
    myHook := SetWindowsHookEx(WH_CALLWNDPROC,myFirstHook,hDLL,0)
  else
    UnhookWindowsHookEx(myHook)
end;
So, das ganze hab' ich dann mal laufen lassen .. und ... naja ich musste den Prozess über den TaskManager killen ... :pale:

So, jetzt meine Fragen:
1. ist das ganze theoretisch überhaupt möglich(Hook sendet Daten(aktuelles Fenster-Handle) an ein anderes Programm)
2. kann ich im Hook abfragen, welche Windows-Message aufgetreten ist(ich möchte ja nicht jeden Tastendruck oder Mausbewegung wissen, nur ob gerade ein anderes Fenster in den Vordergrund geholt wurde)

Über ein paar Tipps wäre ich sehr dankbar!!!!


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:52 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-2025 by Thomas Breitkreuz