В поиск не посылать — перечитал все посты по схожим темам
Суть проблемы: имеется досовская прога, ей надо послать комбинацию клавиш, среди которых есть клавиши управления курсором. В них то все и дело — они игнорируются, хотя остальные клавиши обрабатываются корректно.
О подходе к реализации:
имеется следующий скриптик
var gShell=new ActiveXObject("WScript.Shell");
gShell.run("prog.exe",1,false); // вызов управляемой проги
gShell.run("playkey.exe keystroke.txt",0,true); // вызов управляющей проги
playkey:
int main(int argc, char* argv[])
{
BYTE vk,sc;
FILE *fin=fopen(argv[1],"r");
SleepEx(5000,false);
fread(&vk,sizeof(vk),1,fin);
fread(&sc,sizeof(sc),1,fin);
while (!feof(fin))
{
keybd_event(vk,sc,0,0);
keybd_event(vk,sc,KEYEVENTF_KEYUP,0);
SleepEx(500,false);
fread(&vk,sizeof(vk),1,fin);
fread(&sc,sizeof(sc),1,fin);
}
if (fin!=NULL)
fclose(fin);
return 0;
}
Пробовал из скрипта посылать туже комбинацию:
var gShell=new ActiveXObject("WScript.Shell");
gShell.run("klmgr.exe",1,false);
WScript.Sleep(5000);
gShell.SendKeys("{DOWN}{DOWN}{ENTER}c");
Эффект тот же. Кто-нибудь может посоветовать как добиться обработки сэмулированных нажатий для Дос-прилодений?
Здравствуйте, Штурман, Вы писали:
Ш>Ш>int main(int argc, char* argv[])
Ш>{
Ш> BYTE vk,sc;
Ш> FILE *fin=fopen(argv[1],"r");
Ш> SleepEx(5000,false);
Ш> fread(&vk,sizeof(vk),1,fin);
Ш> fread(&sc,sizeof(sc),1,fin);
Ш> while (!feof(fin))
Ш> {
Ш> keybd_event(vk,sc,0,0);
Ш> keybd_event(vk,sc,KEYEVENTF_KEYUP,0);
Ш> SleepEx(500,false);
Ш> fread(&vk,sizeof(vk),1,fin);
Ш> fread(&sc,sizeof(sc),1,fin);
Ш> }
Ш> if (fin!=NULL)
Ш> fclose(fin);
Ш> return 0;
Ш>}
Ш>
А ты уверен, что keybrd_event подает нажатия клавиш в нужное тебе окно? Сдается мне, твоя программа работает сама с собой. Окно, принимающее нажатия клавиш, не должно ли быть активным?
В том-то все и дело, что окно активно, и все нажатия до него доходят кроме управления курсором. Для подстраховки делал нужное окно активным
SetForegroundWindow(gHWND);
ShowWindow(gHWND, SW_RESTORE);
Только не помогает, эффект тотже
Здравствуйте, Штурман, Вы писали:
Сейчас, к сожалению, не могу проверить детали, однако, взглянув на старые исходники, вспомнил, что 2-й параметр в keybd_event (scan code) не используется. Во всяком случае, пока я клал в него скан-код, функция не всегда работала правильно. Я всегда передаю в него 0. Когда я разбирался с этой функцией, сначала смотрел пример испльзования в MSDN. Только через какое-то время на той же странице увидел, что параметр не используется.
keybd_event(vk,0,0,0);
keybd_event(vk,0,KEYEVENTF_KEYUP,0);
Еще можешь попробовать ее с флагом KEYEVENTF_EXTENDEDKEY, т.е. сэмулировать клавиши с дополнительного поля клавиатуры вместо цифрового.
keybd_event(vk,0,KEYEVENTF_EXTENDEDKEY,0);
keybd_event(vk,0,KEYEVENTF_EXTENDEDKEY|KEYEVENTF_KEYUP,0);
Здравствуйте, Privalov, Вы писали:
P>Еще можешь попробовать ее с флагом KEYEVENTF_EXTENDEDKEY, т.е. сэмулировать клавиши с дополнительного поля клавиатуры вместо цифрового.
P>P> keybd_event(vk,0,KEYEVENTF_EXTENDEDKEY,0);
P> keybd_event(vk,0,KEYEVENTF_EXTENDEDKEY|KEYEVENTF_KEYUP,0);
P>
О чудо! Оно работает!. Действительно при перехвате события надо сохранять Extended-key flag из lParam, а при воспроизведении — передавать. Большое Человеческое Спасибо