Просмотр полной версии : [Вопрос] 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.
эт только догадки, может чем поможет
Нет, к сожалению это не то совсем. Нигде там пустот не имеется, и код 200% рабочий. Вопрос заключается в том, как добраться именно к той кнопке, хендл которой изображен на рисунке структуры
З.Ы. Процедура на то и процедура, что она может не принимать никаких параметров и в отличие от функции не возвращает из себя какое-либо значение. Перечитай "Основы процедурного программирования на Delphi"
получить хэндл кнопки?
FindWindowEx(parentHwnd, 0, 'TButton', 'Continue >>>');
parentHwnd - хэндл родителя, думаю его получить это раз плюнуть.
... На всякий случай FindWindow
Получить текст всех элементов?
EnumChildWindow
заморачиваться над таким? Быстрее перечислить элементы родительноского окна.
Как написал 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;
W!z@rD, slesh, спасибо, но увы - история та же. Button Handle = 000000 конкретно в последнем примере. Самое интересное что Autoit Window Info показывает адекватно хендл энтой кнопки, и если бы хендлы были статичные - было бы намного проще =))) Придется видимо искать другие варианты =\
я сделал подобного вида форму, и нормально нашло всё. может там кнопка чуть по другому называется. попробуй запустить с таким кодом и поискать кнопку в списке.
Также может у тебя вообще окно не находится
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;
То ли меня с просони глючит, то ли х3..
Поставил ту же версию вайпа:
000614CE TFmMain Hard Disk Wipe Tool 2.35 build 1178TFmMain а не 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 , каким софтом смотрел структуру хендлов? тоже похожим страдаю...
2 МongBa† эт Spy++ от мелкомягкого.
щас найду лабу свою...
http://zona-chat.narod.ru/laba_winapi.jpg
Качаем проект delphi 7 (http://zona-chat.narod.ru/lab_winapi.rar)
ну думаю в комментариях не нуждается, все видно на картинке. посмотрите по коду че и как думаю разберетеся.
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 когда окно скрыто, но если это неосуществимо, то хотябы подскажите, пожалуйста, как можно словить чтоли координаты и быстро ткнуть мышкой на этот табшит =\
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 когда окно скрыто, но если это неосуществимо, то хотябы подскажите, пожалуйста, как можно словить чтоли координаты и быстро ткнуть мышкой на этот табшит =\
ShowWindow or SetActiveWindow, window API try it
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot