如何在C#中的Windows窗体上以编程方式激活上下文帮助模式

问题描述

我正在用C#(Visual Studio,.net Framework 4.7.2)构建Windows窗体应用程序。

我已经创建了一个表单,并将HelpButton属性设置为True,以便上下文帮助按钮出现在窗口的标题栏上,如下所示:

enter image description here

在通常情况下,用户可以单击此帮助按钮,从而激活上下文帮助模式。然后,他们单击控件以显示上下文相关的帮助。 (将HelpRequested事件调度到控件。)

我希望能够使用键盘快捷键激活“上下文帮助模式”,以便用户不必单击标题栏上的帮助按钮。换句话说,我需要以编程方式激活上下文帮助模式。怎么做?

请理解,我并不是在问如何通过按控件上的热键来打开上下文相关的帮助。 (即,在某个控件着重显示该控件的帮助时,按F1键)。这不是我想要的。我想以编程方式激活上下文帮助模式(光标变为问号),以便用户可以单击所需的控件以获取上下文相关的帮助。)

表单具有“ OnHelpButtonClicked()”功能,该功能应触发“帮助按钮”单击事件,因此我尝试了以下操作,但均未成功:

CancelEventArgs ee = new CancelEventArgs();
this.OnHelpButtonClicked(ee);

如何在不单击窗口标题栏上的“帮助”按钮的情况下以编程方式打开上下文帮助模式?

谢谢您的帮助!

解决方法

该解决方案,感谢@nilsK和以下帖子:How to do context help ("what is this?" button) in WinForms?需要向表单发送Windows消息以触发上下文帮助模式:

在窗口的主类中:

private const int SC_CONTEXTHELP = 0xf180;
private const int WM_SYSCOMMAND = 0x112;
[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern IntPtr SendMessage(IntPtr hWnd,int msg,IntPtr wp,IntPtr lp);

在按键处理程序或其他事件中触发上下文帮助模式:

SendMessage(this.Handle,WM_SYSCOMMAND,(IntPtr)SC_CONTEXTHELP,IntPtr.Zero);

有效!