2009-05-19 7 views
3

Ich möchte ein Formular auf einem zweiten Thread erstellen, der Nachrichten in seiner WndProc-Methode erhalten wird. Was ist die empfohlene Methode, um eine unsichtbare Form wie diese zu erstellen? Ist das Setzen von "ShowInTaskbar = false" und "Visible = false" genug, oder gibt es einen "saubereren" Weg?WndProc ohne sichtbare Form?

Antwort

2

Ich bin mir nicht sicher, was Sie mit "Reiniger" meinen. Die Standardmethode zum Erstellen eines Formulars, das für den Benutzer nicht sichtbar ist, besteht darin, Visible und ShowInTaskbar auf false festzulegen.

+0

Es ist wahr, aber ich frage mich, ob es einen Weg gab, einen WndProc zu haben, ohne überhaupt das Formular zu haben. :) –

+0

In Windows benötigt eine Nachrichtenschleife ein Fensterhandle. Es ist sicherlich möglich, ein Fenster-Handle zu erstellen und Nachrichten an es zu übergeben, ohne das Fenster tatsächlich anzuzeigen, aber es ist nichts in der.NET-Framework, um Ihnen dabei zu helfen. Sie müssen nicht verwaltete APIs verwenden. –

+0

Windows hat zu diesem Zweck ein Nur-Nachrichten-Fenster, aber ich glaube nicht, dass das in den WinForms angezeigt wird. Siehe http://msdn.microsoft.com/en-us/library/ms632599%28VS.85%29.aspx#message_only – shf301

0

Soweit ich weiß, was Sie tun, ist gegen die Regeln (obwohl diese Dinge manchmal funktionieren) ... alle UI-Sachen sollen im Hauptthread sein.

Wie für Ihre Frage sollten Sie in der Lage sein, Visible auf false zu setzen. Die Einstellung von ShowInTaskbar wäre nur für das Hauptanwendungsformular wichtig, und wenn Sie das täten, hätten die Benutzer keine Möglichkeit, über die Taskleiste zurück zu Ihrer App zu gelangen.

+0

UI-Elemente können in separaten Threads ausgeführt werden, sofern das Aufrufen für die Kommunikation zwischen ihnen verwendet wird. Idealerweise möchte ich alles auf 1 Thread zur Vereinfachung behalten, aber in diesem Fall habe ich keine Wahl. –

0

Verwendung:

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 

oder

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 

Anmerkung: Sie die lpClassName oder lpWindowName-string oder long in der Erklärung vergewissern Sie sich ändern können "Static" als lpClassName Element verwenden - Dies ist der gewünschte unsichtbare Fensterstil, der normalerweise verwendet wird, um wndproc-Fenster zu erhalten.

Der Rückgabewert von dieser API ist die HWND (Handle), die Sie ableiten können, um die Nachrichten erhalten wird es alle Standard-Windows-Nachrichten oder Sie können benutzerdefinierte Nachrichten an es senden, so wird es nicht versehentlich Ihren Code auslösen wenn eine Standardnachricht empfangen wird.

Beispiel: hwnd_main ist die Hwnd seiner übergeordneten Fenster

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

Unterklasse dieser und Spaß haben!

0

Der Code in diesem Projekt hat eine nette Art und Weise mit diesem Problem umzugehen: http://www.codeproject.com/KB/dotnet/XDMessaging.aspx

ich den Code hier nicht kopieren, weil sie urheberrechtlich geschützten, aber man kann es als Referenz verwenden, indem es selbst herunterladen.

Die XDListener-Klasse erweitert NativeWindow, sodass sie Nachrichten empfangen kann. Im Konstruktor sind einige Attribute im Fenster gesetzt, die es unsichtbar machen. Die Methode WndProc wird in dieser Klasse überschrieben, um eingehende Nachrichten zu verarbeiten. Ich habe getestet, dass dieser Code auf Win 7 mit einer C# -App funktioniert, während alle meine Formulare alle ausgeblendet sind und nicht in der Taskleiste angezeigt werden.

0

Sie können keine Windows-Nachrichten empfangen, wenn Sie Ihre ShowInTaskbar auf false setzen. Die einzige Möglichkeit besteht darin, stattdessen das Formular auszublenden (das Taskleistensymbol wird weiterhin ausgeblendet).