カスタムメッセージフィルタSmartDeviceの応用
-
23-09-2019 - |
質問
以降 コンパクトの枠組み 電話 Show()
の形で渡される Application.Run()
, 私は、自分のメッセージポンプです。
思うにする方法を教えてください。
任意のヘルプなどの単純ばりますようお願い申し上げます。
解決
- ただしてみてくださ
VisibleChanged
イベント?
this.Shown += new EventHandler(Form1_Shown);
void Form1_Shown(object sender, EventArgs e)
{
this.Hide();
}
- できもしないようにしてい遮ることによってそのメッセージを上書きする
WndProc
.
protected override void WndProc(ref Message m) { const int SW_SHOW = 5; if (m.Msg == SW_SHOW) { //DoSomething(); } base.WndProc(ref m); }
- 代表的なメッセージポンプのように見え:
MSG msg; while(GetMessage(&msg, hwnd, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); // DoSomething. }
- 合について
Application.DoEvents()
方法。
他のヒント
私はこれは、Windowsフォームアプリケーションのために予想されるよりも大きな問題であることが判明しました。私の解決策のために私は、3つの異なるウェブサイトからの提案を引っ張り、このソリューションは非常にうまく機能することが判明しました。私のニーズのために私は、システムトレイのUIコントローラ・コンポーネントを持っているWindowsサービスを持っています。 UIはちょうどトレイアイコンとアイコンのコンテキストメニューを最小化起動する必要があります。起動したときにUIがモーダルダイアログとして動作し、UI開始したら、ユーザは、バックグラウンドスレッドで長時間実行プロセスを開始できるようにすると、ユーザーからの応答を取って再開する必要があります。
:WindowsフォームクラスIにControlBox
を設定し、最小化と最大化ボタンを無効にするために、コンストラクタで
public SystemTrayApp()
{
InitializeComponent();
this.Visible = false;
// Hide Maximize and Minimize buttons on form
this.StartPosition = FormStartPosition.CenterScreen;
this.MaximizeBox = false;
this.MinimizeBox = false;
}
ControlBox
は、ユーザーが画面上でダイアログを移動するが、サイズを変更しないで、フォームの閉じるボタン、フォームの右上隅にある赤いXを無効にすることができるように可能にする必要があり、私が使用されます:
// Force form close button to be disabled
private const int CP_NOCLOSE_BUTTON = 0x200;
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ClassStyle = cp.ClassStyle | CP_NOCLOSE_BUTTON;
return cp;
}
}
アプリケーションの起動時に静的主なメソッドを実行すると、私は、デフォルトのApplication.Run
を変更し、メインプログラムで
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
SystemTrayApp systemTrayApp = new SystemTrayApp();
systemTrayApp.Text = "File Copy Service Controller";
// Show the instance of the form modally.
systemTrayApp.ShowInTaskbar = true;
systemTrayApp.ShowDialog();
Application.Run();
}
}
今すぐ右隣のフォームのすべてのイベントを表示するには、イベントボタンを選択し、フォームを選択しプロパティをクリックし、Windowsフォームの設計ページを表示します。示されたイベントをダブルクリックしてスクロールダウンし、新しいイベントハンドラは、ソースコードに追加されます。ハンドラの方法と追加this.Hide()
に移動します:
// Runs the first time the application starts
private void SystemTrayApp_Shown(object sender, EventArgs e)
{
this.Hide();
}
最後にWindowsフォームプロジェクトのプロパティページを開き、[アプリケーション]タブを選択します。スタートアップオブジェクトの下で、スタートアップオブジェクトとしてプログラムのクラスを選択します。
あなたは、アプリケーションを終了せずにフォームを閉じる許可するように、ダイアログにボタンまたはメニューコントロールを追加する必要があります、システムトレイで実行されている、それを残して、アプリケーションを非表示にするには、ボタンやメニューコントロールを設定します。
は、アプリケーションクラスでメッセージループを交換することは実用的ではありません。はるかその後、定型のWindowsメッセージループに行くがあります。これは、Applicationクラスの力形式はのShowWindowを呼び出して見えるようになるために、とにかく本当の問題ではありません()。フォームが遅延初期化されているので、それは()ネイティブウィンドウハンドルを作成したことがない、それを呼び出す。のShowWindowせず、必要なのです。
この問題は)SetVisibleCoreを(オーバーライドすることによって、通常の.NETフレームワークのバージョンに簡単に修正することです。
protected override void SetVisibleCore(bool value) {
if (!this.IsHandleCreated) {
this.CreateHandle();
value = false; // Prevent becoming visible the first time
}
base.SetVisibleCore(value);
}
しかし、私はそれは、CFで利用可能だとは思いません解決策を見つけるために、あなたは正確に説明する必要があります。の理由はあなたが表示されてからUIを防ぎたいです。任意の作成したウィンドウハンドルがないと、アプリがdoornailとして、通常は死んでいます。これは、Application.Run()の呼び出しを遅らせるような単純なことができます。