Вопрос

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

Это было полезно?

Решение

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

Другие советы

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

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

В коде этого проекта есть изящный способ решения этой проблемы: http://www.codeproject.com/KB/dotnet/XDMessaging.aspx

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

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

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

использовать:

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 В объявлении обязательно используйте «статический» в качестве lpClassName член — это желаемый стиль невидимого окна, который обычно используется для получения окон wndproc.

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top