WndProcメソッドでメッセージを受け取る2番目のスレッドでフォームを作成したいとします。このような目に見えないフォームを作成するための推奨される方法は何ですか? "ShowInTaskbar = false"と "Visible = false"を十分に設定していますか、それとも「よりクリーンな」方法がありますか?可視フォームのないWndProc?
答えて
「クリーナー」の意味がわかりません。ユーザーが見ることのできないフォームを作成する標準的な方法は、VisibleとShowInTaskbarをfalseに設定することです。
私が知る限り、あなたがやっていることはルールに反している(ただし、これらのことはときどきうまくいく)...すべてのUIがメインスレッドになっているはずだ。
ご質問のとおり、Visibleをfalseに設定するだけで済みます。 ShowInTaskbarを設定するのは主なアプリケーションフォームにとって重要なことだと私は信じています。そうすれば、ユーザーはタスクバーからあなたのアプリに戻ることはできません。
UI要素は、呼び出すことがそれらの間の通信に使用される限り、別のスレッドで実行できます。理想的には、単純化のためにすべてを1つのスレッドに保持したいと思いますが、この場合は選択肢がありません。 –
使用:
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)
このサブクラスと楽しみを持っています!このプロジェクトで
コードは、この問題に対処するためのきちんとした方法があります。http://www.codeproject.com/KB/dotnet/XDMessaging.aspx
それは著作権で保護だので、私はここにコードをコピーしていないんだけど、あなたはそれを自分でダウンロードして参照するためにそれを使用することができます。
XDListenerクラスはNativeWindowを拡張しているため、メッセージを受信できます。コンストラクタでは、いくつかの属性がウィンドウに設定され、ウィンドウが非表示になります。メソッドWndProcは、そのクラスでオーバーライドされ、到着したメッセージを処理します。このコードはWin 7でC#アプリケーションで動作し、すべてのフォームはすべて隠されていて、TaskBarには表示されていないことをテストしました。
ShowInTaskbarをfalseに設定すると、Windowsメッセージを受信できなくなります。これを行う唯一の方法は、代わりにフォームを隠すことです(まだタスクバーのアイコンは表示されません)。
- 1. wndprocのないウィンドウ
- 2. WndProcの使い方
- 3. jQueryのフォームのCSSの可視性
- 4. ないコンテンツグラフの可視化
- 5. Windowsフォームの可視性の問題
- 6. フォームの可視性の問題
- 7. パネルセット不可視/可視
- 8. jQuery可視セレクタが動作しない
- 9. Graphvizサブグラフが可視化されない
- 10. Caroufredsel応答可能な可視アイテム
- 11. 可視不完全なUITableViewRowAnimation
- 12. ドッキング可能なフォーム
- 13. 可視
- 14. Googleの可視化可能なデータ断続的な問題
- 15. Djangoとインタラクティブなグラフ/ネットワークの可視化
- 16. 複雑なカスタムコントロールとプロパティの可視性
- 17. C#でwndprocを使用してタスクバーの左クリックでフォームを最小化する
- 18. カクテルレシピデータの可視化
- 19. サブパッケージの可視性
- 20. のTextView不可視
- 21. Get no。 TextViewの可視/不可視線の数
- 22. リストビューディバイダは、可視
- 23. 可視化 - タブロー
- 24. 可視性
- 25. スイング可視フレーム
- 26. イベントハンドル&可視
- 27. .NET WebBrowserをオーバーライドするWndProc
- 28. WndProcメッセージとは何か
- 29. Windowsハンドル用WNDPROCを取得
- 30. Silverlight:可視状態と不可視状態の間に視覚的な遷移を追加します。
それは本当ですが、フォームを全く持たなくてもWndProcを持つ方法があるのだろうかと思っていました。 :) –
ウィンドウでは、メッセージループにはウィンドウハンドルが必要です。ウィンドウハンドルを作成し、実際にウィンドウを表示することなくメッセージを渡すことは確かに可能ですが、ウィンドウには何も表示されません。NETフレームワークを使用してこれを行うことができます。アンマネージAPIを使用する必要があります。 –
Windowsはその目的のためのメッセージ専用ウィンドウを持っていますが、WinFormsで公開されているとは思いません。 http://msdn.microsoft.com/en-us/library/ms632599%28VS.85%29.aspx#message_onlyを参照してください。 – shf301