AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Wie findet man Fenster, deren Namen man nicht genau kennt?

Wie findet man Fenster, deren Namen man nicht genau kennt?

Ein Thema von Codehunter · begonnen am 14. Sep 2011 · letzter Beitrag vom 15. Sep 2011
Antwort Antwort
Seite 2 von 2     12
CCRDude

Registriert seit: 9. Jun 2011
675 Beiträge
 
FreePascal / Lazarus
 
#11

AW: Wie findet man Fenster, deren Namen man nicht genau kennt?

  Alt 14. Sep 2011, 13:50
Dateinamen können natürlich auch von anderen Anwendungen verwendet werden, und Pfade sind öft vom Benutzer wählbar.

Mutexe und Atome sind noch ein Stichwort.

Auch ein Tipp: mit Terminal Services siehst Du evtl. Prozesse, zu Denen Du keine Windows findest.
  Mit Zitat antworten Zitat
ASM

Registriert seit: 15. Aug 2004
165 Beiträge
 
Delphi 7 Enterprise
 
#12

AW: Wie findet man Fenster, deren Namen man nicht genau kennt?

  Alt 14. Sep 2011, 14:46
Zitat:
Wobei es auch sein kann, daß es andere Programme mit dem selben Fensternamen gibt,
oder das gefundene Fenster gehört zur gleichen EXE, aber in einem anderen Verzeichns.

Der einzige Weg, um ein bestimmtes Programm zu finden, geht also nur über den EXE Namen, inkl. Pfad.
Zitat:
Dateinamen können natürlich auch von anderen Anwendungen verwendet werden, und Pfade sind öft vom Benutzer wählbar.

Ganz recht.
Und dazu schaut man eben über die vorgeschlagene Funktion FindWindowEx() zunächst nach, ob überhaupt ein Fenster mit dem partiellen Titel der zu erfragenden Applikation existiert.
Falls nämlich nicht, hat sich die Sache bereits erledigt.
Falls ja, dann kann man sich entscheiden:
(a) die Zuordnung des Fensters ist aus dem Kontext unzweifelhaft eindeutig, womit das ohne weitere Abfragen geklärt wäre.
(b) man muss/möchte auf Nummer Sicher gehen und etwaige Zweifel an der Zuordnung des Fensters zur erfragten Applikation beseitigen: man hat ja mit dieser Funktion FindWindowEx() gleichzeitig das zu eben diesem Fenster zugehörige Handle und holt sich nun mit Hilfe dieses Handles vermittels des Prozesses den Filenamen inkl. kompletten Pfad der Applikation, zu dem das Fenster gehört. Womit das dann - ohne "Wenn" und "Aber" - definitiv und ggf. auch für mehrere Fenster mehrerer Instanzen, geklärt wäre.
Code:
function GetProcessNameFromWnd(Wnd: HWND): string;
var
  List: TStringList;
  PID: DWORD;
  I: Integer;
begin
  Result := '';
  if IsWindow(Wnd) then
  begin
    PID := INVALID_HANDLE_VALUE;
    Windows.GetWindowThreadProcessId(Wnd, @PID);
    List := TStringList.Create;
    try
      if RunningProcessesList(List, True) then
      begin
        I := List.IndexOfObject(Pointer(PID));
        if I > -1 then
          Result := List[I];
      end;
    finally
      List.Free;
    end;
  end;
end;
Im weiteren (insbes. zur noch benötigten RunningProcessesList()) siehe http://www.delphitricks.com/source-c...ow_handle.html
  Mit Zitat antworten Zitat
CCRDude

Registriert seit: 9. Jun 2011
675 Beiträge
 
FreePascal / Lazarus
 
#13

AW: Wie findet man Fenster, deren Namen man nicht genau kennt?

  Alt 14. Sep 2011, 15:21
Und dazu schaut man eben über die vorgeschlagene Funktion FindWindowEx() zunächst nach, ob überhaupt ein Fenster mit dem partiellen Titel der zu erfragenden Applikation existiert.
Falls nämlich nicht, hat sich die Sache bereits erledigt.
Desewegen erwähnte ich Terminal Services. Die als Remote-Desktop-Verbindung inzwischen ja nicht mehr nur im großen Firmenumfeld vorkommen. Oder war sogar Fast User Switching darüber?

