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. WndProc WM_NCMOUSEUPいいえ
- 4. jQueryのフォームのCSSの可視性
- 5. Windowsフォームの可視性の問題
- 6. フォームの可視性の問題
- 7. ないコンテンツグラフの可視化
- 8. 設定不可能なコントロールでwndProcをオーバーライドする方法
- 9. "可視" DCのないHBITMAPのDrawText?
- 10. なぜWndProcのキャストが正しくないのですか?
- 11. パネルセット不可視/可視
- 12. WinApi WndProcのタイマープロシージャーの問題
- 13. Graphvizサブグラフが可視化されない
- 14. アクティブ/可視でないワークシートをソート
- 15. jQuery可視セレクタが動作しない
- 16. KnockoutJS可視バインディングが動作しない
- 17. なぜ "保護オーバーライドvoid WndProc(ref Message m)"が動作しない
- 18. Xamarinフォーム、マップのデフォルトの可視領域を変更
- 19. WNDCLASSEXがWNDPROCパラメータを取っていない
- 20. Caroufredsel応答可能な可視アイテム
- 21. 可視不完全なUITableViewRowAnimation
- 22. フォーム要素の可視性を切り替える
- 23. 可視
- 24. ドッキング可能なフォーム
- 25. C#でwndprocを使用してタスクバーの左クリックでフォームを最小化する
- 26. フォームの値に基づいて可視性を表示/非表示にする
- 27. Windowsハンドル用WNDPROCを取得
- 28. WndProcメッセージとは何か
- 29. .NET WebBrowserをオーバーライドするWndProc
- 30. Googleの可視化可能なデータ断続的な問題
それは本当ですが、フォームを全く持たなくてもWndProcを持つ方法があるのだろうかと思っていました。 :) –
ウィンドウでは、メッセージループにはウィンドウハンドルが必要です。ウィンドウハンドルを作成し、実際にウィンドウを表示することなくメッセージを渡すことは確かに可能ですが、ウィンドウには何も表示されません。NETフレームワークを使用してこれを行うことができます。アンマネージAPIを使用する必要があります。 –
Windowsはその目的のためのメッセージ専用ウィンドウを持っていますが、WinFormsで公開されているとは思いません。 http://msdn.microsoft.com/en-us/library/ms632599%28VS.85%29.aspx#message_onlyを参照してください。 – shf301