EnumWindows nie działa

0

Cześć, chcę pobrać handla do okna, znając ścieżkę do pliku exe, która go uruchomiła.
Generalnie problem wygląda tak - w menu mam ileś aplikaji. Kliknięcie powoduje uruchomienie danej aplikacji. Gdy kliknę po raz drugi, aplikacja ma się aktywować.
Niestety nie działa mi wyszukiwanie okien i nie wiem czemu. Znajduje z milion razy okno mojej aplikacji i kilka systemowych, a nie znajduje innych aplikacji.

Kod do wyszukania handla wygląda tak:

function EnumWindowsProc(h: HWND; lp: lParam): boolean; stdcall;
var
  fName: PAnsiChar;
  s: ansistring;
begin
  fName:=StrAlloc(MAX_PATH+1);
  GetWindowModuleFileName(h, fName, MAX_PATH); //ma zwrócić ścieżkę

  if (fName = '') or (fName = nil) then
    s:=''
  else
    s:=StrPas(fName);  

  if lowerCase(s) = lowerCase(exeFileName) then
  begin
    pInteger(lp)^:=h; //zapisz handla w odpowiednim obszarze pamięci
    result:=false;
  end else result:=true;
  strDispose(fName);

  enumChildWindows(h, @EnumWindowsProc, lp); //myślałem, że to pomoże, ale nie
end;


function TProcessManager.GetWindowHandle(ExeFileName: string): HWND;
var
  res: HWND;
begin
  res:=0;
  uProcesses.exeFileName:=exeFileName;
  EnumWindows(@EnumWindowsProc, Integer(@res));
  result:=res; 
end;

Czemu to nie działa?

0

wtylumacz czemu pytasz o to na forum a nie googli?

0
cimak napisał(a)

wtylumacz czemu pytasz o to na forum a nie googli?

Bo googli już pytałem i nic konstruktywnego mi nie odpowiedziały.

0

serio?
no patrz, to mamy jakies inne google... :
wpisalem w googlach "EnumWindows" i po 6 sekundach mialem odpowiedz:
http://msdn.microsoft.com/en-us/library/ms633498(v=VS.85).aspx
To continue enumeration, the callback function <b>must return TRUE</b>; to stop enumeration, it must return FALSE.

0
cimak napisał(a)

serio?
no patrz, to mamy jakies inne google... :
wpisalem w googlach "EnumWindows" i po 6 sekundach mialem odpowiedz:
http://msdn.microsoft.com/en-us/library/ms633498(v=VS.85).aspx
To continue enumeration, the callback function <b>must return TRUE</b>; to stop enumeration, it must return FALSE.

A Ty czytałeś mój kod?
ZWRACAM TRUE, chyba, że znajdę okno, które mnie interesuje. Ale NIE ZNAJDUJE tego okna, pomimo, że ono ISTNIEJE.

0

dobra, przepraszam, nie zauwazylem tego... ;]
ale w takim razie nie rozumiem czemu pytasz o "EnumWindows" skoro to dziala w porzadku...
masz problem z GetWindowModuleFileName wiec szukaj w tym kierunku.

0
cimak napisał(a)

dobra, przepraszam, nie zauwazylem tego... ;]
ale w takim razie nie rozumiem czemu pytasz o "EnumWindows" skoro to dziala w porzadku...
masz problem z GetWindowModuleFileName wiec szukaj w tym kierunku.

No właśnie niekoniecznie. Bo handle'a przekazuje uzyskanego z EnumWindows ;>

0

po 1. sprawdzales czy poprawnie robi liste samych okien? wystarczy dodac listboxa i GetWindowText().
po 2. jestes pewien, ze do GetWindowModuleFileName przekazuje sie uchwyt okna a nie przypadkiem "A handle to the loaded module whose path is being requested."? zerknij do dokumentacji.
po 3. szukajcie a znajdziecie: http://www.swissdelphicenter.ch/torry/showcode.php?id=2010
po 4. kurde... zalozyles 4 tematy dotyczace praktyczniee tego samego problemu.... ogarnij sie. pomijam juz fakt ze jak widac masz w necie gotowe kody, funkcje, nawet komponenty...

0
cimak napisał(a)

po 1. sprawdzales czy poprawnie robi liste samych okien? wystarczy dodac listboxa i GetWindowText().

No mówię, że nie. Znajduje kilkanaście razy okno mojego programu i jakieś okna systemowe :|

po 2. jestes pewien, ze do GetWindowModuleFileName przekazuje sie uchwyt okna a nie przypadkiem "A handle to the loaded module whose path is being requested."? zerknij do dokumentacji.

Tak, jestem pewien: http://msdn.microsoft.com/en-us/library/ms633517(VS.85).aspx

po 3. szukajcie a znajdziecie: http://www.swissdelphicenter.ch/torry/showcode.php?id=2010

Za chwilę spróbuję i dam znać

po 4. kurde... zalozyles 4 tematy dotyczace praktyczniee tego samego problemu.... ogarnij sie.

Przepraszam.

[DOPISANE]
OK, kod z Torriego działa ok. Nie znalazłem go wczesniej, bo szukałem pod trochę innym kątem. Dzięki wielkie.

0
Juhas napisał(a)

Tak, jestem pewien: http://msdn.microsoft.com/en-us/library/ms633517(VS.85).aspx

przegralem ;] pattrzylem na GetModuleFileName a nie na GetWindowModuleFileName ;]

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