На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
! user posted image
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.

Соблюдайте общие правила форума

Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как запустить программу/файл? (и дождаться ее завершения)
5. Как перехватить API-функции, поставить hook? (перехват сообщений от мыши, клавиатуры - внедрение в удаленное адресное прстранство)
... (продолжение следует) ...

Внимание:
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки - бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Rouse_, user posted image Krid

Модераторы: Rouse_, Krid
  
> Поиск окна, глюки с EnumWindowsProc
ExpandedWrap disabled
    function FindChildWindow(const ClassName, Title: String; out Parent: THandle): THandle;
    type
      TInfo = record
        H, P: THandle;
        Cls, Ttl: PChar;
      end;
    type
      PInfo = ^TInfo;
     
     function EnumWindowsProc(hWnd: THandle; Info: PInfo): Boolean; stdcall;
     begin
       with Info^ do
       begin
         if H = 0 then
         begin
           H := FindWindowEx(hWnd, 0, Cls, Ttl);
           if H = 0 then EnumChildWindows(hWnd, @EnumWindowsProc, LParam(Info))
           else
           begin
    //         PostMessage(H, BM_CLICK, 0, 0);  // Если надо нажать на кнопку, например
             P := hWnd;
             // Собственно, здесь можно сделать какую-то проверку и в случае, если это окно не подходит, выполнить Hnd := 0 и P := 0
           end;
         end;
         Result := (H = 0);
       end;
     end;
     
    var
      Info: TInfo;
    begin
      with Info do
      begin
        H := 0;
        P := 0;
        Cls := PChar(ClassName);
        Ttl := PChar(Title);
        EnumWindows(@EnumWindowsProc, LParam(@Info));
        Result := H;
        if @Parent <> nil then Parent := P;
      end;
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    var Parent: THandle;
    begin
      ShowMessageFmt('Window handle = %X'#10'Real button handle = %X'#10'Parent handle = %X'#10'Real form handle = %X',
        [FindChildWindow('TButton', 'Button1', Parent), Button1.Handle, Parent, Form1.Handle]);
    end;

EnumWindowsProc должен завершать работу, если результат = False, однако на практике такое происходит далеко не всегда. Это легко увидеть, если закомментить 14-ю строку if H = 0 then. Функция начинает работать долго (у меня аж полсекунды) и возвращает 0.
Почему так?
Tell me would you kill to save a life?
Tell me would you kill to prove you're right?
Crash, crash, burn, let it all burn
This hurricane's chasing us all underground...
Цитата MSDN
BOOL WINAPI EnumWindows(
_In_ WNDENUMPROC lpEnumFunc,
_In_ LPARAM lParam
);


BOOL <> Boolean
Что бы ни происходило, убедись, что ты чист. Обращай внимание на следы, результаты дают только чистые операции. Ощутив необходимость, проконтролируй себя и раз, и два. Будь чист, пусть это станет законом.
Цитата Shaggy @
BOOL <> Boolean

:yes:
BOOL = int, Boolean = byte. В итоге Result := (H = 0) устанавливает только младший байт результата (регистр AL), а в старших байтах (EAX) может оставаться мусор <> 0.
Точно! :facepalm:
Поменял на LongBool, всё заработало.
Спасибо!
Tell me would you kill to save a life?
Tell me would you kill to prove you're right?
Crash, crash, burn, let it all burn
This hurricane's chasing us all underground...
1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
0 пользователей:


Рейтинг@Mail.ru
[ Script Execution time: 0,0905 ]   [ 20 queries used ]   [ Generated: 21.11.17, 06:17 GMT ]