2009-05-19 5 views
3

WndProcメソッドでメッセージを受け取る2番目のスレッドでフォームを作成したいとします。このような目に見えないフォームを作成するための推奨される方法は何ですか? "ShowInTaskbar = false"と "Visible = false"を十分に設定していますか、それとも「よりクリーンな」方法がありますか?可視フォームのないWndProc?

答えて

2

「クリーナー」の意味がわかりません。ユーザーが見ることのできないフォームを作成する標準的な方法は、VisibleとShowInTaskbarをfalseに設定することです。

+0

それは本当ですが、フォームを全く持たなくてもWndProcを持つ方法があるのだろうかと思っていました。 :) –

+0

ウィンドウでは、メッセージループにはウィンドウハンドルが必要です。ウィンドウハンドルを作成し、実際にウィンドウを表示することなくメッセージを渡すことは確かに可能ですが、ウィンドウには何も表示されません。NETフレームワークを使用してこれを行うことができます。アンマネージAPIを使用する必要があります。 –

+0

Windowsはその目的のためのメッセージ専用ウィンドウを持っていますが、WinFormsで公開されているとは思いません。 http://msdn.microsoft.com/en-us/library/ms632599%28VS.85%29.aspx#message_onlyを参照してください。 – shf301

0

私が知る限り、あなたがやっていることはルールに反している(ただし、これらのことはときどきうまくいく)...すべてのUIがメインスレッドになっているはずだ。

ご質問のとおり、Visibleをfalseに設定するだけで済みます。 ShowInTaskbarを設定するのは主なアプリケーションフォームにとって重要なことだと私は信じています。そうすれば、ユーザーはタスクバーからあなたのアプリに戻ることはできません。

+0

UI要素は、呼び出すことがそれらの間の通信に使用される限り、別のスレッドで実行できます。理想的には、単純化のためにすべてを1つのスレッドに保持したいと思いますが、この場合は選択肢がありません。 –

0

使用:

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メンバーとして "静的" を使用してください宣言 にstringまたはlongからlpClassNameまたはlpWindowNameを変更することができます - これはあなたが望む目に見えないウィンドウスタイルで、通常はwndprocウィンドウを受け取るために使用されます。

このapiからの戻り値は、メッセージを取得するためにサブクラス化できるhwnd(ハンドル)です。 標準のすべてのWindowsメッセージを受信するか、カスタムメッセージを送信できるため、コードが誤って起動することはありません。標準メッセージが受信されたとき。

例: hwnd_mainは、親ウィンドウのHWND

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

このサブクラスと楽しみを持っています!このプロジェクトで

0

コードは、この問題に対処するためのきちんとした方法があります。http://www.codeproject.com/KB/dotnet/XDMessaging.aspx

それは著作権で保護だので、私はここにコードをコピーしていないんだけど、あなたはそれを自分でダウンロードして参照するためにそれを使用することができます。

XDListenerクラスはNativeWindowを拡張しているため、メッセージを受信できます。コンストラクタでは、いくつかの属性がウィンドウに設定され、ウィンドウが非表示になります。メソッドWndProcは、そのクラスでオーバーライドされ、到着したメッセージを処理します。このコードはWin 7でC#アプリケーションで動作し、すべてのフォームはすべて隠されていて、TaskBarには表示されていないことをテストしました。

0

ShowInTaskbarをfalseに設定すると、Windowsメッセージを受信できなくなります。これを行う唯一の方法は、代わりにフォームを隠すことです(まだタスクバーのアイコンは表示されません)。

関連する問題