Einzelnen Beitrag anzeigen

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