메시지를 직접 처리해야합니다. 그러나, 당신을 위해 이것을하는 클래스를 만드는 것은 꽤 쉽습니다. 예컨대 :
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();
}
은 분명히 당신은 나머지를 직접 수행해야합니다. 하지만 그렇게하면 시작할 수 있습니다.
고마워요. 그럴 것이라고 생각했지만 HelpProvider 또는 메시지 처리가 필요하지 않음을 의미하는 무언가를 놓치기를 바랬다. –
아, 클래스가 삭제 될 때 메시지 필터를 제거하려고합니다. . 그리고 이벤트 위임자에 void()가 아닌 EventHandler를 사용하려고합니다. –