Форум: "WinAPI";
Текущий архив: 2004.08.15;
Скачать: [xml.tar.bz2];
ВнизНажатие кнопки в другой программе Найти похожие ветки
← →
pavel_guzhanov © (2004-06-29 11:44) [0]Имеется запущенная программа (не моя). Мне известен заголовок формы, и имя кнопки на этой форме. Мне надо из моей программы нажать эту кнопку. Кнопка на тулбаре, известен ее хинт.
Можно ли это сделать, и как?
← →
Dimaxx (2004-06-29 20:48) [1]FindWindow + PostMessage(<хэндл кнопки>,BM_CLICK,0,0);
← →
pavel_guzhanov © (2004-06-30 09:14) [2]я определяю хендл окна h функцией FindWindow, все определяется нормально. После этого пишу
BtnHnd:=FindWindowEx(h, 0, "TToolButton", "&OK");//Находим кнопку
Вот здесь BtnHnd всегда получается равен 0, хотя кнопка такая есть, и caption ее указан стопудово правильно. В чем здесь глюк?
← →
Dimaxx (2004-07-01 21:57) [3]Попробую и отпишу...
← →
GuAV © (2004-07-01 23:07) [4]
> "TToolButton",
У этих кнопок хендла ваще нет.
← →
GuAV © (2004-07-01 23:09) [5]...а слать надо TB_xxx самому TToolBar
← →
pavel_guzhanov © (2004-07-02 09:10) [6]а можно поподробнее или попонятнее, что слать? Что значит TB_xxx?
← →
GuAV © (2004-07-02 11:28) [7]В Delphi выбираем help, там windows sdk.
Пишем TB_ и смотрим, находим TB_PRESSBUTTON...
← →
pavel_guzhanov © (2004-07-02 13:03) [8]пасиба!
← →
pavel_guzhanov © (2004-07-02 13:14) [9]Пардон, а как послать это сообщение? я попробовал вставить это сообщение в SendMessage, Получил [Error] fMain.pas(51): Undeclared identifier: "TB_PRESSBUTTON"
← →
GuAV © (2004-07-02 18:40) [10]Модули необходимые подключи?
Не знаешь какой? я тоже. Ищи строку TB_PRESSBUTTON в .pas файлах и подключи модуль где она объявлена.
← →
GrayFace © (2004-07-03 08:04) [11]А можно слать WM_LBUTTONDOWN и WM_LBUTTONUP.
← →
pavel_guzhanov © (2004-07-05 11:23) [12]нашел.
SendMessage(TBHnd, TB_PRESSBUTTON("ToolButton7", true),0,0);
Выдает ошибку "Missing operator or semicolon" сразу после открытия скобки после TB_PRESSBUTTON. Если же сделать:SendMessage(TBHnd, TB_PRESSBUTTON,0,0);
то вообще ничего не происходит, я так понимаю, потому, что не указано, какую кнопку жать.
Может быть я что-то делаю не так?
← →
GuAV © (2004-07-05 13:34) [13]я же говорил - хелп смотреть.
The TB_PRESSBUTTON message presses or releases the specified button in a toolbar.
TB_PRESSBUTTON
wParam = (WPARAM) idButton;
lParam = (LPARAM) MAKELONG(fPress, 0);
Parameters
idButton
Command identifier of the button to press or release.
fPress
Press flag. If this parameter is TRUE, the button is pressed. If it is FALSE, the button is released.
Return Values
Returns TRUE if successful or FALSE otherwise.
осталось внимательно прочитать это и написать правильно... :)
← →
pavel_guzhanov © (2004-07-05 14:30) [14]понятно, легко с умным видом копировать куски из хелпа, а вот просто подсказать (всего одну строчку) - так это же трудно, или западло. Не понятно только, чего по форумам лазить и отвечать на вопросы, если все ответы содержат одно и то же : Лезь в хелп. Видно, надо самоутвердиться?
А вот сайты и форумы из-за таких умных теряют посетителей
← →
GuAV © (2004-07-05 15:09) [15]Ладно уговорил, давай я почитаю.
SendMessage(TBHnd, TB_PRESSBUTTON, <сюда ID кнопки>, <cюда 1 - зажать, 0 - отпустить>);
т. е. если "нажать" понимать как зажать, а потом отпустить, то сначалаSendMessage(TBHnd, TB_PRESSBUTTON, <сюда ID кнопки>, 1);
, а потом (можно через время, чтобы увидеть, что она таки нажалась)SendMessage(TBHnd, TB_PRESSBUTTON, <сюда ID кнопки>, 0);
← →
pavel_guzhanov © (2004-07-05 15:28) [16]Спасибо! Извини, осерчал я очень, уже неделю бьюсь! А вот что такое ID кнопки? Если ее имя, т.е "ToolButton1", то ничего не получается, т.к этот патаметр должен быть Integer, а если хендл, то ты сам говорил, что у этих кнопок хендла нет. Так что же туда подставлять?
← →
GuAV © (2004-07-05 16:02) [17]
> А вот что такое ID кнопки?
Это ID. Кнопки нумеруются 0, 1, 2...
Я вот еще что подумал, может тебе эту кнопку нажимать не нужно, а нужно выполнить действие, которое выполняется, когда пользователь нажимает кнопку?
← →
pavel_guzhanov © (2004-07-05 16:10) [18]Да, надо выполнить действие. Но исходников той программы у меня нет, поэтому я и пытаюсь ее нажать. А нумерация кнопок как идет? Ну типа слева направо, или как то еще?
← →
GuAV © (2004-07-05 16:29) [19]
> Да, надо выполнить действие. Но исходников той программы
> у меня нет
а и не нужно WinSightом можно словить WM_COMMAND при нажатии кнопки, его затем и слать.
← →
GuAV © (2004-07-05 16:39) [20]А если не winsightом, то имхо через TB_GETBUTTON определить WM_COMMAND но это гемморой со сруктурой передаваемой через указатель.
или уже WM_LBUTTONDOWN, etc.
TB_PRESSBUTTON - только нажимает, упомяутого выше дейтсвия не происходит.
← →
pavel_guzhanov © (2004-07-05 16:44) [21]А что такое WinSight? И как им пользоваться?
← →
GuAV © (2004-07-05 16:50) [22]
> А что такое WinSight?
Програма, которая отображает сообщения передаваемые окнам других программ.
ws32.exe
AFAIK, не в любом Делфи есть
при установке как по умолчанию ставится.
← →
pavel_guzhanov © (2004-07-05 17:57) [23]Получил такую информацию:
Window text Поиск сотрудника по карте…
Process ID 00000A44 Client.exe
Application instance 00010000
Window Handle 000B012C
Parent Window 00010014
Window Function 00048BA8
Menu Handle 00000000
Window Rect in screen (417,172)-(587,231)
Window rect in parent (417,172)-(587,231)
Client rectangle (0,0)-(157,17)
#Msg processrd 87
Wndow Style 84800000
Popup, ClipSiblings, BorderTopmost, ToolWindow, Left,
LTRReading, RightScrollBar
ClassName THintWindow
Excutable module 00010000 Client.exe
Class window function 00048BA8
Icon 00000000
Cursor 00010011
Bakground brush 00000000
Window extra byts 00000000
Class extra Bytes 00000000
Class Style 0000080B
VRedraw, HRedraw, DblClks, SaveBits
Какую из этих данных посылать, и кому, окну или ToolBar??
← →
GuAV © (2004-07-05 19:55) [24]
> Получил такую информацию:
Не ту инфу получил.
Выбери Messages->Options, оставь только WM_COMMAND и отметь HexValues.
нажать Start.
Мессага будет внизу.
Это возможно пойдет, т.к. похоже, что прога не на Дельфи.
В VCL же как только что выяснил подобные мессаги игнорируются, VCL мышу ловит, так что только GrayFace © (03.07.04 08:04) [11]
← →
jack128 © (2004-07-05 22:08) [25]
> Это возможно пойдет, т.к. похоже, что прога не на Дельфи.
как раз НА дельфи
> ClassName THintWindow хотя я слабо понимаю зачем человек hint ловил ;-)
← →
GuAV © (2004-07-05 23:17) [26]
> THintWindow
Блин, я посмотрел нет ли буквы T и увидел что нет. меня глючит.
2pavel_guzhanov ©
Раз таки на Дельфи, забудь что я написал, шли WM_LBUTTONxxx, cм.
GrayFace © (03.07.04 08:04) [11]
← →
pavel_guzhanov © (2004-07-06 09:05) [27]я бы послал сообщение WM_LBUTTONxxx, только это сообщение требует координат курсора мыши. А окно не моей программы может быть в любом месте, так что координата кнопки - это неизвестная величина
← →
GuAV © (2004-07-06 11:38) [28]не через WM_LBUTTONxxx - не вижу способа. Потому что так работает VCL. TToolButton.Click - реализовано тем же макаром, что и TSpeedButton.Click.
Координаты можно получить TB_GETITEMRECT. В этой мессаге результат передается через указатель на структуру, что вызовет дополнительные трудности.
> А окно не моей программы может быть в любом месте
Существуют функции преобразования координат. ClientToScreen.
← →
GrayFace © (2004-07-06 15:50) [29]>я бы послал сообщение WM_LBUTTONxxx, только это сообщение требует координат курсора мыши. А окно не моей программы может быть в любом месте, так что координата кнопки - это неизвестная величина
По-моему, в нем координаты ставятся относительно клиентской части. Координаты кнопки на тулбаре могут меняться только от версии к версии. Чтобы вычислить их, наведи мышь на кнопку иScreenToClient(h,mouse.CursorPos)
будет тем, что нужно. (h - handle Toolbar"а)
← →
jack128 © (2004-07-06 17:18) [30]вот тебе пример. Это код нажимает первую кнопку на тулбаре в DMClient"e
function EnumWindowCallback(hWnd: THandle; Param: Integer): BOOL; stdcall;
const
_Caption = "Форум "Мастера Дельфи"";
var
Buffer: string;
hToolBar: THandle;
Pos: TSmallPoint;
begin
Result := True;
SetLength(Buffer, 256);
SetLength(Buffer, GetClassName(hWnd, PChar(Buffer), Length(Buffer)));
// Смотрим - тот ли класс окна
if Buffer <> "TMainForm" then
Exit;
SetLength(Buffer, GetWindowTextLength(hWnd));
GetWindowText(hWnd, PChar(Buffer), Length(Buffer));
// Смотрим тот ли заголовок окна (в программе заголовок меняется, но начало заголовка неизменно)
if copy(Buffer, 1, Length(_Caption)) <> _Caption then
Exit;
// Нужное окно нашли - прекращаем цикл по окнам
Result := False;
// Ищем ToolBar
hToolBar := FindWindowEx(hWnd, 0, "TToolBar", nil);
if hToolBar = 0 then
Exit;
// Примерные координаты центра перевой кнопки на тулбаре
Pos := SmallPoint(15, 15);
// Нажали кнопку мыши
SendMessage(hToolBar, WM_LBUTTONDOWN, 0, Integer(Pos));
// Отпустили кнопку мыши
SendMessage(hToolBar, WM_LBUTTONUP, 0, Integer(Pos));
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
// Запускаем цикл по всем окнам верхнего уровня
EnumWindows(@EnumWindowCallback, 0);
end;
← →
pavel_guzhanov (2004-07-06 17:42) [31]спасибо, попробую завтра, а то рабочий день кончается
← →
pavel_guzhanov (2004-07-07 10:12) [32]получилось прикольно. Прикол в том, ято координаты нужной мне кнопки - 88, 11. Когда подставляю их - ничего не работает. Подставляю исходные координаты (15, 15) - срабатывает именно нужная мне кнопка. Прикольно, но может ли кто-нибудь объяснить, почему это происходит?
← →
jack128 © (2004-07-07 10:42) [33]координаты задаются относительно левого верхнего угла окна(в данном случае тулбара). ты так делаешь?
← →
pavel_guzhanov (2004-07-07 11:23) [34]да, именно так. Но, что еще прикольнее, теперь этот глюк пропал, и все заработало так, как надо. Спасибо за помощь всем, кто пытался помочь!
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.08.15;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.036 c