4

アプリケーションにキーを送信しようとしました。簡単なテストのために、私はメモ帳を使用しました。コードは次のようになります。

[DllImport("USER32.DLL", EntryPoint = "SendMessageW", SetLastError = true,
         CharSet = CharSet.Unicode, ExactSpelling = true,
         CallingConvention = CallingConvention.StdCall)]
    public static extern bool SendMessage(IntPtr hwnd, int Msg, int wParam, int lParam);


        const int WM_KEYDOWN = 0x100;
    const int WM_a = 0x41;

        public void Press()
    {
        Process[] p = Process.GetProcessesByName("notepad");
        IntPtr pHandle = p[0].MainWindowHandle;

        SendMessage(pHandle, WM_KEYDOWN, WM_a, 0);
    }

しかし、何も起こりません。

私の主な目標は、昇格されたアプリケーションにキーを送信することですが、最初にメモ帳に送信したいと思います。SendMessageを使用したいのは、ボタンを押す時間を制御したいからです。また、他のアプリケーションをフォアグラウンドに配置したくないからです。それが私がSendKeysを使っていない理由です。

4

1 に答える 1

10

いくつかの問題:

  • 宣言が間違っています。最後の2つのパラメーターはintではなくIntPtrです。
  • SendMessageではなくPostMessageを使用する必要があります
  • 間違ったウィンドウに送信しています。メモ帳の編集ウィンドウは子ウィンドウです
  • WM_KEYUPを送信するのを忘れています
  • 実際に受け取る文字は、Shiftキーの状態によって異なります。

ネックショット:VistaおよびWin7 UIPI(ユーザーインターフェイス特権の分離)は、制限されたプロセスが昇格されたプロセスにメッセージを挿入するのを防ぎます。

于 2010-06-20T19:00:29.973 に答える