Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Нужно эмитировать нажатие меню в чужой программе [D7, WinXP]


Страницы:   1 2

Nikolay str ©   (2004-01-16 20:31:00) 

Помогите пожалуйста. В чужой программе есть MainMenu, в нем есть пункт exit, мне надо эмитировать нажатие на него. Я написал следующее:
 H := FindWindow (nil, 'Form1');
 If H <> 0 then begin
 H2:=FindWindowEx(H,0,nil, PChar('Exit'));
 If H2 <> 0 then SendMessage (H2, BM_CLICK, 0, 0)
 else showmessage('Кнопка не нажимается');
 end
 else showmessage('Нет процесса');


Если MainMenu заменить кнопкой "exit", то всё работает. А в MainMenu никак не может найти пункт "exit". Короче косяк здесь:   H2:=FindWindowEx(H,0,nil, PChar('Exit'))Может кто знает, помогите, пожалуйста.


Nikolay str   (2004-01-18 10:03:00) [1]

Спасибо огромное. Теперь всё работает.


jack128   (2004-01-17 23:41:00) [2]

var
 hMenu: Cardinal;
begin
 hMenu := GetMenu(Handle); // Получаем меню окна.
 Win32Check(hMenu <> 0);
 hMenu := GetSubMenu(hMenu, 0); // Получаем саб меню
 Win32Check(hMenu <> 0);
 hMenu := GetMenuItemID(hMenu, 0); // Получаем id первого(по счету) меню - итема
 Win32Check(hMenu <> 0);
 PostMessage(hWnd, wm_command, MakeLong(hMenu, 0), 0); // имитировать нажание на меню
end;


Nikolay str   (2004-01-17 21:17:00) [3]

Ну не находит RESTORATOR MainMenu. Сам попробуй!


Nikolay str   (2004-01-17 20:30:00) [4]

SendMessage(HWND,WM_COMMAND, 0, 0)


Nick Denry   (2004-01-17 20:23:00) [5]

It's realy easy.
Запиши, а то забудешь :-)))))

R
E
S
T
O
R
A
T
O
R


Nikolay str   (2004-01-17 19:53:00) [6]

C этим ясно. Но как мне определить pParam. EXEscope и hakerReosurs не показывают MainMenu в проектах Делфи. Вот у тебя всё так просто:

> WMPS_PREV    = -25492

А как узнать, что -25492 вызывает процедуру WMPS_PREV? Подскажи, тогда каким редактором ресурсов пользоваться.


Nick Denry   (2004-01-17 15:11:00) [7]

Тебе по-русски сказали: WM_COMMAND!
Открываешь программу редактором ресурсов (как один из возможных вариантов).. далее по тексту см. пример:

const
WinAmpClass     = 'Winamp v1.x';
//Menu text **************************************************
TXTPREV     = 'Previous';
TXTPLAY     = 'Play';
TXTPAUSE    = 'Pause';
TXTSTOP     = 'Stop';
TXTNEXT     = 'Next';
TXTJUMP     = 'Jump To File';
TXTBACK5SEC  = 'Back 5 seconds';
TXTFORW5SEC  = 'Forward 5 seconds';
TXTVOLUP    = 'Turn volume up';
TXTVOLDOWN  = 'Turn volume down';
TXTTGLRPT    = 'Toggle repeat';
TXTTGLSHF    = 'Toggle shuffle';
TXTOPENDIR  = 'Open directory';
TXTSTARTVIS  = 'Start / Stop visualisation';
TXTOPTNS    = 'Options';
TXTEXITWMP  = 'Exit WinAmp';
//TXTEXIT     = 'Exit program';

//WinAmp Commands to send ************************************
WMPS_PREV    = -25492;
WMPS_PLAY    = -25491;
WMPS_PAUSE  = -25490;
WMPS_STOP    = -25489;
WMPS_NEXT    = -25488;
WMPS_JUMP    = -25342;
WMPS_BACK5SEC = -25475;
WMPS_FORW5SEC = -25476;
WMPS_VOLUP  = -25478;
WMPS_VOLDOWN = -25477;
WMPS_TGLREP  = -25514;
WMPS_TGLSHF  = -25513;
WMPS_OPENDIR = -25349;
WMPS_STARTVIS = -25344;
WMPS_EXIT    = -25535;

