将击键发送到包裹在NTVDM中的16位DOS应用程序

时间:2014-05-05 04:17:02

标签: c# windows macros ntvdm ntvdm.exe

我正在尝试将击键发送到包含在NTVDM中的16位DOS应用程序。我下面的代码目前能够成功地向任何应用程序(例如记事本)发送击键,包括命令提示符,这让我想知道为什么它不能与我试图发送的DOS应用程序一起工作。虽然我认为它与在NTVDM中包装的DOS应用程序有关。希望有人能给我一些线索。目前,我的代码是将ALT + SPACE发送到命令提示符并选择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

    }

0 个答案:

没有答案