c# - 从 C# 向 DOSBOX 发送键盘命令

标签 c# keyboard-events dosbox

我想向 DOSBOX 发送单个键盘命令(向下箭头),然后在 C# 中执行一些处理代码,然后循环。我的目标是自动运行 DOS 程序。

我的代码在记事本和 Windows 资源管理器上成功运行,但在 DOSBOX 上无法运行。

这是我的(简化的)代码:

[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam);

static void Main(string[] args)
{
    Console.ReadKey();
    System.Threading.Thread.Sleep(2000); //to give me time to set focus to the other window
    SendMessage(new IntPtr(0x001301CE), 0x0100, new IntPtr(0x28), new IntPtr(0));
}

我使用 WinSpy++ 获得了窗口句柄,DOSBOX 只有一个窗口,没有子窗口,这个过程适用于记事本和资源管理器。我发送给 SendMessage 方法的其他参数是 keyboard notification keydown 的代码和 down arrow key 的代码.

所以我的问题是,如何修改我的代码以将按键发送到 DOSBOX,或者是否有其他方法可以实现此目的?

最佳答案

所以我设法让它自己工作,这是我发现的。

DOSBOX 是一个 SDL application所以在 OpenGL 中运行。向 OpenGL 应用程序发送消息已 discussed before并使用 SendInput() method 完成.这显然是 SendKeys 在后台调用的内容,所以我不确定为什么它对我不起作用,但看起来我不是唯一的。

This unmaintained library似乎工作正常,或者可以完成自定义实现 like this .

上面堆栈溢出链接中讨论的另一个选项是编写 C 或 C++ 库并通过 C# 应用程序调用它。这就是我最终所做的,这是代码。

下.h

extern "C" __declspec(dllexport) void PressDownKey();

下载.cpp

#include <Windows.h>
#include "Down.h"
extern "C" __declspec(dllexport) void PressDownKey()
{
    KEYBDINPUT KeybdInput;
    ZeroMemory(&KeybdInput, sizeof(KeybdInput));
    KeybdInput.wVk = VK_DOWN;
    KeybdInput.dwExtraInfo = GetMessageExtraInfo();
    INPUT InputStruct;
    ZeroMemory(&InputStruct, sizeof(InputStruct));
    InputStruct.ki = KeybdInput;
    InputStruct.type = 1;
    int A = SendInput(1,&InputStruct,sizeof(INPUT));
    Sleep(10);
    ZeroMemory(&KeybdInput, sizeof(KeybdInput));
    KeybdInput.wVk = VK_DOWN;
    KeybdInput.dwFlags = KEYEVENTF_KEYUP;
    KeybdInput.dwExtraInfo = GetMessageExtraInfo();
    ZeroMemory(&InputStruct, sizeof(InputStruct));
    InputStruct.ki = KeybdInput;
    InputStruct.type = 1;
    A = SendInput(1,&InputStruct,sizeof(INPUT));
}

关于c# - 从 C# 向 DOSBOX 发送键盘命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14758062/

相关文章:

assembly - Int 21h/ah=39h 在创建目录时返回 AX=3

C# UserControl 多重继承

c# - 在 SQLite-net 中使用 WHERE 子句执行 UpdateAsync 和 DeleteAsync

c# - 'CompanyName.Foo' 是一个 'namespace' 但像 'type' 一样使用

html - Angular 6 - 移动设备上的按键空间

assembly - 如何在 DOSBox 下运行的程序集中写入文件

c# - 单元测试 ASP.Net MVC 授权属性以验证重定向到登录页面

javascript - 键盘向上/向下滚动

vba - 将 PostMessage WM_KEYDOWN/UP 发送到记事本编辑控件适用于 VK_F5 但不适用于普通字母

c++ - Turbo C++ 中的彩色输出