Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Клик мышью


Автор: Самурай 28.10.2005, 10:47
Нужно произвести клик мышкой (левая клавиша) программно в чужом окне в определенном месте. Т. е. пример: есть окно с MainMenu, я программно подвожу к пункту меню курсор мыши и совершаю клик по этому элементу меню, т. е. раскрывается пункт меню... Как осуществить?

Автор: Girder 28.10.2005, 10:51
SendMessage(XXX,BM_CLICK,0,0)

Автор: Самурай 28.10.2005, 11:24
Я взял пока собственную форму:
Код

procedure TForm1.Button4Click(Sender: TObject);
var
 Wnd: HWND;
begin
 SetCursorPos(Form1.Left + 10, Form1.Top + 30);
 Wnd:=GetActiveWindow;
 SendMessage(Wnd, BM_CLICK, 0, 0);
end;

Эффект нулевой, т. е. меню не раскрывается... smile smile

Автор: Girder 28.10.2005, 11:33
Код
procedure TForm1.Button1Click(Sender: TObject);
begin
 Close;
end;

procedure TForm1.Button2Click(Sender: TObject);
var i:DWord;
begin
 i:=FindWindowEx(Form1.Handle,0,nil,'Button1');
 if i<>0 then SendMessage(i,BM_Click,0,0);
end;

Автор: Самурай 28.10.2005, 12:09
С кнопкой-то понятно, т. к. все просто. Но что с MainMenu делать?

Автор: Alexeis 28.10.2005, 12:23
Цитата
С кнопкой-то понятно, т. к. все просто. Но что с MainMenu делать?

PostMessage(....Handle, WM_KeyDown, VK_DOWN, 0);

Автор: Самурай 28.10.2005, 12:25
alexeis1, не работает.
Код

var
 Wnd: HWND;
begin
 SetCursorPos(Form1.Left + 10, Form1.Top + 30);
 Wnd:=Form1.Handle;
 PostMessage(Wnd, WM_KeyDown, VK_DOWN, 0);

Добавлено @ 12:27
Все поиски ищут у нас объекты типа HWND, а меню у нас типа HMENU. Может есть похожий способ отыскания меню и работы с ним?

Автор: Alexeis 28.10.2005, 12:32
Вероятно
PostMessage(MainMenu1.Handle, WM_KeyDown, VK_DOWN, 0);

Автор: Самурай 28.10.2005, 12:34
Цитата(alexeis1 @ 28.10.2005, 13:32)
MainMenu1.Handle

А как узнать Handle этого меню в абсолютно чужом окне?

Автор: Alexeis 28.10.2005, 12:43
С помощью программы
WinSight - поставка Delphi
Ставишь галочку Spy -> Folow focus -> жмешь на меню нужной программы

Автор: Самурай 28.10.2005, 13:37
Сторонняя программа отпадает сразу. Все нужно делать в программе, т. е. на месте. smile

Автор: Romikgy 28.10.2005, 15:11
Можно поинтересоватся , что за прога в которой нужно нажать на меню, мож в меню есть связанные клавиши с пунктами меню???

Автор: Самурай 28.10.2005, 15:53
Цитата(Romikgy @ 28.10.2005, 16:11)
мож в меню есть связанные клавиши с пунктами меню

Очень может быть... Но это уже в другой теме.

Как я начинаю понимать, реализовать задуманное невозможно. smile

Автор: Самурай 28.10.2005, 20:52
Как я вижу решение проблемы отсутсвует... smile smile

Автор: Girder 28.10.2005, 23:08
Цитата
Но что с MainMenu делать?
А...а! Не правильно понял... smile

Цитата
Как я вижу решение проблемы отсутсвует...
Вот смотри к примеру первое меню не имеет вложенного мени(SubMenu)... тогда задействовать обработчик за ним вот так: SendMessage(XXX,WM_Command,3,0); А если он имеет под меню... то тогда а тебе надо его вызвать, то енто: TrackPopupMenu(дискрептор вызываемого меню, TPM_LEFTALIGN or TPM_LEFTBUTTON,...)

К примеру тебе надо вызвать обработчик меню которое находиться во втором меню в 2 позиции(и при ентом первое меню содержит 3 подменю, и они без вложенных меню smile ), тогда так: SendMessage(XXX,WM_Command,7,0);

Где XXX - енти дескриптор окна которому принадлежит меню(MainMenu)

Удачи.

Добавлено @ 23:10
Забыл добавить... что было проше в вычислениях номера используй GetMenuItemID

Автор: Самурай 28.10.2005, 23:15
Хороший поток информации в половине первого ночи...
Спасибо за подробности. smile По всей видимости мне WM_Command поможет, т. к. впринцепе визуально открывать меню мне не за чем.

Автор: Самурай 29.10.2005, 09:59
Спасибо, очень хорошо работает! smile

Автор: Гость_RaIDeR 31.10.2005, 01:10
Цитата
Цитата(alexeis1 @ 28.10.2005, )
MainMenu1.Handle

А как узнать Handle этого меню в абсолютно чужом окне?

GetMenu и GetSubMenu.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)