我需要在第三方应用程序中模拟按键。假设我有一个需要向计算器应用程序发送“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 访问它,但没有运气)。没有错误或异常,但它在计算器中没有任何作用。
我也用记事本尝试了完全相同的东西,也没有任何改变。