EnumWindow ne najde minimaliziranega okna

Win32 api funkcije.
Odgovori
TonyCaker
Prispevkov: 312
Pridružen: 27.09.2003 18:33:35

EnumWindow ne najde minimaliziranega okna

Odgovor Napisal/-a TonyCaker » 14.07.2010 13:03:38

Iz svojega programa s ShellExecute odprem datoteko v editorju. Ko grem ven iz programa pa moram uporabnika opozoriti, da so editorji še odprti. To naredim s funkcijo WindowFindCaption. Okno prav lepo najde, če je maximirano (fullscreen) ali normalno, če pa je minimalizirano v taskbar, pa ne. Izvleček iz kode je spodaj.

Koda: Izberi vse

function EnumChildWindowsProc(Wnd : HWnd; Form : TForm) : Boolean; Export;
    {$ifdef Win32} StdCall; {$endif}
var Buffer:Array[0..255] of Char;
begin
  result:= True;
  GetWindowText( Wnd, Buffer, 100);
  if StrLen(Buffer) > 0 then
    if ( Pos( ewCaption, StrPas(Buffer)) > 0 ) then
      ewHwnd:= Wnd;
end;

function EnumWindowsProc(Wnd : HWnd; Form : TForm) : Boolean; Export;
    {$ifdef Win32} StdCall; {$endif}
var
  Buffer:Array[0..255] of Char;
begin
  result:= True;
  GetWindowText( Wnd, Buffer,100);
  if StrLen(Buffer) > 0 then begin
    if Pos( ewCaption, StrPas(Buffer)) > 0 then
      ewHwnd:= Wnd
    else
      EnumChildWindows( Wnd, @EnumChildWindowsProc, LongInt(Form) );
  end;
end;

function TfrmDocEdit.WindowFindCaption( cNaslov:String ):THandle;
{ Funkcija išče v naslovih vseh okna in podoken (MDI) string cNaslov
  oz. ewCaption. Če najde, postavi handle (številko) okna v variablo
  ewHwnd. ewCaption in ewHwnd morata biti sistemski variabli - deklarirani
  izven forme. }

begin
  ewHwnd:= 0;
  ewCaption:= cNaslov;
  EnumWindows( @EnumWindowsProc, 0 );
  result:= ewHwnd;
end;
  
Kaj je treba popraviti? Ali pa morda namig na drug način iskanja. V dsiWin nisem našel nič ustreznega (morda pa le nisem videl).

LP
A s ti tut not padu ?

Uporabniški avatar
Lee_Nover
Prispevkov: 3653
Pridružen: 20.05.2001 14:31:55

EnumWindow ne najde minimaliziranega okna

Odgovor Napisal/-a Lee_Nover » 15.07.2010 07:21:50

odpri program s CreateProcess, potem uporabis handle od glavne niti v EnumThreadWindows(processInfo.dwThreadId, func, ...)
.. my 2 c ..
- I hate noobs -

TonyCaker
Prispevkov: 312
Pridružen: 27.09.2003 18:33:35

EnumWindow ne najde minimaliziranega okna

Odgovor Napisal/-a TonyCaker » 16.07.2010 08:31:47

Včeraj sem porabil 6,5 ure za spoznavanje s win procesi, vendar je bil rezultat bolj pičel. Naredil sem ene 5 raznih kombinacij in na koncu ugotovil, da stvar pravzaprav brezhibno deluje tako z EnumWindows... kot EnumThread... Problem sploh ni bil v EnumWindowsProc / EnumChildWindowsProc, pač pa v klicoči funkciji, kjer sem pozabil povečati okno.

Koda: Izberi vse

  nHWnd:= AktivenEditor // --- tole kliče Enum....;
  if nHWnd > 0 then begin
    ShowWindow( nHWnd, SW_SHOWNORMAL );  <<---   tale vrstica je pa manjkala jeb$#"$
    SetForegroundWindow( nHWnd );
    Exit;
  end;
  
Lee, vseeno hvala.

Pifda, sem pek... :(
A s ti tut not padu ?

Odgovori