WndProc без видимой формы? - PullRequest
3 голосов
/ 19 мая 2009

Я хочу создать форму во втором потоке, который будет получать сообщения в своем методе WndProc. Каков рекомендуемый способ создания такой невидимой формы? Достаточно ли установить «ShowInTaskbar = false» и «Visible = false» или есть более «чистый» способ?

Ответы [ 5 ]

2 голосов
/ 21 мая 2009

Я не уверен, что вы подразумеваете под "чище". Стандартный способ создания невидимой для пользователя формы - установить для Visible и ShowInTaskbar значение false.

0 голосов
/ 14 июня 2013

Вы не сможете получать сообщения Windows, если для вашего ShowInTaskbar установлено значение false. Единственный способ сделать это - скрыть форму (она все еще скрывает значок на панели задач).

0 голосов
/ 10 ноября 2011

Код в этом проекте имеет аккуратный способ решения этой проблемы: http://www.codeproject.com/KB/dotnet/XDMessaging.aspx

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

Класс XDListener расширяет NativeWindow, поэтому он может получать сообщения. В конструкторе некоторые атрибуты устанавливаются в окне, что делает его невидимым. Метод WndProc переопределен в этом классе для обработки поступающих сообщений. Я проверил, что этот код работает на Win 7 с приложением C #, в то время как все мои формы скрыты и не отображаются в панели задач.

0 голосов
/ 05 февраля 2010

использование:

Public Declare Function CreateWindowExA Lib "user32" (ByVal dwExStyle As Long, 
    ByVal lpClassName As String, ByVal lpWindowName As String, ByVal dwStyle As Long, 
    ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, 
    ByVal hWndParent As Long, ByVal hMenu As Long, ByVal hInstance As Long, lpParam As Any) 
    As Long

или

Public Declare Function CreateWindowExW Lib "user32" (ByVal dwExStyle As Long, 
    ByVal lpClassName As Long, ByVal lpWindowName As Long, ByVal dwStyle As Long, 
    ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, 
    ByVal hWndParent As Long, ByVal hMenu As Long, ByVal hInstance As Long, lpParam As Long) 
    As Long

примечание: вы можете изменить lpClassName или lpWindowName на string или long в объявлении убедитесь, что вы используете "Static" в качестве члена lpClassName - это тот невидимый стиль окна, который вы хотите использовать, который обычно используется для получения окон wndproc.

возвращаемое значение из этого API-интерфейса - это hwnd (дескриптор), который можно подклассить для получения сообщений. он будет получать все стандартные сообщения Windows или вы можете отправлять ему собственные сообщения, поэтому он не запустит ваш код случайно при получении стандартного сообщения.

Пример: hwnd_main - это адрес его родительского окна

dim hwnd_recieve as long
hwnd_recieve = CreateWindowEx(num_zero, "Static", "",0,0,0,0,0, hwnd_main,0,0,0)

подкласс это и получайте удовольствие!

0 голосов
/ 20 мая 2009

Насколько я знаю, то, что вы делаете, противоречит правилам (хотя иногда эти вещи работают) ... все элементы пользовательского интерфейса должны находиться в главном потоке.

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

...