Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   [Вопрос] Delphi, работа с хэндлами окон (https://forum.antichat.xyz/showthread.php?t=130409)

ex3me 19.07.2009 02:40

[Вопрос] Delphi, работа с хэндлами окон
 
Имеется программа с такой вот "структурой хэндлов"
http://i067.radikal.ru/0907/1a/dc140828c07d.jpg
Как конкретно для такого примера правильно получить хэндл этой самой кнопки "Continue >>>"?

Перепробовал массу вариантов с FindWindow, FindWindowEx, gw_HWNDNext, gw_CHILD - тщетно. Возможно что-то делаю неправильно.

Пробовал получить текст из всех окон:

Код:

var
  Transfer : HWND;
  TransWnd : array[1..42] of HWND;
  d:string[255];

procedure GetTransHandle();
var
  i: integer;
begin
  Transfer := FindWindow(nil, PChar('Hard Disk Wipe Tool 2.35 build 1178'));
  TransWnd[1] := GetWindow(Transfer, GW_CHILD);
  for i := 2 to 10 do
  begin
    TransWnd[i] := GetWindow(TransWnd[i - 1], GW_HWNDNEXT);
    setLength(d,sendMessage(TransWnd[i],WM_GETTEXTLENGTH,0,0)+1);
    SendMessage(TransWnd[i],WM_GETTEXT, wParam(length(d)),lParam(@d[1]));
    writeln(d);
  end;
end;

begin
GetTransHandle();
readln;
end.

Выдало сплошную пустоту.

Есть какие-нибудь идеи?

Scripter 19.07.2009 03:34

writeln(d) readln что и куда читает я не пойму...

попробуй заменить на:

Код:

Memo1.Lines.Add(d);
или
Код:

var
f:System.Text;
begin
AssignFile(f,'C:\lol.txt');
Rewrite(f);
WriteLn(f, d);
CloseFile(f);
end;

у тебя процедура ничего не выводит procedure GetTransHandle(пусто);

begin
GetTransHandle(); //пустота
readln; //куда-то что-то читаем
end.

эт только догадки, может чем поможет

ex3me 19.07.2009 03:56

Нет, к сожалению это не то совсем. Нигде там пустот не имеется, и код 200% рабочий. Вопрос заключается в том, как добраться именно к той кнопке, хендл которой изображен на рисунке структуры

З.Ы. Процедура на то и процедура, что она может не принимать никаких параметров и в отличие от функции не возвращает из себя какое-либо значение. Перечитай "Основы процедурного программирования на Delphi"

W!z@rD 19.07.2009 09:02

получить хэндл кнопки?
PHP код:

FindWindowEx(parentHwnd0'TButton''Continue >>>'); 

parentHwnd - хэндл родителя, думаю его получить это раз плюнуть.
... На всякий случай FindWindow

Получить текст всех элементов?
PHP код:

EnumChildWindow 


slesh 19.07.2009 10:34

заморачиваться над таким? Быстрее перечислить элементы родительноского окна.
Как написал W!z@rD заюзать функции EnumChildWindows

Код:

var
 ButtonHandle:THandle;

function EnumChildProc(wnd:hwnd; lParam:integer):boolean; stdcall;
var
 buf:array[0..255] of char;
begin
 GetWindowText(wnd, buf, 255);
 if Lstrcmpi('Continue >>>', buf) = 0 then
  begin
  ButtonHandle := wnd;
  result := false;
  end
 else
  begin
  ButtonHandle := 0;
  result := true;
  end;
end;


procedure TForm1.Button2Click(Sender: TObject);
var
 WindowHandle:THandle;
begin
 WindowHandle := FindWindow(nil,'Form1'); // тут свои параметры укажиш
 if WindowHandle <> 0 then
 begin
  EnumChildWindows(WindowHandle, @EnumChildProc, 0);
  ShowMessage('Button Handle = '+inttohex(ButtonHandle, 8));
 end;
end;


ex3me 19.07.2009 14:29

W!z@rD, slesh, спасибо, но увы - история та же. Button Handle = 000000 конкретно в последнем примере. Самое интересное что Autoit Window Info показывает адекватно хендл энтой кнопки, и если бы хендлы были статичные - было бы намного проще =))) Придется видимо искать другие варианты =\

