它不是返回当前选定的字体,而是返回0。
ShellExecute("notepad.exe")
WinWaitActive("Untitled - Notepad")
Send("!O")
Send("F")
WinWaitActive("Font")
$select = ControlCommand("Font", "", "[CLASS:ComboLBox; INSTANCE:1]", "GetCurrentSelection", "")
MsgBox(0,"", $select)
该控件实际上是一个"Combo L Box",而不是一个ComboBox。正如AutoIt帮助文件在ControlCommand
下所说:
在普通组合框和列表框上工作的某些命令不起作用在"ComboLBox"控件上。
ComboLBox实际上是ComboBox的子控件,只是它的下拉部分。如果你使用更高级的窗口查找器,比如spy++,你会看到那里有一个组合框,有两个子框(一个Edit和一个ComboLBox)。因此,如果您将"[CLASS:ComboLBox; INSTANCE:1]"
更改为"[CLASS:ComboBox; INSTANCE:1]"
,您的代码将正常工作。
此外,您可以改进触发菜单项的代码,以便整个操作可以在后台完成。
#include <WindowsConstants.au3>
#include <WinAPI.au3>
Local $IDM_FONT = 33
Local $hWindow = WinGetHandle("Untitled - Notepad")
_WinAPI_PostMessage($hWindow, $WM_COMMAND, $IDM_FONT, 0)
Local $hFontWin = WinWait("Font")
$select = ControlCommand($hFontWin, "", "ComboBox1", "GetCurrentSelection", "")
WinClose($hFontWin)
MsgBox(0,"", $select)
或者,你可以用与列表框相同的方式与ComboLBox交互:
$hLBox = ControlGetHandle($hFontWin, "", "ComboLBox1")
$itemIndex = _GUICtrlListBox_GetCurSel()
$select = _GUICtrlListBox_GetText($hLBox, $itemIndex)
为什么ControlCommand
不与这种特定类型的列表框工作,我不知道。我只能猜测,他们内部检查控件类对"ComboBox"one_answers"ListBox",如果没有匹配,返回零。
您可以使用ControlGetText()来读取当前活动字体的名称,如果这是您想要完成的。
ShellExecute("notepad.exe")
WinWaitActive("Untitled - Notepad")
Send("!O")
Send("F")
WinWaitActive("Font")
$select = ControlGetText("Font", "", "Edit1")
MsgBox(0,"", $select)