FindWindowEx Windows API returns AutoIt 什么都没有

FindWindowEx Windows API returns nothing in AutoIt

我正在使用以下代码 return 处理记事本中显示的打开文件对话框。

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)

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

为什么这个函数 return 这里什么都没有?

更新

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

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

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

What's wrong here?

首先打开 notepad.exe,键入一些文本但不保存,尝试关闭记事本但打开结果对话框(CLASS:#32770,要求保存)。例如,根据 documentation(未经测试,没有 error-checking):

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

ConsoleWrite($g_hWnd & @CRLF)

根据需要更改 TITLE:Notepad(记事本的 file-open dialog-box 标题)。

没有单一的 API 将搜索限制在记事本中。您将必须枚举所有可用的 #32770 windows,寻找属于记事本进程的那些,直到找到您正在寻找的那个。

要枚举 windows,您可以使用:

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

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