2008-09-26 2 views
5

Мне нужно перечислить все запущенные приложения. В частности, все верхние окна. И для каждого окна мне нужно добавить свой пользовательский элемент в системное меню этого окна.Как добавить пользовательский элемент в системное меню на C++?

Как это сделать на C++?

Обновление.

Я был бы более чем счастлив иметь решение для Windows, MacOS и Ubuntu (хотя, я не уверен, что MacOS и Ubuntu имеют такую ​​вещь, как «системное меню»).

+0

Что такое целевая ОС - Windows? –

ответ

1

После того как вы верхняя ручка уровня другого окна, вы можете быть в состоянии вызвать GetMenu() получить системное меню окна, а затем изменить его, например:

HMENU hMenu = GetMenu(hwndNext); 
+0

Я думаю, вы имели в виду GetSystemMenu, а не GetMenu; см. мой ответ. – efotinis

0

Вы можете использовать EnumWindows() для перечисления верхнего уровня Windows.

У меня нет конкретного ответа на вторую часть вашего вопроса, но если вы подклассифицируете это окно, я думаю, вы можете изменить системное меню.

EDIT: или делать то, что сказал Крис: вызов GetMenu()

0

Re: обновление - обратите внимание, что даже не Microsoft Windows требует окна, чтобы иметь меню Sytem. GetMenu() может возвращать 0. Вам также нужно будет перехватывать создание окна, потому что каждое новое верхнее окно, по-видимому, тоже нуждается в нем.

Кроме того, то, что вы предлагаете, довольно навязчиво для других приложений. Как вы собираетесь гарантировать, что они не сломаются, когда вы измените их меню? И как вы собираетесь обеспечить подавление сообщений? В частности, как вы обеспечите их перехват, прежде чем кто-либо еще их увидит? Чтобы процитировать Раймонда Чена, представьте, что произойдет, если две программы попытаются это сделать.

8

для Windows, другой способ, чтобы получить окна верхнего уровня (помимо EnumWindows, который использует обратный вызов), чтобы получить первый ребенок на рабочем столе, а затем получить все его братья и сестры:

HWND wnd = GetWindow(GetDesktopWindow(), GW_CHILD); 
while (wnd) { 
    // handle 'wnd' here 
    // ... 
    wnd = GetNextWindow(wnd, GW_HWNDNEXT); 
} 

Что касается воспользовавшись меню , воспользуйтесь функцией GetSystemMenu, с FALSE в качестве второго аргумента. GetMenu, упомянутый в других ответах, возвращает нормальное окно.

Обратите внимание, однако, что при добавлении пользовательского элемента меню в окно внешнего процесса легко, ответ на выбор этого элемента немного сложнее. Вам придется либо добавить код к процессу, чтобы можно было подклассифицировать это окно, либо установить глобальный крючок (возможно, или WH_CBT) для мониторинга сообщений WM_SYSCOMMAND.

+0

Ваш ответ только что сделал мой день (на самом деле ночь)! Я никогда не читал о WH_CBT и после просмотра вашего сообщения, которое я сделал, теперь я могу успешно перехватить (через введенный код) WM_SYSCOMMAND из другого процесса. – foxx1337

Смежные вопросы