1

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

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')

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

4

2 回答 2

2

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

要枚举窗口,您可以使用以下任一方法:

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

  1. 用于GetWindowThreadProcessId()获取窗口的所属进程 ID。
  2. 然后用于OpenProcess()打开进程的句柄。
  3. 然后使用GetModuleFileNameEx()GetProcessImageFileName()QueryFullProcessImageName()检索创建进程的 EXE 的路径和文件名。
  4. 检查文件名notepad.exe和路径是否为 Windows 系统文件夹。
于 2017-07-04T02:47:44.240 回答
1

这里有什么问题?

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

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

ConsoleWrite($g_hWnd & @CRLF)

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

于 2017-07-03T19:07:52.117 回答