Author Topic: помогите найти все HWND, в окне  (Read 3450 times)

0 Members and 2 Guests are viewing this topic.

psyzum

  • Зашел в гости
  • *
  • Posts: 19
    • View Profile
помогите найти все HWND, в окне
« on: October 29, 2017, 07:34:01 PM »
$hw = wndfind("VNC Viewer") (hget(50,60))
131870(131862)
как мне получить хвнд по виндфинд а не по хгету, второй хвнд!?
или могу как то просканировать на все хвнд окон?

я это вижу как то так, но как снять хвнд  :o
 скрипт на поиск цифр есть на сайте
[spoiler]

$hw = wndfind("VNC Viewer")
SendMessage($hw, WM_GETTEXT, (WPARAM)256, (LPARAM)Text)
[/spoiler]

вот параметры окон
1[spoiler]
<?xml version="1.0" encoding="UTF-8"?>
<!--
Properties for window TvnWindowClass (0x0002031E)
Created by Window Detective
-->
<window>
    <windowClass>
        <name>TvnWindowClass</name>
        <classExtraBytes>0</classExtraBytes>
        <windowExtraBytes>0</windowExtraBytes>
        <brush>
            <handle>0x01100060</handle>
            <style value="0" name="BS_SOLID"/>
            <hatch value="0" name="HS_HORIZONTAL"/>
            <colour red="255" green="255" blue="255"/>
        </brush>
    </windowClass>
    <handle>0x0002031E</handle>
    <parentHandle>0x00010014</parentHandle>
    <windowText>ImPAD0314 - TightVNC Viewer</windowText>
    <dimensions>
        <rect x="-4" y="-4" width="252" height="252"/>
    </dimensions>
    <clientDimensions>
        <rect x="0" y="30" width="244" height="214"/>
    </clientDimensions>
    <styleBits>382664704</styleBits>
    <extendedStyleBits>256</extendedStyleBits>
    <font>none</font>
    <windowPropsList>
        <windowProp>
            <name>0x0000A918 (Atom)</name>
            <data>0x00345F48</data>
        </windowProp>
    </windowPropsList>
    <ownerProcessPath>F:\all\SOFT\TightVNC\tvnviewer.exe</ownerProcessPath>
    <ownerProcessId>3496</ownerProcessId>
    <ownerThreadId>3500</ownerThreadId>
</window>
[/spoiler]
2[spoiler]
<?xml version="1.0" encoding="UTF-8"?>
<!--
Properties for window TvnWindowClass (0x00020316)
Created by Window Detective
-->
<window>
    <windowClass>
        <name>TvnWindowClass</name>
        <classExtraBytes>0</classExtraBytes>
        <windowExtraBytes>0</windowExtraBytes>
        <brush>
            <handle>0x01100060</handle>
            <style value="0" name="BS_SOLID"/>
            <hatch value="0" name="HS_HORIZONTAL"/>
            <colour red="255" green="255" blue="255"/>
        </brush>
    </windowClass>
    <handle>0x00020316</handle>
    <parentHandle>0x0002031E</parentHandle>
    <windowText>ImPAD0314 - TightVNC Viewer</windowText>
    <dimensions>
        <rect x="0" y="59" width="244" height="185"/>
    </dimensions>
    <clientDimensions>
        <rect x="0" y="59" width="244" height="185"/>
    </clientDimensions>
    <styleBits>1442840576</styleBits>
    <extendedStyleBits>0</extendedStyleBits>
    <font>none</font>
    <windowPropsList>
        <windowProp>
            <name>0x0000A918 (Atom)</name>
            <data>0xFFFFFFFF</data>
        </windowProp>
    </windowPropsList>
    <ownerProcessPath>F:\all\SOFT\TightVNC\tvnviewer.exe</ownerProcessPath>
    <ownerProcessId>3496</ownerProcessId>
    <ownerThreadId>3500</ownerThreadId>
</window>
[/spoiler]
может по параметрам можно определять хвнд
вот можно же искать окна
[spoiler]
procedure Tform1.GetAllWindow;
Var
    Wd : HWnd;
begin
    ListBox1.Items.Clear;         // Очистим список перед началом поисков
    Wd:=FindWindow(0,0);          // Найдем первое окно верхнего уровня любого класса
    While (Wd<>0) do              // Если такое окно существует
    Begin
        ListBox1.Items.Add(IntToStr(Wd));    // Добавим описатель в виде текста в список
        Application.ProcessMessages;         // Дадим возможность поработать другим
        Wd:=GetNextWindow(Wd,GW_HWNDNEXT);   // Найдем следующее окно в системе.
    End;
end;

function EnumProc (Wd: HWnd; Param: LongInt): Boolean; stdcall; // Обязательно stdcall !!!
Var
    Nm:Array[0..255] of Char;  // буфер для имени
    Cs: Array[0..255] of Char; // буфер для класса
