将“MediaPlayPause”键发送到应用程序而不将焦点设置到该应用程序

2023-12-09

我正在创建一个程序,它将发送媒体键输入(例如MediaPlayPause, MediaNextTrack等)到我有的应用程序IntPtr的。有点像虚拟遥控器。

所以经过研究我发现this, which almost准确地告诉我如何解决我的问题。

然而,链接中提到的方法存在三个问题。

  1. 我无法将应用程序设置为前台窗口,因为我需要聚焦我的应用程序。
  2. 他们使用 SendKeys 函数,该函数要求目标窗口获得焦点,这与问题 1 背道而驰。
  3. 据我所知,SendKeys无法发送键盘按钮,例如键盘播放/暂停按钮。

最后,我对我必须使用什么感到相当困惑(SendInput?, SendMessage?).

任何帮助,将不胜感激。


EDIT

根据我收到的答案,我将下面的示例代码组合在一起。
理论上,它应该找到记事本并将字母“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);
}

大多数这些键都被转换为 WM_APPCOMMAND* 消息...所以你可以尝试SendMessage,另一个选项是SendInput(如果应用程序是基于 DirectInput 的)...

查看以下链接用于常见媒体播放器功能的 Windows API?- 也许有一些信息你可以使用......

至于焦点问题——没有100%可靠的解决方案(参见如何将击键发送到窗口而无需使用 Windows API 激活它?)...您可以实现 100% 可靠性的最佳方案是聚焦应用程序,发送密钥,重新聚焦您的应用程序...除非您编写某种设备驱动程序(内核模式)...

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将“MediaPlayPause”键发送到应用程序而不将焦点设置到该应用程序 的相关文章

随机推荐