代码之家  ›  专栏  ›  技术社区  ›  Tony Peterson

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

  •  0
  • Tony Peterson  · 技术社区  · 16 年前

    我有一些使用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 回复  |  直到 16 年前
        1
  •  1
  •   Andy    16 年前

    得到一个 HWND 我会打电话给你 FindWindow() . 您可以将对话框的类名和标题传递给它,它应该返回 HWND 给你。您可以使用SPY++等工具(由Visual Studio安装,至少是专业版)或 WinCheat 为你的对话找到这个。

    如果你想得到一个 HWND 对于“确定”按钮,请尝试拨打 GetDlgItem() (通过它 HWND 你的对话和它的ID(Spy++能帮你得到这个,我不确定Wincheat能不能)。如果不行,你可以试着打电话 EnumChildWindows() 看看你能不能找到它。

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

        2
  •  0
  •   user140489    16 年前

    iirc我在statxrip中使用EnumChildWindows(),您可以在 http://www.stax76.bplaced.net 或者,当您找到C代码时,可以使用Reflector、SharpDevelopment或SharpDevelopment在线转换器服务将其转换为vb.net。