![]() |
Handle von Firefox bei ShellExecuteEx
Hallo! :-)
Ich habe folgendes Problem, ich möchte gerne ein neues Fenster im Firefox öffnen und das dazugehörige Handle erhalten. Das Ganze habe ich bis jetzt mit ShellExecuteEx realisiert:
Delphi-Quellcode:
Das funktioniert auch soweit ganz gut!
ShExecInfo.cbSize := sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask := SEE_MASK_NOCLOSEPROCESS; ShExecInfo.lpVerb := nil; ShExecInfo.lpFile := PChar(GetDefaultBrowser); ShExecInfo.lpDirectory := PChar(ExtractFilePath(GetDefaultBrowser)); ShExecInfo.lpParameters := PChar('-new-window ' + pageurl); ShExecInfo.nShow := SW_SHOWNORMAL; ShellExecuteEx(@ShExecInfo); Allerdings erhalte ich in ShExecInfo.hProcess als Handle immer nur "1684", was aber leider falsch ist :s Hat jemand von euch ein Idee wie ich an das Handle des neu geöffneten Fensters kommen kann? Danke im vorraus für eure Hilfe :-) |
Re: Handle von Firefox bei ShellExecuteEx
was ist denn dieses ShExecInfo ?
wenn cihdas ncih weiß kann ich da ehrlich egsagt auch ncih heflfen. aber um auf den threadtitel hinzukommen: Probiers mit FindWindow und FindWindowEx
Delphi-Quellcode:
Weiß nich, ob das das is was du suchst, verstehe deine Frage nich so :drunken: , weder is das mit dem kompletten fensternamen mit FF getestet.
var
s:string; hwnd:integer; begin s:='sitename'; // dass der gesamte Seitenname gefunden wird hwnd:= FindWindow(nil,s+' - Mozilla Firefox'; //Um Noch die Editbox zu finden: //hwnd:=FindWindowEx(hwnd, 0, 'Edit', nil); |
Re: Handle von Firefox bei ShellExecuteEx
Zitat:
Zitat:
![]() Du müsstest jetzt in diesem Prozess nach Fenstern suchen. Allerdings ist ![]() Womit es aber direkt gehen sollte ist ![]() ![]() |
Re: Handle von Firefox bei ShellExecuteEx
Zitat:
Ansonsten hat jaenicke recht. Du bekommst dort ein Prozesshandle und kein Fensterhandle. Um an das Fensterhandle zu gelangen musst Du FindWindow oder alternativ die Enum*Windows Funtkionen bemühen. Siehe dazu z.B. kurze Demo Anwendung:
Delphi-Quellcode:
program Project2;
{$APPTYPE CONSOLE} uses windows, sysutils; var HandleArray : array of THandle; function EnumWindowsCallback(Handle : THandle; ProcessId : DWORD) : LongBool; stdcall; var ProcessIdOfHandle : DWORD; begin GetWindowThreadProcessID(Handle, ProcessIdOfHandle); if (ProcessIdOfHandle = ProcessId) and (IsWindowVisible(Handle)) then begin SetLength(HandleArray, Length(HandleArray) + 1); HandleArray[Length(HandleArray) - 1] := Handle; end; Result := true; end; function GetVisibleWindowsOfProcess(ProcessId : DWORD) : Boolean; begin SetLength(HandleArray, 0); Result := EnumWindows(@EnumWindowsCallback, ProcessId) and (Length(HandleArray) > 0); end; var i : Integer; begin if GetVisibleWindowsOfProcess(2112) then for i := 0 to Length(HandleArray) - 1 do begin writeln(HandleArray[i]); end; readln; end. |
Re: Handle von Firefox bei ShellExecuteEx
Zitat:
![]() |
Re: Handle von Firefox bei ShellExecuteEx
Vielen Dank für die Hilfe und das Beispiel erstmal!
Wenn ich es aber wie beschrieben aufrufe wird mir kein einziges Fensterhandle ausgegeben :-( if GetVisibleWindowsOfProcess(xxx) ist immer false. Gibt es eine andere Möglichkeit testweise das Handle zu ermitteln? Mit WinSpy bin ich leider nicht weiter gekommen. |
Re: Handle von Firefox bei ShellExecuteEx
Zitat:
2. Du übergibst hoffentlich eine Process ID und kein Handle. |
Re: Handle von Firefox bei ShellExecuteEx
Hallo!
Ja daran habe ich gedacht. Ich habe eben gemerkt das es einwandfrei funktioniert, wenn noch kein Firefox Fenster geöffnet war! Also wenn ich firefox komplett beende und meinen Code ausführe klappt alles wunderbar. Aber wenn schon ein Fenster geöffnet ist und ich mit meinem Code ein weiteres öffne, dann klappt das leider nicht :( Ich hole mir die PID mit
Delphi-Quellcode:
aus der uallcollection.
GetProcessId(ShExecInfo.hProcess)
Die PID die ich allerdings immer mit meinem Handle erhalte ist nicht die selbe wie wenn ich die PID von Firefox manuell per
Delphi-Quellcode:
ermittle.
uallProcess.FindProcess(PChar('firefox'))
Leider kann ich auch nicht einfach immer auf dem funktionierenden Weg die pid von firefox ermitteln, da dies doch zu bugs führen würde wenn mehr als ein prozess firefox.exe läuft. Oder habe ich da jetzt einen Denkfehler? |
Re: Handle von Firefox bei ShellExecuteEx
Naja, aber Moment mal FindProcess wird einfach die alte Instanz und damit einen anderen Wert finden.
Zudem habe ich bereits auf CreateProcess hingewiesen, damit bekommst du direkt das Prozesshandle und die Prozess-ID. |
Re: Handle von Firefox bei ShellExecuteEx
CreateProcess wollte ich vermeiden, weil ich gelesen habe das es da wohl Probleme mit Vista gibt.
Und es gibt ja eigentlich nur eine Instanz von Firefox, das ist ja das Merkwürdige. Und selbst wenn es zwei Instanzen gäbe und der Code die ältere findet, sollte er ja trotzdem ein passendes Fensterhandle ausgeben, weil diese Instanz ja auch ein sichtbares Fenster hat. Ich bin irgendwie im Moment ein wenig verwirrt :P |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:38 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