Begin
    GetWindowText(Wd,Nm,255); // считываем  текст заголовка окна
    GetClassName(Wd,Cs,255); // считываем название класса окна
    ListBox1.Items.Add(String(Nm)+'/'+String(Cs)); // Добавляем название окна и класс в список
    EnumProc := TRUE;  // продолжать искать окна…
end;

function EnumProc (Wd: HWnd; Param: LongInt): Boolean; stdcall; // Обязательно stdcall !!!
Var
    Nm:Array[0..255] of Char;  // буфер для имени
    Cs: Array[0..255] of Char; // буфер для класса
    Ch:Char;                             //символ обозначающий, что окно минимизиравано
Begin
    GetWindowText(Wd,Nm,255); // считываем  текст заголовка окна
    GetClassName(Wd,Cs,255); // считываем название класса окна
    If IsIconic(Wd) then Ch:='+'
    Else Ch:='-';
    // Добавляем название окна и класс в список первый символ + означает, что окно - иконка
    If Wd<>Form1.Handle then ListBox1.Items.Add(Ch+' '+String(Nm)+'/'+String(Cs));     
    EnumProc := TRUE;
end;
[/spoiler]

psyzum

  • Зашел в гости
  • *
  • Posts: 19
    • View Profile
Re: помогите найти все HWND, в окне
« Reply #1 on: October 29, 2017, 11:12:07 PM »
немного почитал и понял как правельно сформулировать вопрос =)
как получить хвнд дочерного окна, зная хвнд родительского
GetNextWindow() , EnumChildWindows() есть в кликермане ?
« Last Edit: October 30, 2017, 05:47:18 PM by psyzum »

i0

  • Оплот сообщества
  • ****
  • Posts: 353
  • CMann 4.13.014 final, ie, presto, win7 x86, x64
    • View Profile
Re: помогите найти все HWND, в окне
« Reply #2 on: November 01, 2017, 08:03:11 PM »
нету. надо просить автора запилить в след версиях, или клепать костыли самостоятельно.

i0

  • Оплот сообщества
  • ****
  • Posts: 353
  • CMann 4.13.014 final, ie, presto, win7 x86, x64
    • View Profile
Re: помогите найти все HWND, в окне
« Reply #3 on: November 01, 2017, 08:31:18 PM »
о, дык я буду только рад рабочему примеру и отброшу костыли

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: помогите найти все HWND, в окне
« Reply #4 on: November 02, 2017, 08:42:16 AM »
вам лиш-бы костыли. те-же GetNextWindow , EnumChildWindows можно использовать с помощью их числового кода  и POSTMESSAGE
Если и можно через POSTMESSAGE запросить, то разобрать ответ не всегда.


psyzum

  • Зашел в гости
  • *
  • Posts: 19
    • View Profile
Re: помогите найти все HWND, в окне
« Reply #5 on: November 02, 2017, 09:01:50 PM »
я начинающий, так сказать и хотелось бы примеров 0=)
и я понимаю что проще в шапку закинуть условие, что бы не парить мозг, почему в браузере что то меняется или нажимается  ;D
Code: [Select]
IF($hwnd = 0)
$hwnd = HGET(60,95)
hset($hwnd, 1)
END_IF
раз вызвал и дальше всё работает...если у кого игра браузерная, то там нужно сложнее условие, на сравнение хвнд..
но суть вопроса другой, как без HGET можно получить хвнд дочерного окна
вот один умничал что можно числовым в постмесаге, а примера не дал =\ помог,как отрубил! я тоже теоретик и понимаю что всё реально, в плоть до создании всех функций и вписывать в скрипты на вызов... Я новенький!Зелёный, так сказать =) я не спрашивал как можно поумничать, а как реализовать!! мне ещё много,чего не понятно и не хотелось хламом голову запиливать. хочу сразу по правильном пути пойти..
вот к примеру, показывает мне нужный хвнд, но опять же, передний план и хгет
Code: [Select]
LOGCLEAR
$hwnd = wndfind("Viewer")
    $pause = 1000
    if($hwnd > 0)
      wndgetinfo($hwnd, $x, $y, $size_x, $size_y)
      WNDBUMP ($hwnd)
      wait(1)
      IF(HGET(int($x+($size_x/2)),int($y+($size_y/2))) = $hwnd)
         print("âñå â ïîðÿäêå")
      else
         print("hwnd íå òîò")
         print("âåðíûé hwnd ", HGET(int($x+($size_x/2)),int($y+($size_y/2))))
      END_IF
     
    else
      print("BlueStasks íå íàéäåí")
    end_if
    halt
без  HGET я не смогу узнать хвнд дочерного окна?
по сути,а бы инфу можно увидеть о том окне, там уже дело техники  :D
« Last Edit: November 03, 2017, 01:40:31 AM by psyzum »