AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Handle des aktuellen Fensters

Ein Thema von glb · begonnen am 19. Sep 2004 · letzter Beitrag vom 24. Sep 2004
Antwort Antwort
glb

Registriert seit: 16. Sep 2004
6 Beiträge
 
#1

Handle des aktuellen Fensters

  Alt 19. Sep 2004, 19:24
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?

Danke für die Mühe!!
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#2

Re: Handle des aktuellen Fensters

  Alt 20. Sep 2004, 09:56
http://www.swissdelphicenter.ch/de/showcode.php?id=306
Thomas
  Mit Zitat antworten Zitat
mumu

Registriert seit: 28. Okt 2003
Ort: Bamberg
519 Beiträge
 
#3

Re: Handle des aktuellen Fensters

  Alt 21. Sep 2004, 14:41
verwende: GetWindow(GetForegoundWindow(), GW_HWNDNEXT);

das müsste funktionieren...
siehe

GetWindow on MSDN
  Mit Zitat antworten Zitat
glb

Registriert seit: 16. Sep 2004
6 Beiträge
 
#4

Re: Handle des aktuellen Fensters

  Alt 24. Sep 2004, 16:00
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 ...

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!!!!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:25 Uhr.
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