Click here to Skip to main content
15,300,338 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
I am trying to send keystrokes to a 16bit DOS application that is wrapped in NTVDM. My code below currently is able to successfully send keystrokes to any application (e.g. Notepad) including the command prompt which makes me wonder why it doesnt work with the DOS application im trying to send to. Though i believe it has something to do with the DOS application being wrapped in NTVDM. Hopefully somebody can give me some clues. My code successfully finds the correct application and brings it to the foreground but it doesn't respond to any keystrokes I send to it:

C#
[DllImport("user32.dll")]
static extern uint MapVirtualKey(uint uCode, uint uMapType);


[DllImport("user32.dll")]
static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, uint dwExtraInfo);

const uint KEYEVENTF_KEYUP = 0x0002;
const uint KEYEVENTF_EXTENDEDKEY = 0x0001;
const int VK_UP = 0x26; //up key
const int VK_DOWN = 0x28; //down key
const int VK_LEFT = 0x25;
const int VK_RIGHT = 0x27;
const int VK_NUMPAD0 = 0x60;
const int VK_NUMPAD1 = 0x61;
const int VK_NUMPAD2 = 0x62;
const int VK_NUMPAD3 = 0x63;
const int VK_NUMPAD4 = 0x64;
const int VK_NUMPAD5 = 0x65;
const int VK_NUMPAD6 = 0x66;
const int VK_NUMPAD7 = 0x67;
const int VK_NUMPAD8 = 0x68;
const int VK_NUMPAD9 = 0x69;
const int VK_LMENU = 0x12;
const int VK_SPACE = 0x20;

private void btnCMD_Click(object sender, EventArgs e)
{
Application_Methods.GoToCMD();
Thread.Sleep(1000);
byte LMENU = 0x12;
byte SPACE = 0x20;
uint scanCode = MapVirtualKey((uint)LMENU, 0);
uint scanCode1 = MapVirtualKey((uint)SPACE, 0);
keybd_event(LMENU, (byte)scanCode, 0, 0);
keybd_event(SPACE, (byte)scanCode1, 0, 0);
keybd_event(SPACE, (byte)scanCode1, KEYEVENTF_KEYUP, 0);
keybd_event(LMENU, (byte)scanCode, KEYEVENTF_KEYUP, 0);
SendKeys.Send("e");
SendKeys.Send("s");
}

public static void GoToCMD()
{
//Find the window, using the CORRECT Window Title
int hWnd = FindWindow("ConsoleWindowClass", "C:\\Windows\\system32\\cmd.exe");
ShowWindowAsync(hWnd, SW_SHOWNORMAL);
SetForegroundWindow(hWnd); //Activate it

}
Posted
Updated 3-Nov-14 21:36pm
v2

You may have better luck with the Clipboard (System.Windows.Forms.Clipboard). Please see http://msdn.microsoft.com/en-us/library/system.windows.forms.clipboard(v=vs.110).aspx[^]
   
Comments
   
The virtual OS has its separate clipboard. Won't work. Besides, this is not what OP wanted. Clipboard does not provide any messaging mechanism. Why guessing? Please answer only if you are confident enough, feel some responsibilities before inquirers.
—SA
SA, please get a life. I've been talking to applications running in NTVDMs for years. it's not easy, but I've had much more success with the clipboard than with trying to force feed keystrokes to it.
   
Comments
Afzaal Ahmad Zeeshan 4-Nov-14 3:38am
   
It is not a better way to help the OP just to argue! If you think you're right (because I have no knowledge of DOS kinda things) you can simply give a sample code, and tell us that you're right. No need for arguing. :)
David A. Gray 12-Dec-14 23:03pm
   
My message was intended to be a comment in favor of the excellent solution that was already proposed. Only later did I notice that it was marked as another solution.
CHill60 4-Nov-14 12:37pm
   
Don't post comments as solutions. At best the target member is not notified of your response. At worst other members will ignore the question because there has been a response. In the meantime your post may attract downvotes and reports
David A. Gray 12-Dec-14 23:01pm
   
My reply was intended as a comment in favor of the excellent solution that was already posted; I didn't notice that it posted as another (redundant) solution.

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900