我们有一个 VB6 应用程序,它为来自 HTML 帮助文件的 WM_TCARD 消息实现了处理程序。它在应用程序中导航并打开相关屏幕等。
如何在 WinForms 应用程序中做到这一点?
我可以立即看到的唯一方法是处理窗口过程并处理 WM_TCARD 消息,其方式与我们为 VB6 应用程序所做的方式完全相同。
有没有更多的.net 方式来做到这一点?
您必须自己处理这些消息。但是,创建一个为您执行此操作的类非常容易。例如:
public class HelpCards : IMessageFilter {
const int WM_TCARD = 0x52;
const int ID_NOTIFICATION = 4242;
public enum TCardAction: int {
IDOK = 1,
IDCANCEL = 2,
IDABORT = 3,
IDRETRY = 4,
IDIGNORE = 5,
IDYES = 6,
IDNO = 7,
IDCLOSE = 8,
IDHELP = 9,
HELP_TCARD = 0x8000,
HELP_TCARD_DATA = 0x0010,
HELP_TCARD_OTHER_CALLER = 0x0011,
HELP_TCARD_OTHER_NEXT = 0x0011,
}
public HelpCards() {
Application.AddMessageFilter(this);
}
public delegate void OKReceived();
public event OKReceived OnOKReceived;
public bool PreFilterMessage(ref Message m) {
if (m.Msg == WM_TCARD && (int)m.WParam == ID_NOTIFICATION) {
switch ((TCardAction)m.LParam) {
case TCardAction.IDOK:
if (OnOKReceived != null) {
OnOKReceived();
}
break;
// etc.
}
return true; // true means message was handled
}
return false;
}
}
然后,在您要订阅的地方(可能在您的表单中)使用
hc = new HelpCards();
hc.OnOKReceived += new OKReceived(hc_OnOKReceived);
并hc
在表格的类定义中进行了定义。像这样
HelpCards hc;
并且某处具有处理功能:
void hc_OnOKReceived() {
throw new NotImplementedException();
}
显然,您需要自己完成其余的工作。但这应该让你开始。