访问对话框的句柄并自动操作用户界面

时间:2009-07-17 11:53:09

标签: vb.net winapi pinvoke

我有一些使用COM api的VB代码,导致屏幕上弹出一个对话框。我的程序是一个控制台应用程序,需要在批处理文件中运行,但除了找到自动操作对话框的方法之外,我还没有找到任何其他方法。

这是api调用(省略设置代码),导致弹出对话框:

  Dim oScript = New ProvideX.Script()

  ' Setup code here '

  oScript.Run(commName)

此方法没有返回值,也没有额外的参数可以让我通过API填写我需要的值。

我找到了一个方法来获取对话框窗口的句柄,但我不确定它是否可行,或者它是否会抓取到命令行窗口。

Dim windowHandle = Process.GetCurrentProcess().MainWindowHandle

有没有办法获取由我的流程创建的窗口列表,以便我可以识别与我的对话框对应的窗口?

此外,任何人都可以指出我如何将鼠标点击和键盘按下发送到非托管对话框的正确方向,或者是否有更好的方法来做我需要的。

这是一个相当简单的对话框,其中有一个警告提示,需要通过单击确定按钮来接受。然后有两个文本框需要用我拥有的数据填写。然后我需要点击另一个按钮。

我不是要求一个完整的答案,我只是在寻找如何做到这一点的一般要点。

编辑:我在PINVOKE.net上做研究,我认为如果我能得到正确的处理,SendInput将会起作用。我已经浏览了对话框,它可以通过键盘输入来处理。

2 个答案:

答案 0 :(得分:1)

要获得对话框的HWND,我会拨打FindWindow()。您可以将对话框的类名称和标题传递给它,它应该将HWND返回给您。您可以使用Spy ++(由Visual Studio安装,至少是专业版)或WinCheat之类的工具来为您的对话框找到它。

从那里,如果你想获得一个HWND的确定按钮,请尝试调用GetDlgItem()(传递对话框的HWND及其ID(Spy ++可以得到这个)对你而言,我不确定WinCheat是否可以。)如果这不起作用,你总是可以尝试拨打EnumChildWindows(),看看你是否能找到它。

我不是VB专家,从VB调用其中一些函数可能很难和/或不起作用(尤其是EnumChildWindows(),因为它需要一个回调函数)。但希望这会给你一个开始寻找的地方。

答案 1 :(得分:0)

IIRC我在StaxRip中使用EnumChildWindows(),您可以在http://www.stax76.bplaced.net找到VB.NET代码,或者当您找到C#代码时,可以使用Reflector,SharpDevelop或SharpDevelop在线将其转换为VB.NET转换器服务。