Выберите пункт из всплывающего меню Win32 API Python

Я использую Python 2.7 (32-разрядная версия) на 64-разрядной машине Windows 7. Я использую Win32 Api для автоматизации некоторых задач Windows, также я новичок в Python и Win32 API. Я видел похожие вопросы, но не в python, и у меня были проблемы с пониманием кода, и, к сожалению, я новичок здесь, поэтому я не могу комментировать и задавать вопросы, потому что мой представитель моложе 50 лет, поэтому мне пришлось создать свой собственный вопрос.

В последнее время я работаю с системным треем (область уведомлений). Я дошел до щелчка (влево или вправо) по любому значку в трее по имени.

Теперь мне нужна помощь в доступе к пунктам контекстного меню после щелчка правой кнопкой мыши.

Поэтому, когда я нажимаю правой кнопкой, появляется всплывающее меню. Я пытаюсь получить дескриптор этого, чтобы я мог щелкнуть по его элементам или контенту, и я получаю сообщение об ошибке, говорящее, что это недопустимый дескриптор меню. Если я пытаюсь запустить win32gui.GetSubMenu, то происходит сбой, происходит сбой win32gui.GetMenu, что-то такое же простое, как win32gui.GetMenuItemCount возвращает -1, мне нужна помощь о том, как получить доступ к такому меню, перейти к нему и щелкнуть элемент.

Фрагмент кода, который я пробовал:

# retrieves a handle to the notification area toolbar
tb = getNotificationAreaToolbar()

# clicks on an icon in the system tray say I'm right clicking the sound icon 
#(in my case AMD HDMI Output)
clickSystemTrayIcon('right', 'AMD HDMI Output', tb)

#now the context popup menu comes up.
# According to MSDN the class name for such menu is #32768
hPopupmenu = win32gui.FindWindow("#32768", "")

# An example of a try to access the menu items
# Getting the count: this is returning -1 saying the handle is not a menu handle
count = win32gui.GetMenuItemCount(hPopupMenu)

#send a command, doesn't do anything
win32gui.PostMessage(tb, win32con.WM_COMMAND, win32gui.GetMenuItemId(hPopupmenu,1) , 0)

# the thing that makes me sure that I'm getting the right window of the popup is 
# win32gui.GetWindowRect(hPopmenu) it's returning the right position of the menu

Спасибо за любую помощь, спасибо!

1 ответ

Решение

Во-первых, вы не можете предположить, что FindWindow вызов получит всплывающее меню. Если ваш код выполняется слишком быстро, возможно, окно еще не создано. Вы должны играть со Сном в бесконечном цикле.

Во-вторых, FindWindow возвращает HWND, а не HMENU. Попробуйте использовать сообщение MN_GETHMENU Windows (отправка его в HWND, получение HMENU в качестве результата).

Другие вопросы по тегам