Thema: Delphi Eigenes Handle finden

Einzelnen Beitrag anzeigen

Fridolin Walther

Registriert seit: 11. Mai 2008
Ort: Kühlungsborn
446 Beiträge
 
Delphi 2009 Professional
 
#16

Re: Eigenes Handle finden

  Alt 6. Okt 2009, 10:19
Zitat von Schwedenbitter:
Zitat von Fridolin Walther:
Aber wenn Du genau schilderst (am Besten mit exakten Anwendungsnamen) was Du möchtest, wird man Dir sicher nähere Informationen geben können.
Das habe ich schon und niemand hatte bislang eine bessere Idee! Ich gehe jetzt schlafen. Vielleicht hat sich ja bis morgen mein Problem gelöst und jemand eine bessere Idee gepostet.
Wenn Du nicht darauf warten möchtest, das OpenOffice sich beendet, weil Du befürchtest die Synchronisation würde darunter leiden, wäre es evtl. sinnvoll 2 Methoden zu kombinieren:

Mit MSDN-Library durchsuchenFindFirstChangeNotification warten bis sich die Datei ändert und gegebenenfalls synchronisieren und das ganze so lange fortführen bis die Anwendung geschlossen wurde.

Zitat:
Wie gesagt: Ich bin für Tipps immer offen. 8)
Wenn Du von Deiner Fensterlösung nicht weg willst, wäre es eindeutig sinnvoller sich mit EnumDesktopWindows alle Fenster des Desktops zu holen und über die Fenster Klasse die für Dich relevanten Fenster zu identifizieren:
Delphi-Quellcode:
program Project1;
{$APPTYPE CONSOLE}

uses
  Windows;

type
  TOpenOfficeWindow = record
    WindowHandle: THandle;
    WindowTitle: string;
  end;

  TOpenOfficeWindowArray = array of TOpenOfficeWindow;
  POpenOfficeWindowArray = ^TOpenOfficeWindowArray;

function EnumWindowsCallback(hwnd: THandle; WindowArray: POpenOfficeWindowArray)
  : LongBool; stdcall;
const
  WINDOW_TITLE_BUFFER_SIZE = 65 * 1024;
  OPENOFFICE_WINDOW_CLASSNAME = 'SALFRAME';
var
  WindowTitle: array [0 .. WINDOW_TITLE_BUFFER_SIZE] of WideChar;
  WindowClassName: array [0 .. WINDOW_TITLE_BUFFER_SIZE] of WideChar;
begin
  Result := true;
  // Uns interessieren nur sichtbare Fenster
  if IsWindowVisible(hwnd) then
    begin
      // Wir holen uns den ClassName des Fensters
      FillChar(WindowClassName, SizeOf(WindowClassName), 0);
      if (GetClassName(hwnd, @WindowClassName, WINDOW_TITLE_BUFFER_SIZE) > 0)
        and (WindowClassName = OPENOFFICE_WINDOW_CLASSNAME) then
        begin
          // Wir ermitteln den Fenster Titel
          FillChar(WindowTitle, SizeOf(WindowTitle), 0);
          GetWindowText(hwnd, @WindowTitle, WINDOW_TITLE_BUFFER_SIZE);

          // Wir erweitern das übergebene WindowArray um 1 und füllen es mit den ermittelten Informationen
          SetLength(WindowArray^, Length(WindowArray^) + 1);
          WindowArray^[ High(WindowArray^)].WindowHandle := hwnd;
          WindowArray^[ High(WindowArray^)].WindowTitle := WindowTitle;
        end;
    end;
end;

function EraseAndFillWindowArray(var WindowArray: TOpenOfficeWindowArray)
  : Boolean;
begin
  // Array löschen
  SetLength(WindowArray, 0);
  // Wir lassen uns alle Fenster zurückgeben die auf dem Desktop angezeigt werden
  EnumDesktopWindows(0, @EnumWindowsCallback, Cardinal(@WindowArray));
  // Falls Einträge im WindowArray vorhanden sind, geben wir true, ansonsten false zurück
  Result := Length(WindowArray) <> 0;
end;

var
  WindowArray: TOpenOfficeWindowArray;
  i : Integer;

begin
  writeln(EraseAndFillWindowArray(WindowArray));
  writeln;
  for i := 0 to Length(WindowArray) - 1 do
    begin
      writeln('Fenster Handle: ', WindowArray[i].WindowHandle);
      writeln('Fenster Titel: ', WindowArray[i].WindowTitle);
      writeln;
    end;
  readln;
end.
Bei mir ergibt das folgenden Output:
Code:
TRUE

Fenster Handle: 196900
Fenster Titel: On-Access scanner design.docx - OpenOffice.org Writer

Fenster Handle: 527992
Fenster Titel: onaccessscannerdesign.docx - OpenOffice.org Writer
Jetzt könntest Du Dir noch aus dem Fenstertitel den Dateinamen herauspopeln und wüsstest damit sogar welches Fenster zu welcher Datei gehört (vorrausgesetzt die Dateinamen sind unterschiedlich).
Fridolin Walther
"While Mr. Kim, by virtue of youth and naiveté, has fallen prey to the inexplicable need for human contact, let me step in and assure you that my research will go on uninterrupted, and that social relationships will continue to baffle and repulse me."
  Mit Zitat antworten Zitat