自从 紧凑的框架 来电 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.
}

其他提示

我觉得这是比你预期的Windows窗体应用程序一个更大的问题。对于我的解决方案,我从三个不同的网站拉建议,发现这个解决方案很好地工作。对于我的需求,我有一个在系统托盘中的UI控制器组件Windows服务。该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;
   }
}

在主程序其中应用起动时的静态Main方法运行时,我改变默认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消息循环。这不是真正的问题,无论如何,应用程序阶级力量的形式变得可见与给ShowWindow()的调用。这是必要的,因为形式延迟初始化,如果没有的ShowWindow()调用它永远不会创建本地窗口句柄。

此问题是很容易在常规.NET框架版本的修订通过重写SetVisibleCore():

protected override void SetVisibleCore(bool value) {
  if (!this.IsHandleCreated) {
    this.CreateHandle();
    value = false;  // Prevent becoming visible the first time
  }
  base.SetVisibleCore(value);
}

但我不认为在CF.这可要找到一个解决方案,你需要解释不清楚的为什么的要阻止显示的UI。没有任何创建的窗口句柄,应用程序通常是作为一个门钉死了。这可能是一样简单延迟Application.Run()调用。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top