1

Тема: AHK: WinMenuSelectItem Проверка состояния переключателя пункта меню

Можно ли проверить состояние переключателя пункта меню? Например, если необходимо по нажатию на горячую клавишу именно включить опцию Line Numbers, а не переключить на обратное состояние.

http://puu.sh/nh0ZP/00f0a6ef48.png

2

Re: AHK: WinMenuSelectItem Проверка состояния переключателя пункта меню

#persistent
SetTitleMatchMode, 2
DetectHiddenWindows, On

Loop
{
  notepad_hwnd := WinExist("Untitled - Notepad ahk_class Notepad")
  if(notepad_hwnd = "0x0")
  {
    tooltip, notepad not open
    continue
  }
  main_Menu := DllCall("GetMenu", UInt, notepad_hwnd)
  view_menu := DllCall("GetSubMenu", UInt, main_Menu, Int, 3)
  SendMessage, 0x116, view_menu, 0,, ahk_id %notepad_hwnd% ; WM_INITMENU
    if DllCall("GetMenuState", UInt, view_menu, UInt, 0, UInt, 0x400) >> 3 & 1
      tooltip, View -> Status Bar is checked
    else
      tooltip, View -> Status Bar is unchecked
}

3

Re: AHK: WinMenuSelectItem Проверка состояния переключателя пункта меню

Malcev, Спасибо! Не думал, что это будет выглядеть столь сложно. Тогда как таким образом назначить клавиши на включение и выключение (не переключение) WinMenuSelectItem, Premiere Pro, , Sequence, Selection Follows Playhead ?

4

Re: AHK: WinMenuSelectItem Проверка состояния переключателя пункта меню

Универсальный вариант:

MsgBox, % GetMenuItemCheckState(WinExist("ahk_class SciTEWindow"), "View|Line Numbers")

