shellexecute a potem windows handle

0

Mam pytanko do mądrych panów forumowiczów. Jak uzyskać uchwyt okienka, które zostało przed chwilą utworzone za pomocą shellexecute? Tak dla jasności to podam tylko, że chodzi o nowe okno Internet Explorera.

0

Przecież pierwszym parametrem

ShellExecute

jest uchwyt okna!

0

Przecież pierwszym parametrem

ShellExecute

jest uchwyt okna!

Przecież pierwszym parametrem ShellExecute jest uchwyt okna RODZICA! A ja wyraźnie napisałem, że chodzi o uchwyt tego nowego okna.

naprawde nikt nie wie jak to zrobić?

Napiszę więc co ja wymyśliłem i może kogoś to "natchnie":

wywołuje funkcję ShellExecuteEx, w której ustawiam maskę na SEE_MASK_NOCLOSEPROCESS, potem wyciągam uchwyt procesu z TShellExecuteInfo i ... nie wiem co dalej no bo przecież uchwyt procesu to niestety nie to samo co uchwyt okna. Może ktoś będzie wiedział jak to dalej pociągnąć. Z góry dzięki.

0

Jak uzyskać uchwyt okienka, które zostało przed chwilą utworzone za pomocą shellexecute?

ShellExecute nie tworzy żadnych okien, tylko uruchamia procesy. Proces może utworzyć okno/okna, ale wcale nie musi !
(Poniżej zakładam, że proces = program, co mniej więcej odpowiada prawdzie.)
Jeśli jest to program okienkowy, to z reguły proces tworzy kilka - kilkanaście okien głównych. Pusty projekt Delphi, skompilowany i uruchomiony, tworzy 2 okna główne (Top Windows) o klasach: TApplication i TForm1.
U mnie (Win2000, IE6) Internet Explorer po uruchomieniu tworzy 11 okien głównych, przy czym oknem "nadrzędnym" jest chyba okno należące do klasy IEFrame, ale 100%-owej pewności nie mam. A więc nie można mówić o oknie, ale raczej o liście okien uruchomionego IE. A jak pobrać listę okien?

  1. Uruchom IE za pomocą CreateProcess (warto jeszcze poczekać, aż IE się całkowicie uruchomi - WaitForInputIdle).
  2. Z lpStartupInfo odczytujesz ID procesu (dwProcessId) <- ID IE.
  3. Dokonujesz enumeracji wszystkich okien głównych (EnumWindows, EnumWindowsProc).
    W EnumWindowsProc, za pomocą GetWindowThreadProcessId (2 parametr) uzyskujesz ID procesu, które utworzyło dane okno i porównujesz go z wcześniej odczytanym ID-em IE. Jeśli oba identyfikatory są równe, dodajesz Handle enumerowanego okna do jakiejś listy/tablicy. W ten sposób otrzymujesz listę wszystkich okien głównych utworzonych przez uruchomionego przez Ciebie IE.
    Jeśli interesują Cię dodatkowo okna potomne (Child Windows), musisz dla każdego okna głównego (utworzonego przez IE) dokonać enumeracji okien potomnych (EnumChildWindows, EnumChildProc).</quote>

1 użytkowników online, w tym zalogowanych: 0, gości: 1