Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
14-1091035084
Nel
2004-07-28 21:18
2004.08.15
Бесплатный хостинг


4-1088692618
Интересующийся
2004-07-01 18:36
2004.08.15
Как узнать какие сет. карты установлены?


1-1091462688
ceval
2004-08-02 20:04
2004.08.15
как программно задать ширину колонки в Excel


1-1091435727
Andrey
2004-08-02 12:35
2004.08.15
Изменений цвета TTreeNode


3-1089960034
Qwer
2004-07-16 10:40
2004.08.15
DBGrid





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский