2009-09-02 4 views
4

Мне нужно активировать меню запуска Windows на месте мыши.Как показать меню пуска WIndows

Я знаю, что могу отправить CTRL + ESC или Win ключи в конкретное окно, а затем переместить окно, но оно по-прежнему показывает меню в исходном местоположении в течение короткого периода времени (если я не установлю крючок, и это слишком много, для задачи).

Я помню, что есть какой-то способ сделать это, используя некоторые DLL-вызовы или отправку некоторого сообщения в оболочку или что-то в этом роде.

Ty

+1

Я заметил, что через два с половиной года никто не заметил, что вы не спрашиваете, как показать меню «Пуск» (хотя никто не дал [официальный, задокументированный, ответ] (http: //stackoverflow.com/questions/2755202/), но спрашивают, как открыть меню «Пуск» _at, если указатель мыши is_, а не по умолчанию. – JdeBP

ответ

1

вы получите делать то же самое поведение, если вы «нажать» кнопку более программно?

// Find the Start button 
    HANDLE hScreenDC = GetDC(0); 
    DWORD height = GetDeviceCaps(hScreenDC, VERTRES); 
    ReleaseDC(0, hScreenDC); 
    hTaskBarWnd = FindWindow("Shell_TrayWnd", 0); 
    hStartButtonWnd = GetWindow(hTaskBarWnd, GW_CHILD); 

    // Now simulate a press on the Start button 
    SendMessage(hButtonWnd, WM_LBUTTONDOWN, 
     MK_LBUTTON, LOWORD(5) + HIWORD(height - 20)); 

В противном случае вы можете исследовать окно «Shell_TrayWnd» с помощью WinSpy++ или с помощью подобной утилиты, возможно, меню Пуск является дочерним окном окна лотка.

+0

Ваш код работает только тогда, когда я передаю 0 (или небольшое значение, вероятно, должно быть в клиентской области кнопки) как Lparam WM_LBUTTODOWN. Кажется, это не дочернее окно, но воссозданное каждый раз ... – majkinetor

+0

Это, безусловно, можно сделать, есть приложения вокруг этого (например, DesktopX от Stardock) – majkinetor

+0

Хорошо, тогда вы можете использовать Dependency Walker для изучения импорта, используемого утилита DesktopX, она может показать функцию API, которую вы ищете. – Gabriella

1
[DllImport("user32.dll", SetLastError = true)] 
public static extern IntPtr FindWindow (string lpClassName, string lpWindowName); 

[DllImport("user32.dll")] 
public static extern bool ShowWindow (IntPtr hWnd, ShowWindowCommand nCmdShow); 

int ShowCmd = 5; 
int HideCmd = 0; 
ShowWindow(FindWindow("DV2ControlHost", "Start menu"), ShowCmd); 

Должен сделать трюк в Windows 7 по крайней мере. Для скрытия снова используйте «HideCmd» вместо «ShowCmd».

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