1

基本的なバックグラウンド キーロガーを作成しようとしています... キーボードの scanCode と状態は、pinvoke 関数の ToAsciiEx または ToUnicodeEx を介して変換されます。これらの関数には、KeyboardLayout の引数があります。現在の (アクティブなウィンドウの) キーボード レイアウトを取得するための関数 (以下を参照) があります。ただし、この関数は常に 0 を返します。エラー コードは 6 (ERROR_INVALID_HANDLE) です。

何か提案はありますか?

答えのためのthx

    static public IntPtr getActiveKeyBoardLayout() 
    {             
        int handle = 0;
        handle = GetForegroundWindow();

        IntPtr i = new IntPtr(handle);
        HandleRef hr = new HandleRef(wrapper, i);
        int pid;
        GetWindowThreadProcessId(hr, out pid);

        IntPtr layout = GetKeyboardLayout(pid);

        int er = Marshal.GetLastWin32Error();
        if (er > 0)
        {
            System.Console.Out.WriteLine("error " + er.ToString());
        }

        return layout;
    }
4

1 に答える 1

1

プロセスIDを関数に渡しています。スレッドIDが必要です。GetWindowThreadProcessId()の戻り値。Marshal.GetLastWin32Error()の使用方法も間違っています。これは、API関数が失敗コードを返した場合にのみ使用する必要があります。

于 2011-03-29T14:44:44.950 に答える