我正在结构设计软件中构建插件,并使用 C# 来访问 API。所有的几何定义、材料、验证等都很好。我使用应用程序中的按钮来运行计算。计算完成后,会弹出附加窗口。
作为递归过程的一部分,我尝试使用 SendMessage 从 API 自动按“是”,但我无法使其工作。代码如下所示:
[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);
int WindowToFind = FindWindow(null, "Autodesk Robot Structural Analysis Professional 2014");
SendMessage(WindowToFind, WM_LBUTTONDOWN, 0, 0);
有谁知道更好的方法来解决这个问题(也许是 mouse_event)?
非常感谢您的帮助。
最好的,
在较高的层面上,我会给出一些选择:
使用 Windows API 和 AutomationElement 类。 您应该能够执行“调用”自动化模式来单击按钮。 对我来说,这将是执行此操作的首选方式。
使用Windows API加SendInput使用键盘(或鼠标)点击按钮。
查看 AutomationElement 类:http://msdn.microsoft.com/en-us/library/system.windows.automation.automationelement%28v=vs.110%29.aspx
您可能需要找到“uispy”或其他一些实用程序来查看 AutomationElements。 另一种选择是等待窗口标题更改为您要查找的内容 - 假设对话框的窗口标题与主窗口不同。
一些有用的 api 是:
[DllImport( "user32.dll", SetLastError = true )]
public static extern IntPtr GetForegroundWindow();
/// <summary>
/// gets the window title of the foreground window
/// </summary>
public static string GetWindowTitle()
{
return GetWindowText( GetForegroundWindow() );
}
public static string GetWindowText( IntPtr hWnd )
{
int length = GetWindowTextLength( hWnd );
StringBuilder text = new StringBuilder( length + 1 );
GetWindowText( hWnd, text, text.Capacity );
return text.ToString();
}
[DllImport( "user32.dll", SetLastError = true, CharSet = CharSet.Auto )]
public static extern int GetWindowTextLength( IntPtr hwnd );
[DllImport( "user32.dll" )]
private static extern int GetWindowText( IntPtr hWnd, StringBuilder lpString, int nMaxCount );
您可以使用键盘输入来发送按键:
你可以看看这个:
这是一个非常古老的线程,但如果将来有人遇到这个:
// switch Interactive flag off to avoid any questions that need user interaction in Robot
iapp.Interactive = 0;