Re[3]: Эмуляция клавиатурного ввода для Dos окна
От: Privalov  
Дата: 17.01.06 07:55
Оценка: 2 (1)
Здравствуйте, Штурман, Вы писали:

Сейчас, к сожалению, не могу проверить детали, однако, взглянув на старые исходники, вспомнил, что 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);
Эмуляция клавиатурного ввода для Dos окна
От: Штурман  
Дата: 13.01.06 06:20
Оценка:
В поиск не посылать — перечитал все посты по схожим темам

Суть проблемы: имеется досовская прога, ей надо послать комбинацию клавиш, среди которых есть клавиши управления курсором. В них то все и дело — они игнорируются, хотя остальные клавиши обрабатываются корректно.
О подходе к реализации:
имеется следующий скриптик
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");

Эффект тот же. Кто-нибудь может посоветовать как добиться обработки сэмулированных нажатий для Дос-прилодений?
Re: Эмуляция клавиатурного ввода для Dos окна
От: Штурман  
Дата: 16.01.06 02:01
Оценка:
Неужели никто не сталкивался?
Re: Эмуляция клавиатурного ввода для Dos окна
От: Privalov  
Дата: 16.01.06 10:56
Оценка:
Здравствуйте, Штурман, Вы писали:


Ш>
Ш>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 подает нажатия клавиш в нужное тебе окно? Сдается мне, твоя программа работает сама с собой. Окно, принимающее нажатия клавиш, не должно ли быть активным?
Re[2]: Эмуляция клавиатурного ввода для Dos окна
От: Штурман  
Дата: 17.01.06 01:55
Оценка:
В том-то все и дело, что окно активно, и все нажатия до него доходят кроме управления курсором. Для подстраховки делал нужное окно активным
SetForegroundWindow(gHWND);
ShowWindow(gHWND, SW_RESTORE);

Только не помогает, эффект тотже
Re[4]: Эмуляция клавиатурного ввода для Dos окна
От: Штурман  
Дата: 17.01.06 08:31
Оценка:
Здравствуйте, 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, а при воспроизведении — передавать. Большое Человеческое Спасибо
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.