GetMenuItemCheckState(hWin, path)
{
	static MIIM_STRING := 0x40, MIIM_STATE := 0x1
	Loop, parse, path, |
	{
		hMenu := A_Index = 1 ? DllCall("GetMenu", Ptr, hWin, Ptr) : DllCall("GetSubMenu", Ptr, hMenu, Int, SubMenuPos)
		SubMenuPos := ""
		Loop % DllCall("GetMenuItemCount", Ptr, hMenu)
			if StrReplace(GetMenuItemInfo(hMenu, A_Index - 1, MIIM_STRING), "&") = A_LoopField && SubMenuPos := A_Index - 1
				break
		if (SubMenuPos = "")  {
			MsgBox, % "Не найден пункт меню """ A_LoopField """ по пути """ path """"
			Return
		}
	}
	Return GetMenuItemInfo(hMenu, SubMenuPos, MIIM_STATE) & 0x8 ? 1 : 0
}
	
GetMenuItemInfo(hMenu, ItemNumber, TypeOfInfo)
{
	static MIIM_STRING := 0x40, MIIM_STATE := 0x1
	VarSetCapacity(MENUITEMINFO, size := 4*4 + A_PtrSize*8, 0)
	NumPut(size, MENUITEMINFO)
	NumPut(TypeOfInfo, MENUITEMINFO, 4)
	DllCall("GetMenuItemInfo", Ptr, hMenu, UInt, ItemNumber, UInt, 1, Ptr, &MENUITEMINFO)
	
	if (TypeOfInfo & MIIM_STRING)  {
		nChars := NumGet(MENUITEMINFO, 4*4 + A_PtrSize*6, "UInt") + 1
		if (nChars > 1)  {
			VarSetCapacity(buff, nChars * (A_IsUnicode ? 2 : 1), 0)
			NumPut(&buff, MENUITEMINFO, 4*4 + A_PtrSize*5)
			NumPut(nChars, MENUITEMINFO, 4*4 + A_PtrSize*6)
			DllCall("GetMenuItemInfo", Ptr, hMenu, UInt, A_Index - 1, UInt, 1, Ptr, &MENUITEMINFO)
			info := StrGet(&buff)
		}
	}
	if (TypeOfInfo & MIIM_STATE)
		info := NumGet(MENUITEMINFO, 4*3, "Int")
	Return info
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5

Re: AHK: WinMenuSelectItem Проверка состояния переключателя пункта меню

Кстати в премьере он не работает.
А такой работает:
Почему-то надо посылать сообщение WM_INITMENUPOPUP, а не WM_INITMENU

f11::
program := "ahk_class Premiere Pro"
SubMenuNumber := 3      ; отсчет идет с 0
ItemNumber := 31

SetTitleMatchMode, 2
DetectHiddenWindows, On
Hwnd := WinExist(program)
MainMenu := DllCall("GetMenu", UInt, Hwnd)
SubMenu := DllCall("GetSubMenu", UInt, MainMenu, Int, SubMenuNumber)
;SendMessage, 0x116, SubMenu, ItemNumber,, ahk_id %Hwnd% ; WM_INITMENU
SendMessage, 0x117, SubMenu, ItemNumber,, ahk_id %Hwnd% ; WM_INITMENUPOPUP
if DllCall("GetMenuState", UInt, SubMenu, UInt, ItemNumber, UInt, 0x400) = 8
   msgbox нажата
else
   msgbox не нажата
return

6

Re: AHK: WinMenuSelectItem Проверка состояния переключателя пункта меню

Malcev, проверка работает отлично! Но как назначить клавиши на включение и выключение? Исходить из содержимого MsgBox'ов?

7

Re: AHK: WinMenuSelectItem Проверка состояния переключателя пункта меню

Malcev пишет:

Кстати в премьере он не работает.

Мой?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

8 (изменено: Malcev, 2016-02-22 16:17:35)

Re: AHK: WinMenuSelectItem Проверка состояния переключателя пункта меню

teadrinker пишет:

Мой?

Да.
Он показывает правильно только в первый раз во время запуска.
И это касается не только премьера, а и блокнота тоже.
Если мы включим параметр в премьере, то скрипт все равно будет показывать, что он выключен.
Только после того, как мы еще раз активируем меню - скрипт станет показывать правильно.
То есть надо посылать сообщение для каждой программы разное:
Для блокнота WM_INITMENU.
Для премьера WM_INITMENUPOPUP.

как назначить клавиши на включение и выключение?

Сделать проверку.
При выключенном результат будет равен 0:

if DllCall("GetMenuState", UInt, SubMenu, UInt, ItemNumber, UInt, 0x400) = 0

А при включенном 8:

if DllCall("GetMenuState", UInt, SubMenu, UInt, ItemNumber, UInt, 0x400) = 8

9

Re: AHK: WinMenuSelectItem Проверка состояния переключателя пункта меню

Malcev, попробовал так, понимал, что не самый верный вариант, но надеялся на то, что должен сработать. Однако, нет.

^f1::
^f2::
program := "ahk_class Premiere Pro"
SubMenuNumber := 3      ; отсчет идет с 0
ItemNumber := 31

SetTitleMatchMode, 2
DetectHiddenWindows, On
Hwnd := WinExist(program)
MainMenu := DllCall("GetMenu", UInt, Hwnd)
SubMenu := DllCall("GetSubMenu", UInt, MainMenu, Int, SubMenuNumber)
;SendMessage, 0x116, SubMenu, ItemNumber,, ahk_id %Hwnd% ; WM_INITMENU
SendMessage, 0x117, SubMenu, ItemNumber,, ahk_id %Hwnd% ; WM_INITMENUPOPUP

if (A_ThisHotkey = "^f1")
if DllCall("GetMenuState", UInt, SubMenu, UInt, ItemNumber, UInt, 0x400) = 8
WinMenuSelectItem, Premiere Pro, , Sequence, Selection Follows Playhead
if DllCall("GetMenuState", UInt, SubMenu, UInt, ItemNumber, UInt, 0x400) = 0
send {}

if (A_ThisHotkey = "^f2")
if DllCall("GetMenuState", UInt, SubMenu, UInt, ItemNumber, UInt, 0x400) = 0
send {}
if DllCall("GetMenuState", UInt, SubMenu, UInt, ItemNumber, UInt, 0x400) = 8
WinMenuSelectItem, Premiere Pro, , Sequence, Selection Follows Playhead
return

10

Re: AHK: WinMenuSelectItem Проверка состояния переключателя пункта меню

f1::     ;   вкл
f2::     ;   выкл
MenuState := SelectMenu("ahk_class Premiere Pro", 3, 31)
If ((A_ThisHotkey = "f1") and (MenuState = 0)) or ((A_ThisHotkey = "f2") and (MenuState = 8))
   WinMenuSelectItem, ahk_class Premiere Pro,, Sequence, Selection Follows Playhead
return

SelectMenu(program, SubMenuNumber, ItemNumber)
{
   Hwnd := WinExist(program)
   MainMenu := DllCall("GetMenu", UInt, Hwnd)
   SubMenu := DllCall("GetSubMenu", UInt, MainMenu, Int, SubMenuNumber)
   SendMessage, 0x117, SubMenu, ItemNumber,, ahk_id %Hwnd% ; WM_INITMENUPOPUP
   return DllCall("GetMenuState", UInt, SubMenu, UInt, ItemNumber, UInt, 0x400)
}

11 (изменено: becauseim, 2016-02-22 14:29:50)

Re: AHK: WinMenuSelectItem Проверка состояния переключателя пункта меню

Malcev, спасибо! Работает! Только не пойму, как получить такой же скрипт, но для другого пункта меню. Например, замены строки WinMenuSelectItem, ahk_class Premiere Pro,, Sequence, Selection Follows Playhead на
WinMenuSelectItem, ahk_class Premiere Pro,, Clip, Enable не хватило.

12

Re: AHK: WinMenuSelectItem Проверка состояния переключателя пункта меню

Если посчитаете на какой позиции находится Clip и Enable, то получите:

MenuState := SelectMenu("ahk_class Premiere Pro", 2, 25)

13

Re: AHK: WinMenuSelectItem Проверка состояния переключателя пункта меню

Malcev, Спасибо! Так стало яснее, что еще нужно изменять, но как я бы ни считал, порядковый номер у меня выходит другим. Странно. Пока не понимаю, как именно нужно считать.

14

Re: AHK: WinMenuSelectItem Проверка состояния переключателя пункта меню

Начинаем с 0.
Горизонтальные линии тоже считаются за пункты меню.

15

Re: AHK: WinMenuSelectItem Проверка состояния переключателя пункта меню

Malcev, хотел сделать переключение одной клавишей рабочих областей с Editing на MC в Premiere Pro, но не получается. Помогите, пожалуйста.

f4::
MCState := SelectMenu("ahk_class Premiere Pro", 6, 8)
If (MCState = 0)
	WinMenuSelectItem, ahk_class Premiere Pro,, Window, Workspaces, MC
If (MCState = 8)
	WinMenuSelectItem, ahk_class Premiere Pro,, Window, Workspaces, Editing
return

SelectMenu(program, SubMenuNumber, ItemNumber)
{
   Hwnd := WinExist(program)
   MainMenu := DllCall("GetMenu", UInt, Hwnd)
   SubMenu := DllCall("GetSubMenu", UInt, MainMenu, Int, SubMenuNumber)
   SendMessage, 0x117, SubMenu, ItemNumber,, ahk_id %Hwnd% ; WM_INITMENUPOPUP
   return DllCall("GetMenuState", UInt, SubMenu, UInt, ItemNumber, UInt, 0x400)
}
+ Скриншот

http://puu.sh/oQqoE/e26e75410e.jpg

16

Re: AHK: WinMenuSelectItem Проверка состояния переключателя пункта меню

f4::
MCState := SelectMenu("ahk_class Premiere Pro", 6, 0, 5)
If (MCState = 520)
   WinMenuSelectItem, ahk_class Premiere Pro,, Window, Workspaces, MC
else
   WinMenuSelectItem, ahk_class Premiere Pro,, Window, Workspaces, Editing
return

SelectMenu(program, SubMenuNumber, SubMenuNumber2, ItemNumber)
{
   Hwnd := WinExist(program)
   MainMenu := DllCall("GetMenu", UInt, Hwnd)
   SubMenu := DllCall("GetSubMenu", UInt, MainMenu, Int, SubMenuNumber)
   SubMenu2 := DllCall("GetSubMenu", UInt, SubMenu, Int, SubMenuNumber2)
   SendMessage, 0x117, SubMenu2, ItemNumber,, ahk_id %Hwnd% ; WM_INITMENUPOPUP
   return DllCall("GetMenuState", UInt, SubMenu2, UInt, ItemNumber, UInt, 0x400)
}

17

Re: AHK: WinMenuSelectItem Проверка состояния переключателя пункта меню

Malcev, Спасибо!

18

Re: AHK: WinMenuSelectItem Проверка состояния переключателя пункта меню

Malcev, а могли бы Вы добавить положение о том, что если в текущий момент выбрано иное рабочее пространство (ни одно из двух упомянутых), то выбирался пункт Workspace - Editing, а также пропускалась строка SendInput +{0}?

f4::
SendInput +{0}
MCState := SelectWorkspace("ahk_class Premiere Pro", 6, 0, 5)
If (MCState = 520)
   WinMenuSelectItem, ahk_class Premiere Pro,, Window, Workspaces, MC
else
   WinMenuSelectItem, ahk_class Premiere Pro,, Window, Workspaces, Editing
SendInput +{3}
return

SelectWorkspace(program, SubMenuNumber, SubMenuNumber2, ItemNumber)
{
   Hwnd := WinExist(program)
   MainMenu := DllCall("GetMenu", UInt, Hwnd)
   SubMenu := DllCall("GetSubMenu", UInt, MainMenu, Int, SubMenuNumber)
   SubMenu2 := DllCall("GetSubMenu", UInt, SubMenu, Int, SubMenuNumber2)
   SendMessage, 0x117, SubMenu2, ItemNumber,, ahk_id %Hwnd% ; WM_INITMENUPOPUP
   return DllCall("GetMenuState", UInt, SubMenu2, UInt, ItemNumber, UInt, 0x400)
}
return

И еще, любопытно, откуда берется число 520?

19

Re: AHK: WinMenuSelectItem Проверка состояния переключателя пункта меню

f4::
if (SelectWorkspace("ahk_class Premiere Pro", 6, 0, 5) = SelectWorkspace("ahk_class Premiere Pro", 6, 0, 7))
   WinMenuSelectItem, ahk_class Premiere Pro,, Window, Workspaces, Editing
else
   SendInput +{0}
SendInput +{3}
return

SelectWorkspace(program, SubMenuNumber, SubMenuNumber2, ItemNumber)
{
   Hwnd := WinExist(program)
   MainMenu := DllCall("GetMenu", UInt, Hwnd)
   SubMenu := DllCall("GetSubMenu", UInt, MainMenu, Int, SubMenuNumber)
   SubMenu2 := DllCall("GetSubMenu", UInt, SubMenu, Int, SubMenuNumber2)
   SendMessage, 0x117, SubMenu2, ItemNumber,, ahk_id %Hwnd% ; WM_INITMENUPOPUP
   return DllCall("GetMenuState", UInt, SubMenu2, UInt, ItemNumber, UInt, 0x400)
}
return

520 берётся при активном Editing из:

msgbox % MCState := SelectWorkspace("ahk_class Premiere Pro", 6, 0, 5)

20

Re: AHK: WinMenuSelectItem Проверка состояния переключателя пункта меню

Malcev, теперь, к сожалению, не работает переключение между Editing и MC. На всякий случай, опишу желаемое еще раз:

При нажатии на f4, если активна рабочая область Editing, отправляется нажатие клавиш Shift+0 и происходит переключение на рабочую область MC, и наоборот, если активна MC - то на Editing, и также отправляется нажатие клавиш Shift+0. А если активна иная рабочая область, например, Color, то нажатий не отпрвляется, а рабочая область переключается на Editing.

21

Re: AHK: WinMenuSelectItem Проверка состояния переключателя пункта меню

Тут же ничего сложного - обычные условия.

f4::
StateEditing := SelectWorkspace("ahk_class Premiere Pro", 6, 0, 5)
StateMC := SelectWorkspace("ahk_class Premiere Pro", 6, 0, 7)
If (StateEditing = 520)
{
   WinMenuSelectItem, ahk_class Premiere Pro,, Window, Workspaces, MC
   SendInput +{0}
}
else if (StateMC = 520)
{
   WinMenuSelectItem, ahk_class Premiere Pro,, Window, Workspaces, Editing
   SendInput +{0}
}
else
   WinMenuSelectItem, ahk_class Premiere Pro,, Window, Workspaces, Editing
SendInput +{3}
return

SelectWorkspace(program, SubMenuNumber, SubMenuNumber2, ItemNumber)
{
   Hwnd := WinExist(program)
   MainMenu := DllCall("GetMenu", UInt, Hwnd)
   SubMenu := DllCall("GetSubMenu", UInt, MainMenu, Int, SubMenuNumber)
   SubMenu2 := DllCall("GetSubMenu", UInt, SubMenu, Int, SubMenuNumber2)
   SendMessage, 0x117, SubMenu2, ItemNumber,, ahk_id %Hwnd% ; WM_INITMENUPOPUP
   return DllCall("GetMenuState", UInt, SubMenu2, UInt, ItemNumber, UInt, 0x400)
}

22

Re: AHK: WinMenuSelectItem Проверка состояния переключателя пункта меню

Malcev, при переключении с Editing на MC, как и задумывалось, отправляется Shift+0, а при переключении с MC на Editing - не отправляется. Кажется, что происходит двойное нажатие Shift+0. Попробовал где-то удалить эту строку, но не получилось исправить.

23

Re: AHK: WinMenuSelectItem Проверка состояния переключателя пункта меню

Вместо SendInput +{0}, вставь msgbox для отладки.

24

Re: AHK: WinMenuSelectItem Проверка состояния переключателя пункта меню

Malcev, поменял строки местами, заработало. Спасибо!

...
else if (StateMC = 520)
{
   SendInput +{0}
   WinMenuSelectItem, ahk_class Premiere Pro,, Window, Workspaces, Editing
}
...

25 (изменено: becauseim, 2016-05-19 14:39:26)

Re: AHK: WinMenuSelectItem Проверка состояния переключателя пункта меню

Malcev, Подскажите, пожалуйста, как можно задать работу нескольких рабочих клавиш, привязанных к заданному режиму, более лаконичным образом?

1::
2::
3::
StateEditing := SelectWorkspace("ahk_class Premiere Pro", 6, 0, 5)
StateMC := SelectWorkspace("ahk_class Premiere Pro", 6, 0, 7)
If (StateEditing = 520){
	if (A_ThisHotkey = "1")
		ToolTip % A_ThisHotkey
	if (A_ThisHotkey = "2")
		ToolTip % A_ThisHotkey
	if (A_ThisHotkey = "3")
		ToolTip % A_ThisHotkey
}
else if (StateMC = 520){
	if (A_ThisHotkey = "1")
		ToolTip %A_ThisHotkey% MC
	if (A_ThisHotkey = "2")
		ToolTip %A_ThisHotkey% MC
	if (A_ThisHotkey = "3")
		ToolTip %A_ThisHotkey% MC
}
return

SelectWorkspace(program, SubMenuNumber, SubMenuNumber2, ItemNumber)
{
   Hwnd := WinExist(program)
   MainMenu := DllCall("GetMenu", UInt, Hwnd)
   SubMenu := DllCall("GetSubMenu", UInt, MainMenu, Int, SubMenuNumber)
   SubMenu2 := DllCall("GetSubMenu", UInt, SubMenu, Int, SubMenuNumber2)
   SendMessage, 0x117, SubMenu2, ItemNumber,, ahk_id %Hwnd% ; WM_INITMENUPOPUP
   return DllCall("GetMenuState", UInt, SubMenu2, UInt, ItemNumber, UInt, 0x400)
}

26

Re: AHK: WinMenuSelectItem Проверка состояния переключателя пункта меню

Можно через массивы.
Вам уже когда-то писали что-то подобное.

27

Re: AHK: WinMenuSelectItem Проверка состояния переключателя пункта меню

Malcev, а можно ли сделать проверку выделенного пункта по его имени, а не порядковому расположению? Т.е. для тех случаев, когда порядковое положение заданного пункта часто меняется.
Также, быть может, возможно объединить две функции? Т.е. если подменю не задано (четвертый параметр в ф-ии SelectMenuSub), то проверять третий параметр.

SelectMenuSub(program, SubMenuNumber, SubMenuNumber2, ItemNumber){
   Hwnd := WinExist(program)
   MainMenu := DllCall("GetMenu", UInt, Hwnd)
   SubMenu := DllCall("GetSubMenu", UInt, MainMenu, Int, SubMenuNumber)
   SubMenu2 := DllCall("GetSubMenu", UInt, SubMenu, Int, SubMenuNumber2)
   SendMessage, 0x117, SubMenu2, ItemNumber,, ahk_id %Hwnd% ; WM_INITMENUPOPUP
   return DllCall("GetMenuState", UInt, SubMenu2, UInt, ItemNumber, UInt, 0x400)
}
SelectMenu(program, SubMenuNumber, ItemNumber){
	Hwnd := WinExist(program)
	MainMenu := DllCall("GetMenu", UInt, Hwnd)
	SubMenu := DllCall("GetSubMenu", UInt, MainMenu, Int, SubMenuNumber)
	SendMessage, 0x117, SubMenu, ItemNumber,, ahk_id %Hwnd% ; WM_INITMENUPOPUP
	return DllCall("GetMenuState", UInt, SubMenu, UInt, ItemNumber, UInt, 0x400)
}

28

Re: AHK: WinMenuSelectItem Проверка состояния переключателя пункта меню

becauseim пишет:

Malcev, а можно ли сделать проверку выделенного пункта по его имени, а не порядковому расположению?

Читайте внимательно это тему, в ней уже был код.
Только его надо слегка модифицировать - посылать сообщение WM_INITMENU, WM_INITMENUPOPUP.

becauseim пишет:

Также, быть может, возможно объединить две функции?

Возможно.

29

Re: AHK: WinMenuSelectItem Проверка состояния переключателя пункта меню

Malcev, спасибо! И как же их объединить?

30

Re: AHK: WinMenuSelectItem Проверка состояния переключателя пункта меню

В коде из четвертого поста не нашел упоминание WM_INITMENU, для замены на WM_INITMENUPOPUP.

31

Re: AHK: WinMenuSelectItem Проверка состояния переключателя пункта меню

Там надо вставить

SendMessage, 0x117, hMenu, SubMenuPos,, ahk_id %hWin% ; WM_INITMENUPOPUP

перед

Return GetMenuItemInfo(hMenu, SubMenuPos, MIIM_STATE) & 0x8 ? 1 : 0
becauseim пишет:

И как же их объединить?

Передавайте номера всех меню в одном параметре через какой-нибудь разделитель, а в функции их парсьте.

32

Re: AHK: WinMenuSelectItem Проверка состояния переключателя пункта меню

Malcev, спасибо, работает! Но у меня не работает подменю. Ввожу так:

MsgBox, % GetMenuItemCheckState(WinExist("ahk_class Premiere Pro"), "Window|Workspaces|Timeline	Alt+Shift+3")

Передавайте номера всех меню в одном параметре через какой-нибудь разделитель, а в функции их парсьте.

Думал, можно как-то задать условие, что если последний параметр не задан, то заменить в конце ф-ии SubMenu2 на SubMenu.

33

Re: AHK: WinMenuSelectItem Проверка состояния переключателя пункта меню

Да, у teadrinkerа в функции ошибка.
Надо это

Loop % DllCall("GetMenuItemCount", Ptr, hMenu)
   if StrReplace(GetMenuItemInfo(hMenu, A_Index - 1, MIIM_STRING), "&") = A_LoopField && SubMenuPos := A_Index - 1
      break

заменить на

Loop % DllCall("GetMenuItemCount", Ptr, hMenu)
{
   if StrReplace(GetMenuItemInfo(hMenu, A_Index - 1, MIIM_STRING), "&") = A_LoopField
   {
      SubMenuPos := A_Index - 1
      break
   }
}
becauseim пишет:

Думал, можно как-то задать условие, что если последний параметр не задан, то заменить в конце ф-ии SubMenu2 на SubMenu.

Можно и так. Делайте.

34 (изменено: becauseim, 2017-09-26 02:23:01)

Re: AHK: WinMenuSelectItem Проверка состояния переключателя пункта меню

Malcev, заменил, но подменю по-прежнему не работает:

MsgBox, % GetMenuItemCheckState(WinExist("ahk_class Premiere Pro"), "Window|Workspaces|Timeline	Alt+Shift+3")

Так работает:

MsgBox, % GetMenuItemCheckState(WinExist("ahk_class Premiere Pro"), "Window|Lumetri Color	Shift+9")

35

Re: AHK: WinMenuSelectItem Проверка состояния переключателя пункта меню

Проверяйте значение StrReplace(GetMenuItemInfo(hMenu, A_Index - 1, MIIM_STRING), "&")
Может не так вписали название пункта.

36

Re: AHK: WinMenuSelectItem Проверка состояния переключателя пункта меню

Malcev, не понял на счет проверки StrReplace(GetMenuItemInfo(hMenu, A_Index - 1, MIIM_STRING), "&").
У Вас так работает?

MsgBox, % GetMenuItemCheckState(WinExist("ahk_class Premiere Pro"), "Window|Workspaces|Import Workspace from Projects")

37

Re: AHK: WinMenuSelectItem Проверка состояния переключателя пункта меню

У меня работает.
Возможно вы не то исправили.
StrReplace(GetMenuItemInfo(hMenu, A_Index - 1, MIIM_STRING), "&") - это обращение к функции.
Что она возвращает можно посмотреть с помощью msgbox.

38

Re: AHK: WinMenuSelectItem Проверка состояния переключателя пункта меню

Malcev, получаю пустое окно:

MsgBox, % StrReplace(GetMenuItemInfo(hMenu, A_Index - 1, MIIM_STRING), "&")

GetMenuItemCheckState(hWin, path)
{
	static MIIM_STRING := 0x40, MIIM_STATE := 0x1
	Loop, parse, path, |
	{
		hMenu := A_Index = 1 ? DllCall("GetMenu", Ptr, hWin, Ptr) : DllCall("GetSubMenu", Ptr, hMenu, Int, SubMenuPos)
		SubMenuPos := ""
Loop % DllCall("GetMenuItemCount", Ptr, hMenu)
   if StrReplace(GetMenuItemInfo(hMenu, A_Index - 1, MIIM_STRING), "&") = A_LoopField && SubMenuPos := A_Index - 1
      break
	  if (SubMenuPos = "")  {
			MsgBox, % "Не найден пункт меню """ A_LoopField """ по пути """ path """"
			Return
		}
	}
	SendMessage, 0x117, hMenu, SubMenuPos,, ahk_id %hWin% ; WM_INITMENUPOPUP
	Return GetMenuItemInfo(hMenu, SubMenuPos, MIIM_STATE) & 0x8 ? 1 : 0
}
	
GetMenuItemInfo(hMenu, ItemNumber, TypeOfInfo)
{
	static MIIM_STRING := 0x40, MIIM_STATE := 0x1
	VarSetCapacity(MENUITEMINFO, size := 4*4 + A_PtrSize*8, 0)
	NumPut(size, MENUITEMINFO)
	NumPut(TypeOfInfo, MENUITEMINFO, 4)
	DllCall("GetMenuItemInfo", Ptr, hMenu, UInt, ItemNumber, UInt, 1, Ptr, &MENUITEMINFO)
	
	if (TypeOfInfo & MIIM_STRING)  {
		nChars := NumGet(MENUITEMINFO, 4*4 + A_PtrSize*6, "UInt") + 1
		if (nChars > 1)  {
			VarSetCapacity(buff, nChars * (A_IsUnicode ? 2 : 1), 0)
			NumPut(&buff, MENUITEMINFO, 4*4 + A_PtrSize*5)
			NumPut(nChars, MENUITEMINFO, 4*4 + A_PtrSize*6)
			DllCall("GetMenuItemInfo", Ptr, hMenu, UInt, A_Index - 1, UInt, 1, Ptr, &MENUITEMINFO)
			info := StrGet(&buff)
		}
	}
	if (TypeOfInfo & MIIM_STATE)
		info := NumGet(MENUITEMINFO, 4*3, "Int")
	Return info
}

39

Re: AHK: WinMenuSelectItem Проверка состояния переключателя пункта меню

becauseim, почитайте про функции, как они работают и что  возвращают.
Потом попробуйте понять алгоритм скрипта.
А не работает у вас, потому что вы не сделали то, что я написал в 33 посте.

40

Re: AHK: WinMenuSelectItem Проверка состояния переключателя пункта меню

Malcev, ф-ия сложная мне для понимания.
Да, я в какой-то момент вернул ф-ию в первоначальный вид, сам того не заметив. Теперь все работает. Спасибо!

41

Re: AHK: WinMenuSelectItem Проверка состояния переключателя пункта меню

А я не имел в виду именно эту функцию, а функции вообще.
Если вы поймете как они работают, то и понимать чужие скрипты будет проще.
Тем более справка имеется на русском.

42

Re: AHK: WinMenuSelectItem Проверка состояния переключателя пункта меню

Malcev, добавьте, пожалуйста, чувствительность к названию выбираемого пункта, т.к. при смене его расположения в списке также меняется и название, а именно хоткей. Или же не брать в название все, что идет после большого пробела (Tab).

43

Re: AHK: WinMenuSelectItem Проверка состояния переключателя пункта меню

Сделайте это сами.
Перебор пунктов меню и их сравнение с вашим идет в коде из 33 поста.