На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное 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.
    Почему так?
      Цитата 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, всё заработало.
          Спасибо!
          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script execution time: 0,0233 ]   [ 16 queries used ]   [ Generated: 28.03.24, 19:18 GMT ]