function GetModulesListByProcessId(ProcessId : Cardinal) : TModuleArray; var hSnapshot : THandle; lpme : TModuleEntry32; procedure AddModuleToList; begin SetLength(Result,High(Result)+2); Result[high(Result)]:=lpme; end; begin SetLength(Result,0); hSnapshot:=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,ProcessId); if hSnapshot=-1 then RaiseLastWin32Error; lpme.dwSize:=SizeOf(lpme); if Module32First(hSnapshot,lpme) then begin AddModuleToList; while Module32Next(hSnapshot,lpme) do AddModuleToList; end; end;
function GetWindowPatch(Wnd: hWnd): string; // Нахождение пути к ехе по заголовку окна... var i: integer; modarr : TModuleArray; Pid: Cardinal; begin result:='Null'; GetWindowThreadProcessId(Wnd,@Pid); modarr:=GetModulesListByProcessId(Pid); result:='Null'; for i:=0 to High(modarr) do begin if Integer(modarr[i].modBaseAddr)=$400000 then begin result:=modarr[i].szExePath; break; end; end; end;
procedure TFormWinHide.SearchWindow; // Поиск окон... VAR searchTm: boolean; searchTmInt, i, OldWC, OldWCH: integer; name, TmpStr, Str: string; Tmp: TMenuItem; Wnd: hWnd; buff: ARRAY [0..127] OF Char; begin OldWC:=WinCount; WinCount:=0; OldWCH:=WinCountH; WinCountH:=0; // Считаем количество окон.. Wnd:= GetWindow(Handle, gw_HWndFirst); WHILE Wnd <> 0 DO BEGIN IF (Wnd <> Application.Handle) THEN BEGIN if IsWindowVisible(Wnd) then begin GetWindowText(Wnd, buff, sizeof(buff)); TmpStr:=StrPas(buff); if (GetWindowText(Wnd, buff, sizeof(buff)) = 0) then begin name:=GetWindowPatch(Wnd); if (name<>'Null') then TmpStr:=name; end;
if (TmpStr<>'') and (TmpStr<>paramStr(0)) then begin WinCount:=WinCount+1; END; end else begin WinCountH:=WinCountH+1; end; end; Wnd := GetWindow(Wnd, gw_hWndNext); END; }
1) вот... примерно так... procedure TFormWinHide.SearchWindow вызывается таймером каждые 100 мс... идет утечка памяти... не могу разабраться откуда...
2) а можно не по таймеру окна искать, а по системному сообщению (изменилось общее количество окон или одно из окон изменило статус с "IsWindowVisible(Wnd)" и наоборот)? если да, то как...
3) Ну это к другой теме, но спрошу здесь же... в контекстном меню задаю для пункта hint, ноль эмоций.. что надо сделать, чтобы он там отображался?