我试图理解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();
}
很简单,我只想点击calc按钮2,但我没有成功。
答案 0 :(得分:3)
当你调用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 ++实用程序并查看计算器窗口。您将发现必须进行更多FindWindowEx()调用以深入查看嵌套按钮。
请考虑使用UI自动化库来执行此操作。