FindWindowEx Windows API在AutoIt中不返回任何内容

时间:2017-07-03 17:02:49

标签: autoit findwindow findwindowex

我使用以下代码返回记事本中显示的打开文件对话框的句柄。

Global $Result = DllCall("User32.dll", "HWND", "FindWindowExA", "HWND", WinGetHandle("[CLASS:Notepad]"), "HWND", Null, "STR", "#32770", "STR", "Open")
ConsoleWrite("FindWindowEx Return Value: " & String($Result[0]) & @CRLF)

这总是返回0x00000000,但给定的参数似乎是正确的。

为什么这个函数在这里什么也没有返回?

更新

以下语法有效,但我仍然无法指定父窗口:

Global $Result = DllCall('User32.dll', 'HWND', 'FindWindowExW', 'HWND', Null, 'HWND', Null, 'WSTR', '#32770', 'WSTR', 'Open')

这会找到每个对话框(画图,写字板等),但我只想获取父对象作为记事本的对话框句柄。

2 个答案:

答案 0 :(得分:2)

没有单一的API可以将搜索限制在记事本中。您必须枚举所有可用的#32770窗口,查找属于记事本进程的窗口,直到找到您要查找的窗口为止。

要枚举窗口,您可以使用:

要测试给定窗口是否属于记事本,您可以:

  1. 使用GetWindowThreadProcessId()获取窗口拥有的进程ID。
  2. 然后使用OpenProcess()打开流程句柄。
  3. 然后使用GetModuleFileNameEx()GetProcessImageFileName()QueryFullProcessImageName()来检索创建该流程的EXE的路径和文件名。
  4. 检查文件名是否为notepad.exe,路径是否为Windows系统文件夹。

答案 1 :(得分:1)

  

这里有什么问题?

首先打开notepad.exe,输入一些不保存的文本,尝试关闭记事本,但保留生成的对话框(CLASS:#32770,请求保存)。例如,根据documentation(未经测试,没有错误检查):

Global Const $g_sWnd = '[TITLE:Notepad; CLASS:#32770; INSTANCE:1]'
Global Const $g_hWnd = WinGetHandle($g_sWnd)

ConsoleWrite($g_hWnd & @CRLF)

根据需要更改TITLE:Notepad(到记事本的文件打开对话框标题)。