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,您可以使用:
EnumWindows()
, filtering in the callback function using GetClassName()
and GetWindowText()
.
FindWindowEx()
循环,初始设置hwndParent=0
和hwndChildAfter=0
,然后设置hwndChildAfter
为最后找到的window在随后的每次调用中。
要测试给定的 window 是否属于记事本,您可以:
- 使用
GetWindowThreadProcessId()
获取 window 的所属进程 ID。
- 然后使用
OpenProcess()
打开进程句柄。
- 然后使用
GetModuleFileNameEx()
, GetProcessImageFileName()
, or QueryFullProcessImageName()
检索创建进程的 EXE 的路径和文件名。
- 检查文件名是否为
notepad.exe
且路径是否为 Windows 系统文件夹。
我正在使用以下代码 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,您可以使用:
EnumWindows()
, filtering in the callback function usingGetClassName()
andGetWindowText()
.FindWindowEx()
循环,初始设置hwndParent=0
和hwndChildAfter=0
,然后设置hwndChildAfter
为最后找到的window在随后的每次调用中。
要测试给定的 window 是否属于记事本,您可以:
- 使用
GetWindowThreadProcessId()
获取 window 的所属进程 ID。 - 然后使用
OpenProcess()
打开进程句柄。 - 然后使用
GetModuleFileNameEx()
,GetProcessImageFileName()
, orQueryFullProcessImageName()
检索创建进程的 EXE 的路径和文件名。 - 检查文件名是否为
notepad.exe
且路径是否为 Windows 系统文件夹。