我想向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#应用程序调用它。这就是我最终要做的,这是代码。
Down.h
extern "C" __declspec(dllexport) void PressDownKey();
Down.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/