Открыть меню "Пуск" рядом с программой?

Я изучаю, как открыть меню «Пуск» программно, но проблема в том, что я хочу, чтобы оно открывалось прямо рядом с приложением, которое я создаю.

Я делаю панель инструментов в верхней части экрана с кнопкой для открытия меню «Пуск», но мне бы хотелось, чтобы меню «Пуск» открывалось прямо под кнопкой, а не рядом с панелью задач. Я использую код, приведенный в ответе на этот вопрос, который отправляет только необходимо нажать клавишу (LWin), чтобы открыть меню «Пуск».

Возможно ли это в C #? Если да, то как я могу это сделать?


person Abluescarab    schedule 05.03.2013    source источник
comment
Все возможно, друг мой, но что ты пробовал?   -  person Sergio    schedule 05.03.2013
comment
Тот факт, что в Windows 8 больше нет меню «Пуск», делает это бессмысленным.   -  person Daniel Hilgarth    schedule 05.03.2013
comment
кстати, давным-давно для win98 был вирус, заставлявший кнопку Пуск убегать от курсора мыши :)   -  person Sergio    schedule 05.03.2013
comment
@Sergio Честно говоря, я только пробовал поискать в Google и толком не знал, что искать.   -  person Abluescarab    schedule 05.03.2013
comment
@DanielHilgarth Эта программа поддерживает старые версии Windows.   -  person Abluescarab    schedule 05.03.2013
comment
ну, вам понадобится его оконный дескриптор, чтобы что-нибудь начать с него   -  person Dreamwalker    schedule 05.03.2013
comment
Насколько я помню, сама кнопка запуска представляет собой окно, поэтому вы можете попытаться получить его дескриптор и изменить координаты   -  person Sergio    schedule 05.03.2013
comment
Дополнительная помощь - использование msdn.microsoft.com/en-gb/library/windows/desktop/ и Spy ++, чтобы получить необходимую информацию.   -  person Dreamwalker    schedule 05.03.2013
comment
+1. Иногда мне нравятся такие вопросы. Интересный.   -  person    schedule 05.03.2013


Ответы (1)


РЕДАКТИРОВАТЬ: Очевидно, это работает только в английских версиях Windows из-за того, что «меню Пуск» отличается в каждом переводе. Тем не менее, это все равно будет работать (если Windows установлена ​​на английском языке).

Я понял! Это работает, хотя я не знаю, насколько это красиво:

public partial class Form1 : Form {
    private void button1_Click(object sender, EventArgs e) {
        int ShowCmd = 5;

        MoveWindow(FindWindow("DV2ControlHost", "Start menu"), X_POS, Y_POS, WIDTH_HERE, HEIGHT_HERE, false);
        ShowWindow(FindWindow("DV2ControlHost", "Start menu"), ShowCmd);
    }

    [DllImport("user32.dll", SetLastError = true)]
    public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
    [DllImport("user32.dll", SetLastError = true)]
    public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
    [DllImport("user32.dll", SetLastError = true)]
    public static extern bool MoveWindow(IntPtr hWnd, int x, int y, int nWidth, int nHeight, bool bRepaint);
}

Это сочетание этого вопроса здесь, на SO, и эта статья MSDN, измененная для C #. Опять же, я не уверен, насколько хорош код, но он выполняет свою работу.

person Abluescarab    schedule 05.03.2013
comment
Плохо: меню «Пуск» не будет совпадать с другим переводом Windows - person Onkelborg; 05.03.2013
comment
@Onkelborg Я предполагаю, что мне нужно напрямую ссылаться на дескриптор? Будет ли это оставаться неизменным между переводами? - person Abluescarab; 05.03.2013
comment
Я не могу ничего гарантировать, но могу гарантировать, что приведенный выше код не сработает. Практическое правило: строки, которые отображаются пользователю, подлежат переводу, но строки, которые не отображаются, не будут затронуты, например. имя класса. DV2ControlHost, вероятно, не будет изменен из-за перевода, но меню «Пуск» изменится. Вам нужно будет найти другие уникальные идентификаторы помимо видимых строк. - person Onkelborg; 05.03.2013
comment
@Onkelborg Это оказывается даже больше проблем, чем того стоит ... хотя я полон решимости найти способ сделать это. - person Abluescarab; 05.03.2013
comment
Ну, я не знаю, кто ваши пользователи, но если вы используете что-то еще, кроме английской Windows, вам нужно найти другой способ или просто пропустить эту функцию. - person Onkelborg; 05.03.2013
comment
@Onkelborg Обычно я не перевожу свои программы, но аудитория - это в основном любой, кто хочет программу, а это означает, что я хотел бы поддержать кого угодно. Я мог бы просто создать папку, которая отображается в раскрывающемся списке. - person Abluescarab; 05.03.2013
comment
Неважно, если вы переводите свою программу, важен перевод Windows. Это вне вашего контроля, но ваши пользователи будут считать ошибкой, если ваша программа не работает только потому, что они не используют английскую Windows. - person Onkelborg; 06.03.2013