2

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

所以在研究之后我发现了这个,它几乎告诉我如何解决我的问题。

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

  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 回答
2

要发送多媒体键,包括Play/PauseNextTrackPrevTrack等,您可以使用keybd_event

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课程很好,但也很有限。上述方法将按键命令直接发送到 Windows 操作系统。

于 2020-10-22T19:46:12.157 回答