通过C#中的API访问弹出窗口按钮

时间:2014-08-12 10:38:53

标签: c# api

我在结构设计软件中构建一个插件,并且我使用C#来访问API。所有几何定义,材料,验证等都很好。我在应用程序中使用一个按钮来运行计算。完成计算后,会弹出附加的窗口。

enter image description here

作为递归过程的一部分,我试图自动按下"是"从使用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)?

非常感谢帮助。

最佳,

1 个答案:

答案 0 :(得分:0)

在高层次上,我会提供一些选择:

  1. 使用Windows API和AutomationElement类。您应该能够执行“调用”自动化模式以单击该按钮。对我来说,这将是首选方法。

  2. 使用Windows API和SendInput使用键盘(或鼠标)单击按钮。

  3. 查看AutomationElement类:http://msdn.microsoft.com/en-us/library/system.windows.automation.automationelement%28v=vs.110%29.aspx

    您可能希望找到“uispy”或其他一些用于查看AutomationElements的实用程序。另一种选择是等待窗口标题更改为您要查找的内容 - 假设对话框的窗口标题与主窗口不同。

    一些有用的apis是:

    [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 );
    

    您可以使用键盘输入发送密钥:

    你可以看看这个:

    http://inputsimulator.codeplex.com/