2

メディア キー入力 ( 、 など) をアプリケーションに送信するプログラムを作成してMediaPlayPauseMediaNextTrackますIntPtr。仮想リモコンのようなもの。

そのため、調査した結果、これを見つけまし。これは、問題を解決する方法をほぼ正確に示しています。

ただし、リンクに記載されているアプローチには 3 つの問題があります。

  1. アプリケーションをフォーカスする必要があるため、アプリケーションをフォアグラウンド ウィンドウとして設定できません。
  2. 彼らは、ターゲット ウィンドウをフォーカスする必要があるSendKeys関数を使用しており、問題 1 に反しています。
  3. 私の知る限り、SendKeysはキーボードの再生/一時停止ボタンなどのキーボード ボタンを送信できません。

最後に、何を使用する必要があるかについてかなり混乱しています(SendInput?、SendMessage?)。

どんな助けでも大歓迎です。


編集

受け取った回答を使用して、以下のサンプル コードをハッキングしました。
理論的には、メモ帳を見つけて「L」の文字を挿入することになっています。

ただし、メモ帳には何も表示されず、アプリケーションがクラッシュすることもありません。私が見逃している明らかなエラーはありますか?

[DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
static extern IntPtr FindWindowByCaption(int ZeroOnly, string lpWindowName);

[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, int wParam, IntPtr lParam);

const int WM_KEYDOWN = 0x100;
//const int WM_KEYUP = 0x101;
const int L_KEY = 0x4C;

private void button1_Click(object sender, EventArgs e)
{
    IntPtr ip = FindWindowByCaption(0, "Untitled - Notepad");

    SendMessage(ip, WM_KEYDOWN, L_KEY, IntPtr.Zero);
    //SendMessage(ip, WM_KEYUP, L_KEY, IntPtr.Zero);
}
4

2 に答える 2

2

これらのキーのほとんどは WM_APPCOMMAND* メッセージに変換されます...そのためSendMessage、他のオプションを試すことができますSendInput(アプリケーションが DirectInput ベースの場合)...

一般的なメディア プレーヤー機能については、Windows APIのリンクを参照してください。- 参考になる情報があるかもしれません...

フォーカスの問題については、100% 信頼できる解決策はありません ( Windows API を使用してアクティブ化せずにキーストロークをウィンドウに送信する方法を参照してください)... 100% の信頼性で達成できる最善の方法は、アプリケーションにフォーカスすることです。 、キーを送信し、アプリケーションに再び焦点を合わせます...ただし、ある種のデバイスドライバー(カーネルモード)を作成します...

于 2011-08-26T01:59:22.207 に答える