【问题标题】:What's the equivalent of PostMessage to self, for Windows Forms?对于 Windows 窗体,PostMessage 与 self 的等价物是什么?
【发布时间】:2010-10-04 13:19:23
【问题描述】:

我正在编写一个从System.Windows.Forms.Control 派生的自定义控件。

控件正在使用Control.KeyDown 事件来观察击键:我应该将一些击键(例如<Ctrl>-K)作为热键处理,这会导致我启动一个对话框。

如果我从onKeyDown 事件处理程序启动对话框,则在我将KeyEventArgs.SuppressKeyPress 设置为true 并返回之前显示对话框(因此我无法抑制K 按键)。相反,我想从onKeyDown 事件处理程序返回,然后启动对话框。为此,在我从 onKeyDown 事件处理程序返回后,我需要以某种方式再次被调用,并带有某种“启动对话框”事件。

在 Win32 上,我可以使用PostMessage API 生成此事件,向自己发送一条已注册的窗口消息:我将在消息队列中的任何先前消息之后立即收到此消息,并将其用作启动我的对话框。但是在这里我不能使用PostMessage 函数(也不能使用WndProc 方法),因为我想使用严格的托管 API(不需要SecurityPermissionFlag::UnmanagedCode)。

那么,对于一个线程(我的 UI 线程)来安排异步回调的托管等效项是什么:也许是某种计时器?某种自我-Invoke

【问题讨论】:

    标签: .net windows winforms controls


    【解决方案1】:

    我的第一个想法是“在打开对话框之前设置 SurpressKeyPress 属性”,但这并不能真正回答您的问题。如果您确实需要在打开对话框之前从事件处理程序返回,请查看 BeginInvoke 方法。

    你可以这样做:

    ...
    this.BeginInvoke(new InvokeDelegate(showDlg));
    KeyEventArgs.SuppressKeyPress = true;
    ...
    
    
    public void showDlg()
    {
       // create and show dialog here
    }
    

    【讨论】:

    • 谢谢。我错误地认为 Control 对自身调用 BeginInvoke 会导致同步调用。
    • @JimHarte 这里 InvokeDelegate 是 .NET 框架中的委托,还是我需要声明自己的委托?
    • @AgnelKurian 你自己的。有关示例,请参见 msdn.microsoft.com/en-us/library/0b1bf3y3%28v=vs.110%29.aspx
    【解决方案2】:

    您可以从表单中定义的方法启动对话框,并从新线程(在您的 using 语句中包括 System.Threading)启动该方法。按钮单击事件中的代码如下所示:

    Thread thread = new Thread(new ThreadStart(LaunchDialog));
    thread.Start();
    

    其中 LaunchDialog 是启动新对话窗口的方法。

    【讨论】:

    • 我希望对话框是模态的:禁用其父窗口,并获取所有击键,直到它被解除。我对让多个线程驱动单个 UI 的窗口感到紧张。我通常有一个 UI 线程,任何工作线程都不接触 UI。你认为你的建议安全吗?
    • 不,我的建议不是一个好主意。除非必须,否则我从不使用线程,而且我必须使用的情况极为罕见。我真的不明白为什么你不能从点击事件中启动模式对话框,让用户与之交互,然后关闭对话框。
    • 如果我们对此不满意,也许可以删除它?
    • 如果我从 KeyDown 事件启动它(在我将 KeyEventArgs.SuppressKeyPress 设置为 true 并返回之前),那么在显示对话框时,控件会接收后续的 KeyPress 事件(没有被抑制) .
    • @Aardvark:这不是 SO 的工作方式。有时,即使是错误或不理想的答案也对其他人有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    • 2010-11-15
    相关资源
    最近更新 更多