ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

[Вопрос] Delphi, работа с хэндлами окон
  #1  
Старый 19.07.2009, 02:40
Аватар для ex3me
ex3me
Участник форума
Регистрация: 07.01.2009
Сообщений: 186
Провел на форуме:
1247273

Репутация: 166
Отправить сообщение для ex3me с помощью ICQ
По умолчанию [Вопрос] Delphi, работа с хэндлами окон

Имеется программа с такой вот "структурой хэндлов"

Как конкретно для такого примера правильно получить хэндл этой самой кнопки "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.
Выдало сплошную пустоту.

Есть какие-нибудь идеи?
 
Ответить с цитированием

  #2  
Старый 19.07.2009, 03:34
Аватар для Scripter
Scripter
Участник форума
Регистрация: 03.09.2008
Сообщений: 155
Провел на форуме:
1201665

Репутация: 236
По умолчанию

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.

эт только догадки, может чем поможет
 
Ответить с цитированием

  #3  
Старый 19.07.2009, 03:56
Аватар для ex3me
ex3me
Участник форума
Регистрация: 07.01.2009
Сообщений: 186
Провел на форуме:
1247273

Репутация: 166
Отправить сообщение для ex3me с помощью ICQ
По умолчанию

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

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

  #4  
Старый 19.07.2009, 09:02
Аватар для W!z@rD
W!z@rD
Reservists Of Antichat - Level 6
Регистрация: 12.02.2006
Сообщений: 891
Провел на форуме:
1892597

Репутация: 836


Отправить сообщение для W!z@rD с помощью ICQ
По умолчанию

получить хэндл кнопки?
PHP код:
FindWindowEx(parentHwnd0'TButton''Continue >>>'); 
parentHwnd - хэндл родителя, думаю его получить это раз плюнуть.
... На всякий случай FindWindow

Получить текст всех элементов?
PHP код:
EnumChildWindow 
__________________
*********************************
*Я не волшебник ٩(๏̯͡๏)۶, только учусь...*
*********************************
Программы на заказ
Times to fly...

Последний раз редактировалось W!z@rD; 19.07.2009 в 09:05..
 
Ответить с цитированием

  #5  
Старый 19.07.2009, 10:34
Аватар для slesh
slesh
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме:
3288241

Репутация: 3349


Отправить сообщение для slesh с помощью ICQ
По умолчанию

заморачиваться над таким? Быстрее перечислить элементы родительноского окна.
Как написал 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;
 
Ответить с цитированием

  #6  
Старый 19.07.2009, 14:29
Аватар для ex3me
ex3me
Участник форума
Регистрация: 07.01.2009
Сообщений: 186
Провел на форуме:
1247273

Репутация: 166
Отправить сообщение для ex3me с помощью ICQ
По умолчанию

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

  #7  
Старый 19.07.2009, 23:14
Аватар для slesh
slesh
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме:
3288241

Репутация: 3349


Отправить сообщение для slesh с помощью ICQ
По умолчанию

я сделал подобного вида форму, и нормально нашло всё. может там кнопка чуть по другому называется. попробуй запустить с таким кодом и поискать кнопку в списке.
Также может у тебя вообще окно не находится
Код:
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;
 
Ответить с цитированием

  #8  
Старый 21.07.2009, 04:23
Аватар для МongBa†
МongBa†
Познающий
Регистрация: 12.05.2009
Сообщений: 45
Провел на форуме:
255342

Репутация: 28
Отправить сообщение для МongBa† с помощью ICQ
По умолчанию

То ли меня с просони глючит, то ли х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 , каким софтом смотрел структуру хендлов? тоже похожим страдаю...
 
Ответить с цитированием

  #9  
Старый 21.07.2009, 12:26
Аватар для Gar|k
Gar|k
Постоянный
Регистрация: 20.03.2009
Сообщений: 564
Провел на форуме:
991929

Репутация: 395


По умолчанию

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


Качаем проект delphi 7

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

  #10  
Старый 25.07.2009, 16:22
Аватар для ex3me
ex3me
Участник форума
Регистрация: 07.01.2009
Сообщений: 186
Провел на форуме:
1247273

Репутация: 166
Отправить сообщение для ex3me с помощью ICQ
По умолчанию

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

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

Как нажать на TTabSheet с Caption "WIPE" (хендл нужной мне кнопки появляется только когда клацаю по этому табшиту)?

Собсна пробовал такими способами:
Код:
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 когда окно скрыто, но если это неосуществимо, то хотябы подскажите, пожалуйста, как можно словить чтоли координаты и быстро ткнуть мышкой на этот табшит =\
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с http формами на Delphi a1nt С/С++, C#, Delphi, .NET, Asm 7 05.12.2006 18:36



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