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. At the moment my code below is sending ALT+SPACE to the command prompt and selecting all:
[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
}