https://www.bilibili.com/video/BV1CU4y1t7E6
漏洞银行的公开课
创建 MFC 应用程序
新建一个项目
类型选择基于对话框
然后完成就行了,之后再资源视图中点击 IDD_MFCAPPLICATION1_DIALOG 就能看到 MFC 的窗体了
通过虚函数添加个功能
摁下 F2 之后弹一个框
在 MFC 的窗口右键,选择类向导
选择,添加函数,添加之后点击编辑代码
可以看到这个函数只是传了一个 MSG 参数
可以写一个 switch 来处理各个消息对应的操作
switch (pMsg->message) {
case WM_KEYDOWN://首先检查键盘摁下的消息
{
switch (pMsg->wParam) {//然后再看具体的是摁下的什么摁钮
case VK_F2: {//是F2的话
AfxMessageBox(L"F2 messgae");
break;
}
case 'A': {//是'A'的话,这里可以是'A',也可以是0x41
AfxMessageBox(L"A messgae");
break;
}
case 0x42: {//是0X42的话,就像这样
AfxMessageBox(L"B messgae");
break;
}
default:
break;
}
break;
}
default:
break;
}
设置组合键的消息处理
使用 GetKeyState 获取摁键状态:
SHORT nShift = GetKeyState(VK_SHIFT);
if (nShift < 0) {//如果小于0的话就说明shift是被摁下去的
AfxMessageBox(L"shift + F2 messgae");
break;
}
发送消息
sendmessage 需要等待消息处理完才会返回
postmessage 不需要等待消息处理完,直接返回
可以在 MFCApplication1Dlg.h 先声明几个参数用来传递消息值
#define USER_MSG WM_USER+1
#define USER_MSG_MESSAGE 0x0001
#define USER_MSG_EXITPROCESS 0x0002
因为 send 的消息大部分不经过 PreTranslateMessage 而是经过 WindowProc,所以直接把 switch 写在 WindowProc 就行了
switch (message) {
case USER_MSG: {
switch (wParam) {
case USER_MSG_MESSAGE: {
MessageBox((LPCTSTR)lParam, (LPCTSTR)lParam, MB_OK);
break;
}
case USER_MSG_EXITPROCESS: {
ExitProcess(wParam);
break;
}
default:
break;
}
default:
break;
}
}
摁钮的代码是这样的
void CMFCApplication1Dlg::OnBnClickedCancel()
{
TCHAR * szStr = L"POST";
PostMessage(USER_MSG, USER_MSG_MESSAGE, (UINT)szStr);
}
void CMFCApplication1Dlg::OnBnClickedOk()
{
TCHAR * szStr = L"SEND";
SendMessage(USER_MSG, USER_MSG_MESSAGE, (UINT)szStr);
}
void CMFCApplication1Dlg::OnBnClickedOk2()
{
SendMessage(USER_MSG, USER_MSG_EXITPROCESS, 0);
}
void CMFCApplication1Dlg::OnBnClickedCancel2()
{
PostMessage(USER_MSG, USER_MSG_EXITPROCESS, 0);
}
使用 PostMessage 以及 SendMessage 发送消息