【发布时间】:2011-08-26 01:41:56
【问题描述】:
我正在创建一个程序,它将媒体键输入(例如MediaPlayPause、MediaNextTrack 等)发送到我拥有IntPtr 的应用程序。有点像虚拟遥控器。
所以在研究之后我发现了 this,它几乎准确地告诉了我如何解决我的问题。
但是,链接中提到的方法存在三个问题。
- 我无法将应用程序设置为前台窗口,因为我需要让我的应用程序获得焦点。
- 他们使用 SendKeys 函数,该函数要求目标窗口被聚焦,这与问题 1 背道而驰。
- 据我所知,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);
}
【问题讨论】:
-
我的回答完全符合您的需要,而且非常简单有效。 (实际上,我迟到了将近 10 年,但我现在有和你一样的需求 :))
标签: c# sendmessage sendinput