【发布时间】:2026-01-23 21:35:01
【问题描述】:
我需要在第三方应用程序中模拟按键。假设我有一个需要向计算器应用程序发送“8”的 C# 应用程序。我不能使用 .Net 的 SendKeys 或 win32 api 的 keybd_event,因为它们都要求窗口是最活跃的窗口,而我的情况并非如此。
所以剩下的就是调用 sendMessage 和 postMessage。在过去的三个小时里,我一直在尝试获得一些结果,但现在我完全没有希望了。
我有以下几点:
[DllImport("user32.dll")]
public static extern int FindWindow(string lpClassName,string lpWindowName);
[DllImport("user32.dll")]
public static extern int SendMessage(int hWnd, uint Msg, int wParam, int lParam);
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("user32.dll", SetLastError = true)]
public static extern bool PostMessage(int hWnd, uint Msg, int wParam, int lParam);
private void button1_Click(object sender, EventArgs e)
{
const int WM_KEYDOWN = 0x100;
const int WM_SYSCOMMAND = 0x018;
const int SC_CLOSE = 0x053;
int WindowToFind = FindWindow(null,"Calculator");
int result = SendMessage(WindowToFind, WM_SYSCOMMAND, SC_CLOSE, 0);
Boolean result2 = PostMessage(WindowToFind, WM_SYSCOMMAND, SC_CLOSE, 0);
int result3 = SendMessage(WindowToFind, WM_KEYDOWN,((int)Keys.NumPad7), 0);
Boolean result4 = PostMessage(WindowToFind, WM_KEYDOWN, ((int)Keys.NumPad7), 0);
}
如您所见,我尝试了四次与计算器通信。使用 sendMessage 和 PostMessage 关闭窗口并发送密钥 7. 没有任何效果。 FindWindow 方法有效,因为我得到了应用程序的处理程序(我什至尝试自己启动进程并使用 process.MainWindowHandler 访问它,但没有运气)。没有错误或异常,但它在计算器中什么也不做。
我也用记事本尝试了完全相同的东西,也没有任何改变。
【问题讨论】:
-
windows 中的所有内容都运行消息 - 因此,当您移动鼠标时,您的应用程序可能会收到鼠标移动消息、按下按钮、鼠标按下消息。现在,看上面,明显的部分是你确定它找到了你的计算器??
标签: c# keypress handler sendmessage postmessage