procedure WAmpSendMesg (pParam : integer; setFrgnd : BOOL);
begin
 WinAmpHandle := FindWindow(WinAmpClass, nil);
IF setFrgnd=TRUE then begin
 ShowWindow(WinAmpHandle, SW_RESTORE);
 SetForegroundWindow(WinAmpHandle);
END;
 SendMessage(WinAmpHandle, WM_COMMAND, pParam, 0);
end;


Надеюсь понятно.


Nikolay stri   (2004-01-17 14:16:00) [8]

Но суть не в этом. Я никак не могу Имитировать нажатие пункта меню. Нашел Хэндл, поределил ID,посылаю сообщение WM_MENUSELECT - ничего.


Nikolay stri   (2004-01-17 14:13:00) [9]

Извиняюсь за свой русский, но я это вроде не сайт русского языка. И вообше честно говоря, я всегда думал, Что надо писать "Эмитировать."


zapped   (2004-01-17 12:59:00) [10]

2Nikolay str
Ты видать электронику на 5 сдал, зубрил (не берусь сказать "учил") ночами...
только " Эмитировать" и " Имитировать" это два разных глагола...
Прощу прощения у модераторов за оффтопик, но это вопиющая неграмотность!


Akvilon   (2004-01-17 12:04:00) [11]

GetMenu -- вернет хэндл меню
GetItemMenuID -- вернет id пункта
SendMessage -- WM_COMMAND этому пункту

прочитай в SDK про эти функции.


Nikolay str   (2004-01-17 11:50:00) [12]

Как я понял надо посылать
SendMessage(HWNDwindow,WM_MENUSELECT,0,0)

А как выбрать какой пункт меню нажать?


jack128   (2004-01-17 11:35:00) [13]


> А как тогда эмитировать нажатие пункта меню?

см Игорь Шевченко ©   (16.01.04 21:04) [2]


Nikolay str   (2004-01-17 11:22:00) [14]

А как тогда эмитировать нажатие пункта меню?


jack128   (2004-01-17 11:15:00) [15]


> Ну помогите определить HWND меню.
Меню - это не окно и у нго нету hwnd. Когда юзер кликнул на меню, посылается сообщение wm_command окну, которому это меню пренадлежит. в параметрах этого сообщения указывается id пункта меню. (см help по wm_command)


Nikolay str   (2004-01-17 11:03:00) [16]

Ну помогите определить HWND меню.


Alex Konshin   (2004-01-17 10:32:00) [17]

Не могу удержаться :))) Это - точно в орешник :)


Nikolay str   (2004-01-17 07:49:00) [18]

Под иностраными словами вы подразумиваете MainMenu? Так это я для "большей понятности" писал. А про WM_COMMAND, так это другой вопрос. У меня он не находит куда посылать COMMAND.

H2:=FindWindowEx(H,0,nil, PChar('Exit'));

Возращает 0. При чём, если Exit это не меню, а кнопка, то всё работает, но мне надо, чтобы и меню работало. А с помомощью WinSignt как определить HANDLE?


zapped   (2004-01-16 22:29:00) [19]

присоединяюсь к Anatoly Podgoretsky ©   (16.01.04 20:53) [1]
http://www.gramota.ru/dic/search.php?word=%FD%EC%E8%F2%E8%F0%EE%E2%E0%F2%FC&lop=x&gorb=x&efr=x&ag=x&zar=x&ab=x&sin=x&lv=x&pe=x&az=x
http://www.gramota.ru/dic/search.php?word=%FD%EC%E8%F1%F1%E8%FF&lop=x&gorb=x&efr=x&ag=x&zar=x&ab=x&sin=x&lv=x&pe=x&az=x
учите русский язык


Игорь Шевченко   (2004-01-16 21:04:00) [20]

WM_COMMAND надо послать. С какими параметрами - смотреть Spy++ или WinSignt. Примеров кода у меня просить не надо.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо