+ -
当前位置:首页 → 问答吧 → 如何获取模态对话框,并执行它的确定按钮

如何获取模态对话框,并执行它的确定按钮

时间:2010-12-02

来源:互联网

现在想写一个程序(Win32 汇编或者其他语言),当弹出这个窗口后,运行这个程序,
获得这个窗口的句柄,然后给这个窗口发一条确认的消息就行(就是点击上面的确认按钮).
Assembly code

include    gdi32.inc
includelib  gdi32.lib
include   user32.inc
includelib  user32.lib
include    kernel32.inc
includelib  kernel32.lib

.data
fwin  dd  ?

.code

start:
  invoke GetForegroundWindow
  mov  fwin,eax
  invoke  SendMessage,fwin,WM_ENABLE,NULL,NULL
  
  end start




这个我写的,貌似不成功

作者: finkle_zhang   发布时间: 2010-12-02

这样直接地 GetForegroundWindow() 很可能不到要操作的那个窗口吧。你怎么运行自己的这个程序呢,即便是你自己这个程序没有窗口,这时前台窗口也应该是你启动你这个程序的那个窗口,比如“我的电脑”或“命令行窗口”。所以,可靠的方法,还是枚举确定目标窗口。
再就是“确定”按钮,如果是标准的“确定”按钮,其 ID 为 2,可以直接向窗口发它的 WM_COMMAND 消息以触发“确定”按钮。

作者: zara   发布时间: 2010-12-02

这个程序是在VBA中调用的,所以现在就是这个问题,如何获取那个弹出窗口.
用什么方法可以枚举那个窗口,我现在知道的就是那个窗口是模态的.
还有发送确认消息的语句是不是这样的: invoke SendMessage,fwin,WM_COMMAND,MB_OK,NULL

引用 1 楼 zara 的回复:

这样直接地 GetForegroundWindow() 很可能不到要操作的那个窗口吧。你怎么运行自己的这个程序呢,即便是你自己这个程序没有窗口,这时前台窗口也应该是你启动你这个程序的那个窗口,比如“我的电脑”或“命令行窗口”。所以,可靠的方法,还是枚举确定目标窗口。
再就是“确定”按钮,如果是标准的“确定”按钮,其 ID 为 2,可以直接向窗口发它的 WM_COMMAND 消息以触发“确定”按……

作者: finkle_zhang   发布时间: 2010-12-02

遍历枚举窗口,可以通过 EnumWindows() 和 EnumChildWindows() 进行,判断的依据要看具体情形了,有类名、窗口标题、子件的状况等等。虽然 FindWindow() 也可以简单地找到某些窗口,但不如前面两函数的可靠和灵活,但胜在简单,或许也可以试试。
如果是标准的“确定”按钮,通常 invoke SendMessage,fwin,WM_COMMAND,MB_OK,NULL 就该可以的。可以先用 c++ 里的那个 Spy++ 查看下这个“确定”吧。

作者: zara   发布时间: 2010-12-02

是不是我得先获取整个IE浏览器的窗口,在枚举它的子窗口才行,那个弹出窗口的标题是:Microsoft Internet Explorer.  
Assembly code

include        windows.inc
include        gdi32.inc
includelib    gdi32.lib
include     user32.inc
includelib    user32.lib
include        kernel32.inc
includelib    kernel32.lib

.data
fwin        dd    ?
cwin        dd    ?
szCaption    db    'Microsoft Internet Explorer',0
szClassName    db    'IEFrame',0

.code

start:
    invoke    FindWindow,offset szClassName,NULL
    mov    fwin,eax
    invoke  GetWindow,fwin,GW_CHILD
    mov    cwin,eax
    invoke  PostMessage,cwin,WM_COMMAND,MB_OK,NULL
    
    invoke    ExitProcess,NULL
    end start



引用 3 楼 zara 的回复:

遍历枚举窗口,可以通过 EnumWindows() 和 EnumChildWindows() 进行,判断的依据要看具体情形了,有类名、窗口标题、子件的状况等等。虽然 FindWindow() 也可以简单地找到某些窗口,但不如前面两函数的可靠和灵活,但胜在简单,或许也可以试试。
如果是标准的“确定”按钮,通常 invoke SendMessage,fwin,WM_COMMAND,MB_OK,NU……

作者: finkle_zhang   发布时间: 2010-12-02

可以先用 vc++ 里的那个 Spy 程序看看你要处理的窗口的结构吧。FindWindow() 只能搜寻 top-level 的窗口。

作者: zara   发布时间: 2010-12-02

我已经成功获取IE浏览器的窗口了,用GetWindow,fwin,GW_CHILD 获取不了子窗口,Enumwindows不会用

作者: finkle_zhang   发布时间: 2010-12-02

这时向下,应该用 EnumChildWindows(hWndIE, ...) 吧。第一个参数是 IE 浏览器的窗口句柄,即遍历谁的子窗口;第二个是回调函数,即对每个子窗口,包括子窗口的子窗口,都调用该函数下;第三个参数是回调函数的参数,需要的话,才用到。可以看看 msdn 里的 c 的例子。

作者: zara   发布时间: 2010-12-02

多谢了,回调函数是否可以根据子窗口的标题返回其句柄....
引用 7 楼 zara 的回复:

这时向下,应该用 EnumChildWindows(hWndIE, ...) 吧。第一个参数是 IE 浏览器的窗口句柄,即遍历谁的子窗口;第二个是回调函数,即对每个子窗口,包括子窗口的子窗口,都调用该函数下;第三个参数是回调函数的参数,需要的话,才用到。可以看看 msdn 里的 c 的例子。

作者: finkle_zhang   发布时间: 2010-12-02

传递给回调函数的就是子窗口的句柄,是否符合你的要求,就得回调函数自己检查该窗口的标题了。回调函数可以通过返回 FALSE 随时终止遍历,比如在已经遇到了需要的窗口时。

作者: zara   发布时间: 2010-12-02

获取父窗口后, 用什么API可以获取该窗口的某个按钮...

引用 9 楼 zara 的回复:

传递给回调函数的就是子窗口的句柄,是否符合你的要求,就得回调函数自己检查该窗口的标题了。回调函数可以通过返回 FALSE 随时终止遍历,比如在已经遇到了需要的窗口时。

作者: finkle_zhang   发布时间: 2010-12-02

EnumChildWindows() 通过回调函数逐个核查

作者: zara   发布时间: 2010-12-02

收藏...........

作者: bobo98405208   发布时间: 2010-12-02

Assembly code

EnumChildWindow    proc    uses ebx edi esi hWnd,wMsg,wParam,lParam
        LOCAL    @caption
        LOCAL    @hDc
        LOCAL    @szBuffer[128]:byte

        mov    eax,lParam
        mov    @caption,eax
        mov    eax,hWnd
        mov    @hDc,eax
        
        invoke    GetWindowText,addr @hDc,addr @szBuffer,128
        .if    ?
            ret
        .else
            xor eax,eax
        .endif
        
    ret

EnumChildWindow endp
-----------------------------------------------
invoke    EnumChildWindows,fwin,offset EnumChildWindow,offset szCaption


是不是像这样的,获取子窗口标题后,如何和预定义的标题相比较呢

作者: finkle_zhang   发布时间: 2010-12-02

热门下载

更多