IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

> Как определить откуда был запущен процесс?, Из drkb....
Snake_B
сообщение 7.08.2008 17:14
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 72
Пол: Мужской

Репутация: -  0  +



type TModuleArray = array of TModuleEntry32;

.............

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, ноль эмоций.. что надо сделать, чтобы он там отображался?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 17.07.2025 20:33
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"