0x01 关于工程
1.1 工程框架
创建MFC工程,可选择界面:
对话框、单文档、多文档、多顶级文档
详情:
https://www.cnblogs.com/hao-hong-sheng/p/8513280.html
1.2 添加控件
在资源视图打开对话框节点,从工具箱中拖入新增控件后,vs会将新控件自动添加到Resource.h中定义。但在cpp中还显示不出新添加控件的ID,需要在项目==》重新扫描解决方案,才能自动补全新控件名。
双击button自动添加了单机事件,会在cpp文件中添加消息映射message map。如:
BEGIN_MESSAGE_MAP(CMFCmessage3Dlg, CDialogEx)
ON_BN_CLICKED(IDC_bt_open, &CMFCmessage3Dlg::OnBnClickedbtopen);
END_MESSAGE_MAP()
1.3 Edit Control控件
(1)基本
添加控件后,右键为这个控件添加变量,变量类别为控件(不是值),才能通过这个变量去调用函数操作控件。
VAR_EDIT1.SetWindowTextW(_T("abc"));
控件变量名为VAR_EDIT1,不同于控件的ID为IDC_EDIT1
_T是一个适配宏,把字符串转为适合工程的编码。
当#if def _UNICODE时,_T会把字符以UNICODE双字节存储。
否则会以ANSI单字节存储。
函数SetwindowTextW接受的参数类型是LPCTSTR
它是32-bit指针指向一个常字符串,每字符可能占1字节或2字节,取决于是否定义为Unicode。
控件内数据换行需要 \r\n
(2)更新数据
在资源视图,为控件右键添加变量,类型为值。
变量VALUE_EDIT1为控件的值变量。
UpdateData(1);
可以让数据从控件,传输到变量,VAULE_EDIT1的值被更新。
UpdateData(0);
可以让数据从变量,传输到控件,控件中的值被更新。
其实相当于,新建一个CString变量,对控件取值,运算,再赋值回去。
VAR_EDIT1.GetWindowTextW(ms1);
ms1.Append(_T("hhh"));
VAR_EDIT1.SetWindowTextW(ms1);
0x02 消息操控
2.1 循环获取Notepad句柄,并发送关闭指令
HWND txtHWND = ::FindWindow(_T("Notepad"), NULL);
while (txtHWND != NULL)
{
::SendMessage(txtHWND, WM_CLOSE, NULL, NULL);
txtHWND = ::FindWindow(_T("Notepad"), NULL);
VALUE_EDIT1.Append(_T("已关闭记事本\r\n"));
}
VALUE_EDIT1.Append(_T("没有找到记事本"));
UpdateData(0);
return;
2.2 关于消息
有3种发送消息的方式,send、post、广播。区别在于,send是阻塞的,要等到程序返回才继续执行,post是送到即刻返回。记得要::再调用系统的SendMessage,否则调的是作用域内的同名函数,不一样。
::SendMessage函数:
第一个参数是句柄
第二个参数是发送的常量消息,具体可发送:
https://blog.csdn.net/rbmwjyc/article/details/78981751
第三个参数wParam:指定附加的消息特定信息。通常是一个与消息有关的常量值,也可能是窗口或控件的句柄。