MSDN sagt zu MSDN-Library durchsuchenFindWindowEx:
Zitat:
If hwndParent is NULL, the function uses the desktop window as the parent window. The function searches among windows that are child windows of the desktop.
Als Wurzel der Suche kann man also nur einen Desktop verwenden; ist parallel eine Person zwei angemeldet und benutzt das Programm, würde FindWindowEx aber scheitern.

Deswegen mein Tipp zu Techniken, die session-übergreifend funktionieren.
  Mit Zitat antworten Zitat
ASM

Registriert seit: 15. Aug 2004
165 Beiträge
 
Delphi 7 Enterprise
 
#14

AW: Wie findet man Fenster, deren Namen man nicht genau kennt?

  Alt 14. Sep 2011, 17:05
MSDN sagt zu FindWindowEx: ...

Als Wurzel der Suche kann man also nur einen Desktop verwenden; ist parallel eine Person zwei angemeldet und benutzt das Programm, würde FindWindowEx aber scheitern.

Nur um keine Verwirrung aufkommen zu lassen: die von mir oben gepostete Funktion FindWindowEx() ist nicht die in der Unit deklarierte Funktion FindWindowEx() aus der MS-Systemlibrary user32.dll. Besser hätte ich die von mir gepostete Funktion wohl FindWindowPart() oder sonstwie nennen sollen, um diesen Unterschied klar zu machen. Letztlich stellt der neu angemerkte potentielle Remote-Effekt aber wohl das gleiche Problem für beide Funktionen dar.

Davon allerdings, dass es sich hier in der Diskussion um ein Server-Client spezifisches Problem handeln könnte, war bisher jedoch nicht erkennbar die Rede. Dadurch wird die Fragestellung jetzt unerwartet mit einer erheblich anderen Zielrichtung aufgeworfen als ursprünglich gestellt. Oder ich hatte dahingehend etwas falsch verstanden ...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.114 Beiträge
 
Delphi 12 Athens
 
#15

AW: Wie findet man Fenster, deren Namen man nicht genau kennt?

  Alt 14. Sep 2011, 17:53
Versuche einfach die nötigen Dateien exklusiv und mit Schreibrechten zu öffnen.
Geht das nicht, dann "Update nicht möglich, da Programm läuft oder Zugriffsrechte fehlen".
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
CCRDude

Registriert seit: 9. Jun 2011
675 Beiträge
 
FreePascal / Lazarus
 
#16

AW: Wie findet man Fenster, deren Namen man nicht genau kennt?

  Alt 14. Sep 2011, 19:28
Davon allerdings, dass es sich hier in der Diskussion um ein Server-Client spezifisches Problem handeln könnte, war bisher jedoch nicht erkennbar die Rede.
Deswegen ja meine Ergänzung, daß Terminal Services früher vllt. mal Client-Server-Architektur only gewesen sein mögen, heute aber dank Fast User Switching recht verbreitet angewendet sind (und deutlich seltener, aber auch noch im Home-Bereich, mit dem Remote Desktop).

MSDN lädt sich bei mir heute leider meist tot, daher kann ich nur blind die Lektüre zu den WTS*-Funktionen empfehlen
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#17

AW: Wie findet man Fenster, deren Namen man nicht genau kennt?

  Alt 15. Sep 2011, 01:51
Soll dieses Updateprogramm unbedingt selber geschrieben werden oder darf es auch was fertiges sein?

Dann würde ich z.B. InnoSetup vorschlagen.

Laufende Instanzen des Programms werden von InnoSetup über einen Mutex erkannt.
InnoSetup kann Dateien nachladen
InnoSetup kann Dateien kopieren, auch wenn die Datei gesperrt ist (Neustart erforderlich)

Für TerminalServices sollte ein globaler Mutex verwendet werden!
Prefix
Code:
Global/
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 00:26 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