C# 窗体不接受用户输入(操作冻结)

本文关键字:操作 冻结 输入 窗体 不接受 用户 | 更新日期: 2023-09-27 18:35:03

我最近一直在控制台应用程序中为一个项目使用表单。我正在一个新线程中启动和刷新我的窗口,如下所示:

public void runGame()
{
  Thread windowthread = new Thread(windowRender);
  threadRunning = true;
  windowthread.Start();
}
public void windowRender()
{
  if(!windowOpened)
  {
     window.gamewindow.Show(); //window.gamewindow is a typical Windows Form
     window.gamewindow.Refresh();
  }
  while (threadRunning)
  {
    if(shouldRender)
    {
      window.gamewindow.Refresh();
      shouldRender = false;
    }
  }
}

但是,当我启动窗体(window.gamewindow,典型的Windows窗体(时,它不接受用户输入,我什至无法单击"最大化","最小化"和"退出"按钮,并且无法在屏幕上拖动。它能够成功渲染和刷新(如图所示(。有没有人知道为什么会发生这种情况以及我可以做些什么来解决这个问题?工作渲染的屏幕截图

C# 窗体不接受用户输入(操作冻结)

如果没有一个好的最小、完整和可验证的例子,就不可能确定问题是什么。但最有可能的是,这只是您未能在托管窗口的线程中调用Application.Run()

仅当标志shouldRender设置为 true 时,才更新窗口,但这不提供处理用户输入的机制,也不提供由于您无法控制的情况(例如窗口在被其他窗口部分或全部遮挡后重新显示等(而重绘窗口及其元素的机制。

如果要在新线程中托管窗口,则应执行更多操作:

public void runGame()
{
    Thread windowthread = new Thread(windowRender);
    // STA threads are required for Winforms components!
    windowthread.SetApartmentState(ApartmentState.STA);
    threadRunning = true;
    windowthread.Start();
}
public void windowRender()
{
    // The Run() method will return with the gamewindow Form
    // is closed. You should notify the windowing system of a need
    // to redraw the Form by calling Invalidate() on it.
    Application.Run(window.gamewindow);
}

最有可能的是,您根本不需要threadRunningshouldRender标志。

我猜您通过不调用 Application.DoEvents() 来阻止 Windows 消息。将其插入while块之间,我想它会有所帮助。