对于Windows Forms,PostMessage相当于什么?

时间:2009-01-30 19:25:34

标签: .net windows winforms controls

我正在编写一个源自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

2 个答案:

答案 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是启动新对话窗口的方法。