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

时间:2011-08-26 01:41:57

标签: c# sendmessage sendinput

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

所以在研究之后我找到了 this 几乎告诉我如何解决我的问题。

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

  1. 我无法将应用程序设置为前台窗口,因为我需要将应用程序重点关注。
  2. 他们使用 SendKeys 功能,该功能需要聚焦目标窗口,与问题1相反。
  3. 据我所知, SendKeys 无法发送键盘播放/暂停按钮等键盘按钮。
  4. 最后,我对我必须使用的内容感到困惑(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);
    }
    

2 个答案:

答案 0 :(得分:2)

这些密钥中的大多数被转换为WM_APPCOMMAND *消息...因此您可以尝试SendMessage,另一个选项是SendInput(如果应用程序是基于DirectInput的)...

查看Windows API for common media player functions?中的链接 - 也许您可以使用一些信息......

关于焦点问题 - 没有100%可靠的解决方案(请参阅How do I send key strokes to a window without having to activate it using Windows API?)...您可以实现100%可靠性的最佳方法是关注应用程序,发送密钥,重新调整应用程序的重点。除了你会写一些设备驱动程序(内核模式)......

答案 1 :(得分:0)

要发送多媒体键,包括播放/暂停 NextTrack PrevTrack 等,您可以使用keybd_event:< / p>

public class Program
{
    public const int KEYEVENTF_EXTENTEDKEY = 1;
    public const int KEYEVENTF_KEYUP = 0;
    public const int VK_MEDIA_NEXT_TRACK = 0xB0;
    public const int VK_MEDIA_PLAY_PAUSE = 0xB3;
    public const int VK_MEDIA_PREV_TRACK = 0xB1;

    [DllImport("user32.dll")]
    public static extern void keybd_event(byte virtualKey, byte scanCode, uint flags, IntPtr extraInfo);

    public static void Main(string[] args)
    {
        keybd_event(VK_MEDIA_PLAY_PAUSE, 0, KEYEVENTF_EXTENTEDKEY, IntPtr.Zero);    // Play/Pause

        //keybd_event(VK_MEDIA_PREV_TRACK, 0, KEYEVENTF_EXTENTEDKEY, IntPtr.Zero);  // PrevTrack
        //keybd_event(VK_MEDIA_NEXT_TRACK, 0, KEYEVENTF_EXTENTEDKEY, IntPtr.Zero);  // NextTrack
    }

以下是此Windows API可以处理的受支持的键代码的列表:
https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes

SendKeys类非常好,但是它也受到限制。上面的方法将key命令直接发送到Windows操作系统。