slesh 19.07.2009 23:14

я сделал подобного вида форму, и нормально нашло всё. может там кнопка чуть по другому называется. попробуй запустить с таким кодом и поискать кнопку в списке.
Также может у тебя вообще окно не находится
Код:

function EnumChildProc(wnd:hwnd; lParam:integer):boolean; stdcall;
var
 buf:array[0..255] of char;
begin
 GetWindowText(wnd, buf, 255);
 form1.memo1.lines.add(inttohex(wnd, 8)+' '+buf);
 result := true;
end;


МongBa† 21.07.2009 04:23

То ли меня с просони глючит, то ли х3..

Поставил ту же версию вайпа:
Код:

000614CE    TFmMain    Hard Disk Wipe Tool 2.35 build 1178
TFmMain а не TFmChoose

Код:

var wnd:HWND;
    b1,b2:array[0..255] of char;
begin
 wnd:=FindWindow(nil,PChar('Hard Disk Wipe Tool 2.35 build 1178'));
 if wnd<>0 then
 begin
  GetClassName(wnd,b1,255);
  GetWindowText(wnd, b2, 255);
  Memo1.Lines.Add(inttohex(wnd,8)+'  '+b1+'  '+b2);
 end;

И если поковырять глубже - структура похожа, но не оно..
Код:

00180DE0  TFmMain  Hard Disk Wipe Tool 2.35 build 1178
---002611B8  TPanel 
------00371188  TPanel 
------00171238  TPageControl 
---------0010126A  TTabSheet  Device details
---------0028117E  TTabSheet  WIPE
---001A1212  TStatusBar 
---000E1202  TPanel 
---0016128C  TPanel

З.Ы. ex3me , каким софтом смотрел структуру хендлов? тоже похожим страдаю...

Gar|k 21.07.2009 12:26

2 МongBa† эт Spy++ от мелкомягкого.
щас найду лабу свою...

http://zona-chat.narod.ru/laba_winapi.jpg
Качаем проект delphi 7

ну думаю в комментариях не нуждается, все видно на картинке. посмотрите по коду че и как думаю разберетеся.

ex3me 25.07.2009 16:22

slesh, мои бока, сорри, окно не то было... На кнопку нажал
МongBa†, ты прав. Не то окно было!
Gar|k, мерси, благодаря твоему творению нашел и нажал на кнопку!

Теперь вопрос нумбер два :D :

Как нажать на TTabSheet с Caption "WIPE" (хендл нужной мне кнопки появляется только когда клацаю по этому табшиту)?
http://i053.radikal.ru/0907/0a/b41b1b7a3018.jpg
Собсна пробовал такими способами:
Код:

Sendmessage(h,WM_LBUTTONDOWN,MK_LBUTTON,MakeLParam(1,1)); // нажать
Sendmessage(h,WM_LBUTTONUP,MK_LBUTTON,MakeLParam(1,1));  // и отпустить

Код:

if (GetWindowText(hw, wText, 255) > 0) then
      if (wText='WIPE') then begin
        SendMessage(hw,WM_IME_KEYDOWN,VK_SPACE,0);
        SendMessage(hw,WM_IME_KEYUP,VK_SPACE,0);

Скажу сразу, что на TButton эти оба способа работают, а вот TTabSheet не хочет нажиматься. Плюс к этому: моя задача заключается в том, чтобы нажать TTabSheet когда окно скрыто, но если это неосуществимо, то хотябы подскажите, пожалуйста, как можно словить чтоли координаты и быстро ткнуть мышкой на этот табшит =\


Время: 04:11