Форум: "WinAPI";
Текущий архив: 2004.03.28;
Скачать: [xml.tar.bz2];
ВнизНужно эмитировать нажатие меню в чужой программе Найти похожие ветки
← →
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 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.03.28;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.034 c