![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Эмуляция нажатия клавиш в DOS-приложениях [D5, Win95/98]
Kasalex © (2002-07-29 11:20:00)Нужно передавать нажатия клавиш активному DOS-приложению. Keybd_event() для таких приложений, к сожалению, не срабатывает. Помогите, пожалуйста!
Kasalex (2002-07-31 11:12:00) [1]> Adder
Да, работает. Правда не совсем понятно как... Как бы получается, что передавая Virtual Key равным 0, мы на самом деле передаем скан-код Alt+буква? Т.е. чтобы "написать" "dos" надо передать 3 скан-кода "Alt+d" "Alt+o" "Alt+s"? Причем даже "отжатие" клавиш не эмулируется... А если мне надо, например, передать DOS-программе комбинацию клавиш типа "Alt+..."? Может я все не так понял? Поясни пожалуйста!
Adder (2002-07-30 17:04:00) [2]Немного поправлю код:
procedure TForm1.Button1Click(Sender: TObject);
var h,h_old:HWND;
begin
h:= FindWindow ("ConsoleWindowClass","C:\DN\DN.COM") ;// Win NT
// h:= FindWindow ("tty","DN - DN") ;// Win98
h_old:= GetForegroundWindow();
SetForegroundWindow(h);
ShowWindow(h,SW_SHOWNORMAL);
keybd_event(0,32,0,0);
keybd_event(0,24,0,0);
keybd_event(0,31,0,0);
ShowWindow(h,SW_HIDE);
SetForegroundWindow(h_old);
end;
Для DOS-программы в оконном режимеработает.
Adder (2002-07-30 17:04:00) [3]Немного поправлю код:
procedure TForm1.Button1Click(Sender: TObject);
var h,h_old:HWND;
begin
h:= FindWindow ("ConsoleWindowClass","C:\DN\DN.COM") ;// Win NT
// h:= FindWindow ("tty","DN - DN") ;// Win98
h_old:= GetForegroundWindow();
SetForegroundWindow(h);
ShowWindow(h,SW_SHOWNORMAL);
keybd_event(0,32,0,0);
keybd_event(0,24,0,0);
keybd_event(0,31,0,0);
ShowWindow(h,SW_HIDE);
SetForegroundWindow(h_old);
end;
Для DOS-программы в оконном режимеработает.
Adder (2002-07-30 16:00:00) [4]Ну... за неимением NC поиграем с DN ;)
Проверки не пишу....лень 8)
procedure TForm1.Button1Click(Sender: TObject);
var h,h_old:HWND;
begin
h:= FindWindow ("ConsoleWindowClass","C:\DN\DN.COM") ;
h_old:= GetForegroundWindow();
SetForegroundWindow(h);
keybd_event(0,32,0,0);
keybd_event(0,24,0,0);
keybd_event(0,31,0,0);
SetForegroundWindow(h_old);
end;
Kasalex (2002-07-30 11:48:00) [5]> передавать WM_CHAR обычным способом через SendMessage()
Эх, все равно не получается... ПростоSendMessage(FindWindow(nil,"nc - NCMAIN"),WM_Char,Ord("a"),0)не работает. Не работает и такая конструкция:
HWin:=FindWindow(nil,"nc - NCMAIN");
If HWin=0 Then ShowMessage("0!!!") Else
Begin
CThID:=GetCurrentThreadId;
ThID:=GetWindowThreadProcessId(HWin,nil);
If CThID=ThId Then HWin:=GetFocus
Else
If AttachThreadInput(CThID,ThID,True)=False Then
Begin
HWin:=0;
ShowMessage("Attach Failed!");
End // If Fail
Else HWin:=GetFocus;
If HWin<>0 Then
Begin
SendMessage(HWin,WM_Char,Ord("a"),0);
Application.ProcessMessages;
AttachThreadInput(CThID,ThID,False);
End; // If HWin<>0
End; // Else
Может кто подскажет в чем дело?
Song (2002-07-30 09:24:00) [6]Нет я имел ввиду или-или
Можете передавать WM_CHAR обычным способом через SendMessage()
Kasalex (2002-07-30 08:21:00) [7]Никто не поможет?
Kasalex (2002-07-29 15:23:00) [8]
> Song © (29.07.02 13:34)
> WM_CHAR
> PostThreadMessage()
Не получается. Может я не так делаю?
ThID:=GetWindowThreadProcessId(GetForegroundWindow,nil);
PostThreadMessage(ThID,WM_Char,Ord("A"),0);
Application.ProcessMessages;
Song (2002-07-29 13:34:00) [9]WM_CHAR
PostThreadMessage()