我使用以下代码返回记事本中显示的打开文件对话框的句柄。
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')
这会找到每个对话框(画图,写字板等),但我只想获取父对象作为记事本的对话框句柄。
答案 0 :(得分:2)
没有单一的API可以将搜索限制在记事本中。您必须枚举所有可用的#32770
窗口,查找属于记事本进程的窗口,直到找到您要查找的窗口为止。
要枚举窗口,您可以使用:
EnumWindows()
,使用GetClassName()
和GetWindowText()
在回调函数中进行过滤。
FindWindowEx()
,最初设置hwndParent=0
和hwndChildAfter=0
,然后在每次后续调用中将hwndChildAfter
设置为最后找到的窗口。
要测试给定窗口是否属于记事本,您可以:
GetWindowThreadProcessId()
获取窗口拥有的进程ID。OpenProcess()
打开流程句柄。GetModuleFileNameEx()
,GetProcessImageFileName()
或QueryFullProcessImageName()
来检索创建该流程的EXE的路径和文件名。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
(到记事本的文件打开对话框标题)。