我正在编写一个源自System.Windows.Forms.Control
的自定义控件。
控件正在使用Control.KeyDown
事件来观察击键:我应该将一些击键(例如<Ctrl>-K
)作为热键处理,这会导致我启动一个对话框。
如果我从onKeyDown
事件处理程序启动对话框,则在我将KeyEventArgs.SuppressKeyPress
设置为true
并返回之前会显示该对话框(因此我无法抑制{{} 1}}按键)。相反,我想从K
事件处理程序返回,然后启动对话框。为此,在我从onKeyDown
事件处理程序返回后,我需要以某种方式再次调用,使用某种“启动对话框”事件。
在Win32上,我可以使用onKeyDown
API生成此事件,向我自己发送已注册的窗口消息:我会在消息队列中的任何先前消息之后立即收到此消息,并将其用作发信号以启动我的对话框。但是我不能使用PostMessage
函数(也不是PostMessage
方法)因为我想使用严格的托管 API(不需要WndProc
)。
那么对于一个线程(我的UI线程)调度异步回调,托管等价物是什么呢?也许是某种类型的计时器?某种自我 - SecurityPermissionFlag::UnmanagedCode
?
答案 0 :(得分:3)
我的第一个想法是“在打开对话框之前设置SurpressKeyPress属性”,但这并没有真正回答你的问题。如果您确实需要在打开对话框之前从事件处理程序返回,请查看BeginInvoke方法。
你可以这样做:...
this.BeginInvoke(new InvokeDelegate(showDlg));
KeyEventArgs.SuppressKeyPress = true;
...
public void showDlg()
{
// create and show dialog here
}
答案 1 :(得分:0)
您可以从表单中定义的方法启动对话框,然后从新线程启动该方法(在using语句中包含System.Threading)。按钮单击事件中的代码如下所示:
Thread thread = new Thread(new ThreadStart(LaunchDialog));
thread.Start();
其中LaunchDialog是启动新对话窗口的方法。