Я пытаюсь привязать форму к рабочему столу, например, к боковой панели гаджета.
На него не должны влиять кнопки Win + D и Show для рабочего стола.
Каков наилучший метод для этого?
Я могу найти Progman и установить родительский элемент моей формы, но я прочитал его не лучшим образом.
Отказ от ответственности: только потому, что вы можете сделать что-то определенным образом в 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]
Похоже, что вы после этого Application Desktop Toolbar.
Я мог ошибаться, но, возможно, Win + D, вероятно, отправляет глобальное сообщение о сворачивании во все открытые окна
Итак, попробуйте сделать вашу форму неуязвимой для сообщения о сворачивании окна. используя крючки
Вот эта статья.
Простым обходным решением может быть просто использование Win + M и не прослушивание события деактивации. Это устранит мерцание от активации/деактивации.
используйте следующий код и передайте дескриптор окна функции во время полной загрузки формы. Это разрешает вашу проблему.
public void SetFormOnDesktop(IntPtr hwnd) {
IntPtr hwndf = hwnd;
IntPtr hwndParent = FindWindow("ProgMan", null);
SetParent(hwndf, hwndParent);
}
Спасибо всем за ответы,
У меня был этот метод сначала:
[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 заключается в том, что дочерние окна также являются родительскими для столовой панели, и вы не можете использовать какую-либо прозрачность или прозрачность.