c# SendMessage点击按钮

本文关键字:按钮 SendMessage | 更新日期: 2023-09-27 18:12:37

我试图理解SendMessage函数,这是我的实际代码:

[DllImport("user32.dll")]
public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
[DllImport("user32.dll")]
private static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, string windowTitle);
static void Main(string[] args)
{
    Process test = Process.GetProcessesByName("calc")[0];
    IntPtr hwndChild = FindWindowEx(test.MainWindowHandle, IntPtr.Zero, "Button", "2");
    SendMessage(hwndChild, 245, IntPtr.Zero, IntPtr.Zero);
    Console.ReadKey();
}

很简单,我只是想点击计算按钮2,但是我没有成功

c# SendMessage点击按钮

在调用winapi函数时,错误检查从来不是可选的。它是一个C api,它不会抛出异常让你远离麻烦。那件事你得自己做。正确的代码应该是这样的:

    [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
    private static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, 
                                              string className, string windowTitle);
    ...
    IntPtr hwndChild = FindWindowEx(test.MainWindowHandle, IntPtr.Zero, "Button", "2");
    if (hwndChild == IntPtr.Zero) throw new System.ComponentModel.Win32Exception();

现在你知道为什么你的程序不能工作了。接下来要做的是启动spy++实用程序并查看计算器窗口。您将发现,您必须进行更多的findwindowwex()调用才能深入到嵌套按钮。

请考虑使用UI自动化库来完成此操作。