Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |
|
[Вопрос] Delphi, работа с хэндлами окон |

19.07.2009, 02:40
|
|
Участник форума
Регистрация: 07.01.2009
Сообщений: 186
Провел на форуме: 1247273
Репутация:
166
|
|
[Вопрос] 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.
Выдало сплошную пустоту.
Есть какие-нибудь идеи?
|
|
|

19.07.2009, 03:34
|
|
Участник форума
Регистрация: 03.09.2008
Сообщений: 155
Провел на форуме: 1201665
Репутация:
236
|
|
writeln(d) readln что и куда читает я не пойму...
попробуй заменить на:
или
Код:
var
f:System.Text;
begin
AssignFile(f,'C:\lol.txt');
Rewrite(f);
WriteLn(f, d);
CloseFile(f);
end;
у тебя процедура ничего не выводит procedure GetTransHandle(пусто);
begin
GetTransHandle(); //пустота
readln; //куда-то что-то читаем
end.
эт только догадки, может чем поможет
|
|
|

19.07.2009, 03:56
|
|
Участник форума
Регистрация: 07.01.2009
Сообщений: 186
Провел на форуме: 1247273
Репутация:
166
|
|
Нет, к сожалению это не то совсем. Нигде там пустот не имеется, и код 200% рабочий. Вопрос заключается в том, как добраться именно к той кнопке, хендл которой изображен на рисунке структуры
З.Ы. Процедура на то и процедура, что она может не принимать никаких параметров и в отличие от функции не возвращает из себя какое-либо значение. Перечитай "Основы процедурного программирования на Delphi"
|
|
|

19.07.2009, 09:02
|
|
Reservists Of Antichat - Level 6
Регистрация: 12.02.2006
Сообщений: 891
Провел на форуме: 1892597
Репутация:
836
|
|
получить хэндл кнопки?
PHP код:
FindWindowEx(parentHwnd, 0, 'TButton', 'Continue >>>');
parentHwnd - хэндл родителя, думаю его получить это раз плюнуть.
... На всякий случай FindWindow
Получить текст всех элементов?
__________________
*********************************
*Я не волшебник ٩(๏̯͡๏)۶, только учусь...*
*********************************
Программы на заказ
Times to fly...
Последний раз редактировалось W!z@rD; 19.07.2009 в 09:05..
|
|
|

19.07.2009, 10:34
|
|
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме: 3288241
Репутация:
3349
|
|
заморачиваться над таким? Быстрее перечислить элементы родительноского окна.
Как написал 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;
|
|
|

19.07.2009, 14:29
|
|
Участник форума
Регистрация: 07.01.2009
Сообщений: 186
Провел на форуме: 1247273
Репутация:
166
|
|
W!z@rD, slesh, спасибо, но увы - история та же. Button Handle = 000000 конкретно в последнем примере. Самое интересное что Autoit Window Info показывает адекватно хендл энтой кнопки, и если бы хендлы были статичные - было бы намного проще =))) Придется видимо искать другие варианты =\
|
|
|

19.07.2009, 23:14
|
|
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме: 3288241
Репутация:
3349
|
|
я сделал подобного вида форму, и нормально нашло всё. может там кнопка чуть по другому называется. попробуй запустить с таким кодом и поискать кнопку в списке.
Также может у тебя вообще окно не находится
Код:
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;
|
|
|

21.07.2009, 04:23
|
|
Познающий
Регистрация: 12.05.2009
Сообщений: 45
Провел на форуме: 255342
Репутация:
28
|
|
То ли меня с просони глючит, то ли х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 , каким софтом смотрел структуру хендлов? тоже похожим страдаю...
|
|
|

21.07.2009, 12:26
|
|
Постоянный
Регистрация: 20.03.2009
Сообщений: 564
Провел на форуме: 991929
Репутация:
395
|
|
2 МongBa† эт Spy++ от мелкомягкого.
щас найду лабу свою...

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

25.07.2009, 16:22
|
|
Участник форума
Регистрация: 07.01.2009
Сообщений: 186
Провел на форуме: 1247273
Репутация:
166
|
|
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 когда окно скрыто, но если это неосуществимо, то хотябы подскажите, пожалуйста, как можно словить чтоли координаты и быстро ткнуть мышкой на этот табшит =\
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|