gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:01:00 36 4
gpt4 key购买 nike

我想向 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/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com