2016-06-14 9 views
4

私の特定のケースでは、キーボードのキーストロークをDosBoxに送信しようとしています(Windowsコマンドプロンプトではなくdos-gamesエミュレータ) )。C#.net SendKey()を使用せずにmabyeをフックしてキーを送信する

私はSendKeysを使ってそれをやってみましたが、DosBoxはWindowsメッセージを処理するアプリケーションではないため、動作しません。私はこのように、キーボードフックを使用していることをやろうとしている瞬間に

: することは、第1の方法は、フックキーストロークを受け取り、(this exampleのように)次のアプリケーションを介してそれらを置くものです

private IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) 
    { 
     return CallNextHookEx(hookId, nCode, wParam, lParam); 
    } 

    private void GenerateKeyPress() 
    { 
     int vkCode = (int)Keys.Up; //My chosen key to be send to dosbox 
     IntPtr lParam = new IntPtr(vkCode); 
     IntPtr wParam = new IntPtr(255); 

     CallNextHookEx(hookId, 0, wParam, lParam); 
    } 

ただし、CallNextHookEx()関数呼び出しは、アクセス違反の例外をスローします。

私はここで何を考える必要がありますか?

答えて

4

アクセス違反がLPARAMlow-level keyboard hookため、それであるという事実に起因する、一つは

SetWindowsHookEx(WH_KEYBOARD_LL,...) 

で作成はKBDLLHOOKSTRUCTへのポインタではなくポインタを装っキーコードです。フックチェーンの次のフックに任意のメモリ位置にアクセスするよう指示しています。 (また、WPARAMWM_KEYDOWNの一つ、WM_KEYUPWM_SYSKEYDOWN、又はWM_SYSKEYUPことになっている。)

リンクされたサンプルコードは、実際に参照構造の最初の整数を読み取っているキーコードを取得するためにMarshal.ReadInt32(lParam)を使用しますポインタによって。限り、あなたが達成しようとしているもの、それを行うための方法がbeencoveredheresomanytimesthatitdoesnotbearrepeating.


だ話題であるSendInputを用いることであろうと

(これはSendInputの質問すべてでさえない)

0

"SendKeys"を置き換えるには、 "keybd_event"を使うべきだと思います。

public static class Keyboard 
{ 
    public static void Press(Keys keys, int sleep = 1) 
    { 
     var keyValue = (byte)keys; 

     NativeMethods.keybd_event(keyValue, 0, 0, UIntPtr.Zero); //key down 

     Thread.Sleep(sleep); 

     NativeMethods.keybd_event(keyValue, 0, 0x02, UIntPtr.Zero); //key up 
    } 
} 

internal static partial class NativeMethods 
{ 
    [DllImport("user32.dll")] 
    internal static extern void keybd_event(byte bVk, byte bScan, int dwFlags, UIntPtr dwExtraInfo); 
} 
関連する問題