0

我正在尝试将击键发送到包装在 NTVDM 中的 16 位 DOS 应用程序。我下面的代码目前能够成功地将击键发送到任何应用程序(例如记事本),包括命令提示符,这让我想知道为什么它不适用于我试图发送到的 DOS 应用程序。虽然我相信这与被包裹在 NTVDM 中的 DOS 应用程序有关。希望有人能给我一些线索。目前,我下面的代码正在将 ALT+SPACE 发送到命令提示符并选择全部:

[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

    }
4

0 回答 0