https://www.bilibili.com/video/BV1CU4y1t7E6
漏洞银行的公开课

创建 MFC 应用程序

新建一个项目

image.png

类型选择基于对话框

image.png

然后完成就行了,之后再资源视图中点击 IDD_MFCAPPLICATION1_DIALOG 就能看到 MFC 的窗体了

image.png

通过虚函数添加个功能

摁下 F2 之后弹一个框

在 MFC 的窗口右键,选择类向导

image.png

image.png

选择,添加函数,添加之后点击编辑代码

image.png

可以看到这个函数只是传了一个 MSG 参数

image.png

可以写一个 switch 来处理各个消息对应的操作

  1. switch (pMsg->message) {
  2. case WM_KEYDOWN://首先检查键盘摁下的消息
  3. {
  4. switch (pMsg->wParam) {//然后再看具体的是摁下的什么摁钮
  5. case VK_F2: {//是F2的话
  6. AfxMessageBox(L"F2 messgae");
  7. break;
  8. }
  9. case 'A': {//是'A'的话,这里可以是'A',也可以是0x41
  10. AfxMessageBox(L"A messgae");
  11. break;
  12. }
  13. case 0x42: {//是0X42的话,就像这样
  14. AfxMessageBox(L"B messgae");
  15. break;
  16. }
  17. default:
  18. break;
  19. }
  20. break;
  21. }
  22. default:
  23. break;
  24. }

image.png

设置组合键的消息处理

使用 GetKeyState 获取摁键状态:

  1. SHORT nShift = GetKeyState(VK_SHIFT);
  2. if (nShift < 0) {//如果小于0的话就说明shift是被摁下去的
  3. AfxMessageBox(L"shift + F2 messgae");
  4. break;
  5. }

发送消息

sendmessage 需要等待消息处理完才会返回
postmessage 不需要等待消息处理完,直接返回
可以在 MFCApplication1Dlg.h 先声明几个参数用来传递消息值

  1. #define USER_MSG WM_USER+1
  2. #define USER_MSG_MESSAGE 0x0001
  3. #define USER_MSG_EXITPROCESS 0x0002

因为 send 的消息大部分不经过 PreTranslateMessage 而是经过 WindowProc,所以直接把 switch 写在 WindowProc 就行了

  1. switch (message) {
  2. case USER_MSG: {
  3. switch (wParam) {
  4. case USER_MSG_MESSAGE: {
  5. MessageBox((LPCTSTR)lParam, (LPCTSTR)lParam, MB_OK);
  6. break;
  7. }
  8. case USER_MSG_EXITPROCESS: {
  9. ExitProcess(wParam);
  10. break;
  11. }
  12. default:
  13. break;
  14. }
  15. default:
  16. break;
  17. }
  18. }

摁钮的代码是这样的

  1. void CMFCApplication1Dlg::OnBnClickedCancel()
  2. {
  3. TCHAR * szStr = L"POST";
  4. PostMessage(USER_MSG, USER_MSG_MESSAGE, (UINT)szStr);
  5. }
  6. void CMFCApplication1Dlg::OnBnClickedOk()
  7. {
  8. TCHAR * szStr = L"SEND";
  9. SendMessage(USER_MSG, USER_MSG_MESSAGE, (UINT)szStr);
  10. }
  11. void CMFCApplication1Dlg::OnBnClickedOk2()
  12. {
  13. SendMessage(USER_MSG, USER_MSG_EXITPROCESS, 0);
  14. }
  15. void CMFCApplication1Dlg::OnBnClickedCancel2()
  16. {
  17. PostMessage(USER_MSG, USER_MSG_EXITPROCESS, 0);
  18. }

使用 PostMessage 以及 SendMessage 发送消息