Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 向包装在NTVDM中的16位DOS应用程序发送击键_C#_Windows_Macros_Ntvdm_Ntvdm.exe - Fatal编程技术网

C# 向包装在NTVDM中的16位DOS应用程序发送击键

C# 向包装在NTVDM中的16位DOS应用程序发送击键,c#,windows,macros,ntvdm,ntvdm.exe,C#,Windows,Macros,Ntvdm,Ntvdm.exe,我试图将击键发送到一个用NTVDM包装的16位DOS应用程序。我下面的代码目前能够成功地将击键发送到任何应用程序(例如记事本),包括命令提示符,这让我想知道为什么它不能与我试图发送到的DOS应用程序一起工作。尽管我相信这与用NTVDM包装DOS应用程序有关。希望有人能给我一些线索。此时,我下面的代码正在向命令提示符发送ALT+SPACE并选择all: [DllImport("user32.dll")] static extern uint MapVirtualKey(uint uCode, ui

我试图将击键发送到一个用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

    }

请注意,您并没有尝试将击键发送到应用程序,而是尝试将它们发送到控制台窗口。问题可能出在
GoToCMD()
函数中,您没有显示该函数。我添加了遗漏的GoToCMD()代码。它所做的一切就是找到应用程序的窗口(在本例中是命令提示符),并将其带到前台,这样做没有任何问题。另外,那些特定的命令im-sending(ALT+SPACE)需要发送到控制台窗口,以便我可以选择全部并复制数据输出。您是否仔细检查了控制台窗口是否确实有您正在搜索的标题?(已经有一段时间了,但我还记得当启动一个16位应用程序时,标题会发生变化。)另外,试着只运行选择代码,然后点击ALT-SPACE以查看是否有效。如果可能的话,请考虑使用它。没错,它有正确的标题,因为DOS应用程序位于前台,所以我知道它是有效的。ALT+空格在我实际操作时起作用。ALT+SPACE只是我需要在这个应用程序中执行的一个函数,我还需要使用数字1-9和ESC键。它没有显示在我的代码中,但我以前都尝试过,但它们在DOS应用程序中不起作用,请注意,它们在所有其他应用程序中都起作用,例如记事本、microsoft word以及命令提示符