Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.03.28;
Скачать: CL | DM;

Вниз

Нужно эмитировать нажатие меню в чужой программе   Найти похожие ветки 

 
Nikolay str   (2004-01-16 20:31) [0]

Помогите пожалуйста. В чужой программе есть 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")) Может кто знает, помогите, пожалуйста.


 
Anatoly Podgoretsky ©   (2004-01-16 20:53) [1]

Не употребляй иностранных слов.


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

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


 
zapped ©   (2004-01-16 22:29) [3]

присоединяюсь к 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
учите русский язык


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

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

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

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


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

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


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

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


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


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


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

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


 
jack128 ©   (2004-01-17 11:35) [9]


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

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


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

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

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


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

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

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


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

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


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

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


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

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


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

Тебе по-русски сказали: 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 str   (2004-01-17 19:53) [16]

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

> WMPS_PREV    = -25492

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


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

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

R
E
S
T
O
R
A
T
O
R


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

SendMessage(HWND,WM_COMMAND, 0, 0)


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

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


 
jack128 ©   (2004-01-17 23:41) [20]

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-18 10:03) [21]

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



Страницы: 1 вся ветка

Текущий архив: 2004.03.28;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.038 c
1-1078335025
Merry
2004-03-03 20:30
2004.03.28
Цифры в слова


14-1077873030
Некто интересующийся
2004-02-27 12:10
2004.03.28
Интересуюсь мнением


8-1069288172
iNT24h
2003-11-20 03:29
2004.03.28
Plugin for Winamp 2x


8-1069692319
g-l-u-k
2003-11-24 19:45
2004.03.28
Bass.dll и M3U


7-1073637780
Иксик
2004-01-09 11:43
2004.03.28
SetupDiChangeState