.net - 在 winforms 中丢弃 ui 事件的简单解决方案?

标签 .net winforms matlab modal-dialog

上下文

在深入讨论这个问题之前,我首先需要指出,我正在尝试在单击 winforms 应用程序中的某个按钮时显示 matlab 模态图。

用于显示图形的 matlab 代码很简单,并且在 matlab 环境中运行良好(即图形是模态的,我无法按预期单击其他任何地方):

function [] = ShowModalDlg()
%[
    % Create a modal figure
    fig = figure('WindowStyle', 'modal');

    % Add some drawings in it
    membrane();

    % Block execution until figure gets closed.
    uiwait(fig);
%]

将 matlab 代码编译为 .NET 并将其集成到我的 winforms 应用程序中也很容易(只需使用 Matlab Compiler SDK ):

private void onBtnClick(object sender, EventArgs e)
{
    matlabComponent.ShowModalDlg();
} 

问题

当单击我的 winforms 应用程序中的按钮时,一切似乎都工作正常:

  • Matlab 图形按预期弹出。
  • 该图位于顶部,我无法点击其他任何地方(即模态行为)。
  • winforms 线程实际上会阻塞在 matlabComponent.ShowModalDlg() 中,直到关闭图形才能继续执行下一行代码。

但是,因为有一个但是,这就像winform应用程序仍在继续将UI事件排队,当我关闭matlab图形时,它们都在中处理一排。例如,当显示 matlab 图时,如果我尝试移动按住按钮的 winform,什么也不会发生,但是一旦我关闭图,下面的 winform 就会移动!!

我怀疑matlab端使用不同的调度模型或其他什么(这是后台的java)...无论如何我想阻止winforms来解决这个问题,例如:

private void onBtnClick(object sender, EventArgs e)
{
    using(var oo = new DiscardUIEvents(this))
    {
        matlabComponent.ShowModalDlg();
    }
}  

这可能吗?

最佳答案

您也许可以通过使用 Windows API 拦截事件来实现您所需要的。 看看this它使用 Windows API 并防止用户手动移动表单。因此,这将是为了您自己的目的而进行调整的情况。

编辑

尝试将此代码添加到您的表单中,并在启动对话框之前/之后在单击事件处理程序中设置 _controlsEnabled。这应该可以防止表单被移动。 (显然,您必须对此进行改进以满足您想要忽略的所有事件)。

    private void onBtnClick(object sender, EventArgs e)
    {
        _controlsEnabled = false;
            matlabComponent.ShowModalDlg();
        _controlsEnabled = true;
    } 

    private bool _controlsEnabled = true;

    protected override void WndProc(ref Message m)
    {
            const int WM_SYSCOMMAND = 0x0112;
            const int SC_MOVE = 0xF010;

            switch (m.Msg)
            {
                case WM_SYSCOMMAND:
                    if (!_controlsEnabled)
                    {
                         int command = m.WParam.ToInt32() & 0xfff0;
                         if (command == SC_MOVE)
                             return;
                    }
                    break;
            }
            base.WndProc(ref m);
    }

关于.net - 在 winforms 中丢弃 ui 事件的简单解决方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29558068/

相关文章:

.net - Int32^ i = gcnew Int32() 是否分配在托管堆上?

.net - 如何使用完全独立的 .NET 3.5 sp1 安装程序制作 WiX 安装程序?

C# 动态加载/卸载 DLL Redux(当然使用 AppDomain)

C# 使用安全/权限设置将文件夹复制到另一个目的地

c# - 如何在 UserControl 中创建部分客户区?

mysql - 为什么下面的代码中的日期没有增加?

c# - 在 C# 中创建 Windows 标题栏区域中的选项卡

matlab - 缩进会影响 Matlab 代码吗?

matlab - 垂直子图的单一颜色条

matlab - 按行 "ismember"无 for 循环