上下文
在深入讨论这个问题之前,我首先需要指出,我正在尝试在单击 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/