我需要在第三方应用程序中模拟按键。假设我有一个 C# 应用程序,需要将“8”发送到计算器应用程序。我无法使用.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 访问它,但没有运气)。没有错误或异常,但它只是在计算器中不执行任何操作。
我也用记事本尝试过完全相同的操作,但也没有任何改变。