3

単一のキーボードコマンド(下矢印)を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にはウィンドウが1つしかなく、子ウィンドウはありません。このプロセスは、メモ帳とエクスプローラーで正常に機能します。SendMessageメソッドに送信している他のパラメータは、キーボード通知キーダウンのコードと下矢印キーのコードです。

だから私の質問は、DOSBOXにキー押下を送信するようにコードを変更するにはどうすればよいですか、またはこれを達成するための別の方法はありますか?

4

2 に答える 2

3

だから私はそれを自分で動かすことができました、これが私が見つけたものです。

DOSBOXはSDLアプリケーションであるため、OpenGLで実行されます。OpenGLアプリケーションへのメッセージの送信については前に説明し、SendInput()メソッドを使用して実行します。これは明らかに内部でSendKeys呼ばれているものなので、なぜそれがうまくいかなかったのかはわかりませんが、私だけではないようです。

このメンテナンスされていないライブラリは正常に機能しているようです。または、このようにカスタム実装を行うこともできます。

上記のスタックオーバーフローリンクで説明されている他のオプションは、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));
}
于 2013-02-08T11:56:38.647 に答える
2

Microsoftには、完全な実装とともに、このトピックに関する記事がずっと前からあります。

編集:コメントの会話ごとに-ここにコードがあります。

コンソールアプリ:

class Program
{
    static void Main(string[] args)
    {

        ConsoleKeyInfo ki = Console.ReadKey();
        while (ki.KeyChar != 'Z')
        {
            Console.WriteLine(ki.KeyChar);
            ki = Console.ReadKey();
        }
    }
}

Winformsアプリ:

SendKeys.SendWait("A");
Thread.Sleep(2000);
SendKeys.SendWait("Z");

コンソールアプリで出力を確認できます。これは、コマンドを受信して​​いることを意味します。

于 2013-02-07T18:19:53.663 に答える