我需要在ShowDialog()
上致电Form
,而不会实际显示对话框(将Visible
设置为false
)。不幸的是,完整框架上没有VisibleChanged
事件。我也无法覆盖Visible
属性。我能想到的最接近的是覆盖OnLoad
并在新线程中调用Hide
(因为表单的可见性在加载后设置)。这显然是一个疯狂的黑客(更不用说看起来很糟糕,因为你可以看到一个表格被绘制然后隐藏在屏幕上)但我真的似乎无法找到另一种方法来做到这一点。有什么想法吗?
编辑:我需要调用ShowDialog()
因为我正在使用一个有缺陷的第三方库,它只能在这样的表单中调用时工作,在我的场景中我不需要或不需要任何UI。我已经确认了第三方的错误,但他们目前没有任何资源来解决这个问题,所以我坚持使用一些疯狂的解决方法。
Edit2:这是关于我的问题的一些更具体的信息:
这有效:
MyForm_OnLoad(...)
{
thirdPartyLib.StartUp(MyCallback);
}
private void MyCallback(...)
{
// Do some work with the data passed in.
}
这不是:
public static void Main()
{
thirdPartyLib.StartUp(MyCallback);
// Sleep for a bit to allow the library to fire the callback.
// Normally, the callback is triggered several times a second.
Thread.Sleep(20000);
}
private void MyCallback(...)
{
// This callback is never invoked by the library.
}
所以我能让事情发挥作用的唯一方法就是在Form
中使用库。不幸的是,我不想在我的应用程序中显示一个表单,所以我试图使用该表单来安抚库但不显示任何东西以适应我的应用程序。我愿意接受建议。
请注意,紧凑框架winforms API不支持不透明度,也没有OnShown
事件(也不是VisibleChanged
)。
编辑3:对不起,伙计们,我不打算含糊不清,我只是不想迷失那些似乎不相关的细节。第三方库从通过USB连接的特殊相机捕获图像。回调函数会被一些不同的参数触发,以指示摄像机的当前状态和图像数据。
答案 0 :(得分:1)
听起来好像第三方库正在使用Windows消息进行调度,尽管你仍然不是非常清楚实际问题是什么,而且似乎过于关注你决定的方法,我仍然认为是错的。
如果你需要控件在窗口中的原因是因为它使用Windows消息进行调度,那么你可以通过MessageWindow来解决问题,或者通过你自己的调用来解决这个问题到GetMessage / TranslateMessage / DispatchMessage。
再次告诉我们实际的根本问题是什么,而不是您尝试实施的解决方案遇到的困难。
答案 1 :(得分:0)
这是一种最小化表单的方法,因为您没有在紧凑框架中提供FormWindowState.Minimized。
http://christian-helle.blogspot.com/2007/06/programmatically-minimize-application.html