c # прикрепить форму к десктопу

2

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

На него не должны влиять кнопки Win + D и Show для рабочего стола.

Каков наилучший метод для этого?

Я могу найти Progman и установить родительский элемент моей формы, но я прочитал его не лучшим образом.

  • 1
    Win + D определенно сведет к минимуму все программы, которые я думаю.
  • 0
    Rogier21 пишет: «Для боковой панели Vista / W7 жизненно важно, чтобы она продолжала прилипать к рабочему столу и никогда не выходила за рамки других окон». Просто любопытно: вы также имеете в виду, что это специальное окно должно появляться позади значков файлов и папок на рабочем столе: или вы имеете в виду, что если вы активируете это специальное окно, то существующие файлы и значки папок в области, где должно появиться окно, будут выдвинуты? над" ? imho определенно требуется решение API и, возможно, низкоуровневый обработчик хуков, чтобы клавиатура могла перехватывать Win-D. Хотелось бы мне больше помочь :)
Теги:
forms
desktop
pinning

6 ответов

5
Лучший ответ

Отказ от ответственности: только потому, что вы можете сделать что-то определенным образом в WinForms без вызовов API или "hooking", не означает, что вы должны использовать эту технику. API требует, чтобы сделать форму/окно недвижимым, верхним и т.д. Действительно очень просты. Обратите внимание, что обычный "простой метод" API будет иметь ту же проблему, что и техника, продемонстрированная ниже, при появлении над иконками файлов и папок на рабочем столе.

Обратите внимание, что путем "вмешательства" с разработанным поведением комбинации клавиш Windows-D и значка "Показывать рабочий стол" в TaskBar вы занимаетесь нестандартной конфигурацией пользовательской машины: общая "мудрость", указывает на то, что это не очень хорошая идея!

"Псевдо-боковая панель" может быть эмулирована в Vista в С# WinForms... непроницаемой для скрытия Windows-D или использования значка "Показывать рабочий стол" в системном трее... без вызовов API или "hooking": но есть улов: форма/окно будет отображаться поверх элементов на рабочем столе (папки, файлы) и, в силу своей неподвижности, вы не сможете получить доступ к элементам "под ним". Если вы готовы "мириться" с этим ограничением: читайте дальше: "Еще одна" меньшая странность "отмечена в конце этого.

Пример:

  • создайте новое решение формы в Visual Studio:

    а. установите размер формы, цвет фона и т.д., чтобы попробовать

    б. добавьте элементы управления или пользовательские элементы управления.

    с. установите для свойства Form 'TopMost значение true, если вы хотите всегда появляться перед другими окнами приложений,' false, если вы хотите, чтобы другие окна приложений могли появляться перед ним.

  • установите "ControlBox", "MinimizeBox" и "MaximizeBox" свойства формы "false".

  • установите "FormBorderStyle" в один из "фиксированных стилей", отображаемых в раскрывающемся списке "Проводник". как вы, возможно, знаете, используя FormBorderStyle = FixedToolWindow со свойством Text формы "пустая строка": у вас будет окно без TitleBar и Caption. Обсуждение: да, вы можете позволить ему изменить размер, если хотите: просто напишите код в обработчике SizeChanged и оставьте форму разблокированной.

  • эти обработчики событий должны дать вам представление о том, что необходимо для того, чтобы сделать форму незамкнутой, неотъемлемой, un-minimizable и т.д.

......... приблизительный эскизный код p.o.c. следует: очевидно, вы можете реорганизовать, улучшить...

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    e.Cancel = true;
}

// set your Form 'Top here ...
private void Form1_LocationChanged(object sender, EventArgs e)
{
    this.Top = 100;
    this.Left = Screen.PrimaryScreen.Bounds.Width - this.Width;
}

private void Form1_VisibleChanged(object sender, EventArgs e)
{
    if (this.WindowState == FormWindowState.Minimized) this.WindowState = FormWindowState.Normal;
}

private void Form1_Deactivate(object sender, EventArgs e)
{
    this.Activate();
}

private void Form1_SizeChanged(object sender, EventArgs e)
{
    if (this.WindowState == FormWindowState.Minimized) this.WindowState = FormWindowState.Normal;
}

private void button1_Click(object sender, EventArgs e)
{
    MessageBox.Show("button1 is alive");
}

Что это значит: "Обработчик события Click для кнопки" 1 "делает? Просто чтобы проверить в моем тесте, что форма была пригодна для использования.

Это повторная активация формы в обработчике "Деактивировать событие" выше, что делает форму невосприимчивой к Windows-D и "Показывать рабочий стол" : но это также имеет странный побочный эффект в Vista: при переключении фокуса из окна формы (например, щелкнув по папке на рабочем столе): TaskBar будет отскакивать, не спать, (если он скрыт) и мигать и выключать некоторое время: я предполагаю, чтобы показать вам, что он жаждет быть активным.

Включение с закрытым открытым TaskBar может быть еще одной ценой использования этой "боковой панели ersatz", а не использования API.

Примечание: не забывайте: вы хотите "Непрозрачность: у вас есть" Непрозрачность:)

[1] Примечание. Вы хотите подумать о том, чтобы дать пользователю возможность скрыть форму или закрыть ее? [/1]

  • 0
    Спасибо, но большая проблема здесь в том, что он не прилипает к рабочему столу. Как боковая панель Vista / W7, очень важно, чтобы она продолжала торчать на рабочем столе и никогда не должна заходить поверх других окон.
2

Похоже, что вы после этого Application Desktop Toolbar.

1

Я мог ошибаться, но, возможно, Win + D, вероятно, отправляет глобальное сообщение о сворачивании во все открытые окна

Итак, попробуйте сделать вашу форму неуязвимой для сообщения о сворачивании окна. используя крючки

Вот эта статья.

Hooking

  • 0
    Win + M отправляет сообщение минимизации всем окнам, которые вам не понадобятся для перехвата. Обычной обработки сообщений WndProc достаточно. Win + D заставляет окна свернуты.
0

Простым обходным решением может быть просто использование Win + M и не прослушивание события деактивации. Это устранит мерцание от активации/деактивации.

0

используйте следующий код и передайте дескриптор окна функции во время полной загрузки формы. Это разрешает вашу проблему.

public void SetFormOnDesktop(IntPtr hwnd) {      
IntPtr hwndf = hwnd;
IntPtr hwndParent = FindWindow("ProgMan", null);
SetParent(hwndf, hwndParent);
}
0

Спасибо всем за ответы,

У меня был этот метод сначала:

    [DllImport("User32.dll")]
    static extern IntPtr FindWindow(String lpClassName, String lpWindowName);
    [DllImport("user32.dll", SetLastError = true)]
    static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
    [DllImport("user32.dll")]
    static extern int SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

        IntPtr pWnd = FindWindow("Progman", null);
        pWnd = FindWindowEx(pWnd, IntPtr.Zero, "SHELLDLL_DefVIew", null);
        pWnd = FindWindowEx(pWnd, IntPtr.Zero, "SysListView32", null);
        IntPtr tWnd = this.Handle;
        SetParent(tWnd, pWnd);

Но проблема с marjor заключается в том, что дочерние окна также являются родительскими для столовой панели, и вы не можете использовать какую-либо прозрачность или прозрачность.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню