VC++ 剪贴板 共享内存 自定义消息 广播消息 操作使用
// MFCSendMessageDlg.cpp : 实现文件
// 编者: 贺昌锋
// 最后日期:2019-04-04
// 目的: VC++, MFC, WINDOWS的基本功能
// 功能:
// 1 用户自定义消息的使用
// 2 广播消息的使用(无目的消息发送,即向所有进程发送广播消息,所有进程均可以接受到消息)
// 3 剪贴板的使用(不同进程通过共享内存交换数据)
// 4 共享内存的使用(不同进程通过全局内存交换数据)
// 5 查看内存使用情况
#include “stdafx.h”
#include “MFCSendMessage.h”
#include “MFCSendMessageDlg.h”
#include “afxdialogex.h”
#include <psapi.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CMFCSendMessageDlg 对话框
- CMFCSendMessageDlg::CMFCSendMessageDlg(CWnd* pParent /=NULL/)
- CDialogEx(CMFCSendMessageDlg::IDD, pParent)
, m_editValueSend(_T("")) // 输入数据变量 IDC_EDIT1, m_editValueSend,
, m_editValueGet(_T("")) // 输出数据变量 IDC_EDIT2, m_editValueGet
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CMFCSendMessageDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
// 输入控件 IDC_EDIT1, 输出控件 IDC_EDIT2
DDX_Text(pDX, IDC_EDIT1, m_editValueSend);
DDX_Text(pDX, IDC_EDIT2, m_editValueGet);
}
BEGIN_MESSAGE_MAP(CMFCSendMessageDlg, CDialogEx)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, &CMFCSendMessageDlg::OnBnClickedButton1)
ON_BN_CLICKED(IDC_BUTTON2, &CMFCSendMessageDlg::OnBnClickedButton2)
ON_MESSAGE(WM_USER_SENDCCT, &CMFCSendMessageDlg::OnUserSendcct)
ON_REGISTERED_MESSAGE(WM_USER_BROADCASTCCT, &CMFCSendMessageDlg::OnUserBroadcastcct)
ON_BN_CLICKED(IDC_BUTTON3, &CMFCSendMessageDlg::OnBnClickedButton3)
ON_WM_COPYDATA()
ON_BN_CLICKED(IDC_BUTTON4, &CMFCSendMessageDlg::OnBnClickedButton4)
ON_BN_CLICKED(IDC_BUTTON6, &CMFCSendMessageDlg::OnBnClickedButton6)
ON_BN_CLICKED(IDC_BUTTON5, &CMFCSendMessageDlg::OnBnClickedButton5)
END_MESSAGE_MAP()
// CMFCSendMessageDlg 消息处理程序
BOOL CMFCSendMessageDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
return TRUE;
}
void CMFCSendMessageDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
}
//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CMFCSendMessageDlg::OnQueryDragIcon()
{
return static_cast(m_hIcon);
}
void CMFCSendMessageDlg::OnBnClickedButton1()
{
// 向当前窗口发送用户消息:WM_USER_SENDCCT, 参数11, 22
::PostMessage(this->GetSafeHwnd(), WM_USER_SENDCCT, 11, 22); // HWND_BROADCAST this->GetSafeHwnd() (HWND)0xffff
}
void CMFCSendMessageDlg::OnBnClickedButton2()
{
// 群发用户消息:WM_USER_BROADCASTCCT, 参数11, 22
::PostMessage(HWND_BROADCAST, WM_USER_BROADCASTCCT, 11, 22);
}
afx_msg LRESULT CMFCSendMessageDlg::OnUserSendcct(WPARAM wParam, LPARAM lParam)
{
// 处理用户消息:WM_USER_SENDCCT, 参数wParam, lParam
CString strMessage;
strMessage.Format(TEXT("wParam = %d, lParam = %d"), wParam, lParam);
AfxMessageBox(strMessage);
return 0;
}
afx_msg LRESULT CMFCSendMessageDlg::OnUserBroadcastcct(WPARAM wParam, LPARAM lParam)
{
// 处理用户消息:WM_USER_SENDCCT, 参数wParam, lParam
CString strMessage;
strMessage.Format(TEXT("wParam = %d, lParam = %d"), wParam, lParam);
AfxMessageBox(strMessage);
return 0;
}
void CMFCSendMessageDlg::OnBnClickedButton3()
{ // 发送数据
UpdateData(true);
COPYDATASTRUCT copyData = { 0 };
copyData.lpData = m_editValueSend.GetBuffer();
copyData.cbData = m_editValueSend.GetLength();
//AfxMessageBox( (LPCTSTR)copyData.lpData ); HWND_BROADCAST PostMessage
::SendMessage(GetSafeHwnd(), WM_COPYDATA, (WPARAM)GetSafeHwnd(), (LPARAM)©Data);
}
BOOL CMFCSendMessageDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
// 接收数据
m_editValueGet = (LPCTSTR)pCopyDataStruct->lpData;
m_editValueGet.ReleaseBuffer();
//AfxMessageBox((LPCTSTR)m_editValueGet);
UpdateData(false);
return CDialogEx::OnCopyData(pWnd, pCopyDataStruct);
}
void CMFCSendMessageDlg::OnBnClickedButton4()
{
// 窗体上控件:IDC_EDIT, IDC_EDIT2,分别对应变量m_editValueSend, m_editValueGet
//DDX_Text(pDX, IDC_EDIT1, m_editValueSend);
//DDX_Text(pDX, IDC_EDIT2, m_editValueGet);
//CString m_editValueSend;
//CString m_editValueGet;
// 通过剪切板传递数据
// 读取控件输入数据
UpdateData(true);
// 打开剪贴板,并清空
OpenClipboard();
EmptyClipboard();
// 读取输入数据,注意:UNCODE码占双字节,为了安全再加2个字节
m_editValueSend.ReleaseBuffer();
int nLen = (m_editValueSend.GetLength() + 1) *sizeof(WORD);
DisplayMemoryUsage();
// 申请全局内存用作剪贴板(共享内存)
HANDLE hclip = GlobalAlloc(GMEM_MOVEABLE, nLen);
// 内存上锁
char *pBuf = (char *)GlobalLock(hclip);
// 向内存写入数据
memcpy(pBuf, (char *)m_editValueSend.GetBuffer(), nLen);
// 设置剪贴板数据格式
SetClipboardData(CF_UNICODETEXT, hclip);
// 内存去锁
GlobalUnlock(hclip);
// 关闭剪贴板
CloseClipboard();
// 检查剪贴板数据格式
if (!IsClipboardFormatAvailable(CF_UNICODETEXT))
return;
// 打开剪贴板,并清空
if (!OpenClipboard())
return;
// 获得剪贴板句柄
HGLOBAL hglb = GetClipboardData(CF_UNICODETEXT);
// 内存上锁
LPCTSTR lptstr = (LPCTSTR)GlobalLock(hglb);
if (lptstr != NULL){
// 从剪贴板读取数据到控件
m_editValueGet = lptstr;
// 输出控件更新数据(显示数据)
UpdateData(false);
}
// 释放剪贴板内存 --- 方法1
if (GlobalFree(hglb)){
AfxMessageBox(TEXT("GlobalFree"));
}
// 释放剪贴板内存 --- 方法2
if (!EmptyClipboard()){
AfxMessageBox(TEXT("EmptyClipboard"));
}
// 内存去锁
GlobalUnlock(hglb);
// 关闭剪贴板
CloseClipboard();
DisplayMemoryUsage();
}
void CMFCSendMessageDlg::DisplayMemoryUsage(){
// 显示内存使用情况
HANDLE handle = GetCurrentProcess();
PROCESS_MEMORY_COUNTERS pmc;
// 内存使用情况
GetProcessMemoryInfo(handle, &pmc, sizeof(pmc));
CString str;
str.Format(TEXT("pid = %d, bytes = %d, kb = %d\n"), GetCurrentProcessId(), pmc.WorkingSetSize, int(pmc.WorkingSetSize / 1024));
//AfxMessageBox( str );
}
void CMFCSendMessageDlg::OnBnClickedButton6()
{
// 读取控件输入数据
UpdateData(true);
//创建共享内存句柄,标签"shared memory by he"
HANDLE hFileMap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 255, _T("shared memory by he"));
if (!hFileMap)
return;
// 获得共享内存指针
TCHAR* ptChar = (TCHAR*)MapViewOfFile(hFileMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);
// 向共享内存写入数据
memcpy(ptChar, m_editValueSend, m_editValueSend.GetLength()*2 + 2);
}
void CMFCSendMessageDlg::OnBnClickedButton5()
{
//获得共享内存句柄,标签"shared memory by he"
HANDLE hFileMap = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, _T(“shared memory by he”));
if (!hFileMap)
return;
// 获得共享内存指针
TCHAR* ptChar = (TCHAR*)MapViewOfFile(hFileMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);
// 读取共享内存数据
m_editValueGet = ptChar;
// 释放共享内存存储空间;
UnmapViewOfFile(ptChar);
ptChar = NULL;
//关闭共享内存句柄
CloseHandle(hFileMap);
// 控件显示数据
UpdateData( false );
}
// MFCSendMessageDlg.h : 头文件
//
#pragma once
#define WM_USER_SENDCCT WM_USER+100 // do something
static UINT NEAR WM_USER_BROADCASTCCT = RegisterWindowMessage(_T(“USER_BROADCASTCCT”)); // = RegisterWindowMessage(TEXT(“Message”));
// CMFCSendMessageDlg 对话框
class CMFCSendMessageDlg : public CDialogEx
{
// 构造
public:
CMFCSendMessageDlg(CWnd* pParent = NULL); // 标准构造函数
// 对话框数据
enum { IDD = IDD_MFCSENDMESSAGE_DIALOG };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
HICON m_hIcon;
// 生成的消息映射函数
virtual BOOL OnInitDialog();
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnBnClickedButton1();
afx_msg void OnBnClickedButton2();
protected:
afx_msg LRESULT OnUserSendcct(WPARAM wParam, LPARAM lParam);
afx_msg LRESULT OnUserBroadcastcct(WPARAM wParam, LPARAM lParam);
public:
afx_msg void OnBnClickedButton3();
afx_msg BOOL OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct);
CString m_editValueSend ;
CString m_editValueGet ;
afx_msg void OnBnClickedButton4();
void DisplayMemoryUsage();
afx_msg void OnBnClickedButton6();
afx_msg void OnBnClickedButton5();
};
// Resource.h
// {{NO_DEPENDENCIES}}
// Microsoft Visual C++ 生成的包含文件。
// 供 MFCSendMessage.rc 使用
//
#define IDD_MFCSENDMESSAGE_DIALOG 102
#define IDR_MAINFRAME 128
#define IDC_BUTTON1 1000
#define IDC_BUTTON2 1001
#define IDC_BUTTON3 1002
#define IDC_EDIT1 1003
#define IDC_EDIT2 1004
#define IDC_BUTTON4 1005
#define IDC_BUTTON5 1006
#define IDC_BUTTON6 1007
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 129
#define _APS_NEXT_COMMAND_VALUE 32771
#define _APS_NEXT_CONTROL_VALUE 1008
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
// MFCSendMessage.rc
// Microsoft Visual C++ generated resource script.
//
#include “resource.h”
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#ifndef APSTUDIO_INVOKED
#include “targetver.h”
#endif
#include “afxres.h”
#include “verrsrc.h”
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// 中文(简体,中国) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE
BEGIN
“resource.h\0”
END
2 TEXTINCLUDE
BEGIN
“#ifndef APSTUDIO_INVOKED\r\n”
“#include ““targetver.h””\r\n”
“#endif\r\n”
“#include ““afxres.h””\r\n”
“#include ““verrsrc.h””\r\n”
“\0”
END
3 TEXTINCLUDE
BEGIN
“#define _AFX_NO_SPLITTER_RESOURCES\r\n”
“#define _AFX_NO_OLE_RESOURCES\r\n”
“#define _AFX_NO_TRACKER_RESOURCES\r\n”
“#define _AFX_NO_PROPERTY_RESOURCES\r\n”
“\r\n”
“#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)\r\n”
“LANGUAGE 4, 2\r\n”
"#include ““res\MFCSendMessage.rc2"” // 非 Microsoft Visual C++ 编辑的资源\r\n”
“#include ““l.CHS\afxres.rc”” // 标准组件\r\n”
“#if !defined(_AFXDLL)\r\n”
“#include ““l.CHS\afxribbon.rc”” // MFC 功能区和控制条资源\r\n”
“#endif\r\n”
“#endif\r\n”
“\0”
END
#endif // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Icon
//
// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDR_MAINFRAME ICON “res\MFCSendMessage.ico”
/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//
IDD_MFCSENDMESSAGE_DIALOG DIALOGEX 0, 0, 320, 200
STYLE DS_SETFONT | DS_FIXEDSYS | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
EXSTYLE WS_EX_APPWINDOW
CAPTION “MFCSendMessage”
FONT 9, “MS Shell Dlg”, 0, 0, 0x1
BEGIN
DEFPUSHBUTTON “确定”,IDOK,209,179,50,14
PUSHBUTTON “取消”,IDCANCEL,263,179,50,14
CTEXT “两种消息测试”,IDC_STATIC,13,96,300,8
PUSHBUTTON “当前窗口消息”,IDC_BUTTON1,249,77,50,14
PUSHBUTTON “广播消息”,IDC_BUTTON2,187,77,50,14
PUSHBUTTON “通过消息发送数据”,IDC_BUTTON3,232,7,81,14
EDITTEXT IDC_EDIT1,7,7,223,14,ES_AUTOHSCROLL
EDITTEXT IDC_EDIT2,6,24,223,14,ES_AUTOHSCROLL | WS_DISABLED
PUSHBUTTON “通过 ClipBoard 发送数据”,IDC_BUTTON4,232,24,81,14
PUSHBUTTON “通过共享内存 交接收数据”,IDC_BUTTON5,232,54,81,14
PUSHBUTTON “通过共享内存 发送数据”,IDC_BUTTON6,232,39,81,14
END
/////////////////////////////////////////////////////////////////////////////
//
// Version
//
VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,0,0,1
PRODUCTVERSION 1,0,0,1
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
#else
FILEFLAGS 0x0L
#endif
FILEOS 0x40004L
FILETYPE 0x1L
FILESUBTYPE 0x0L
BEGIN
BLOCK “StringFileInfo”
BEGIN
BLOCK “080404B0”
BEGIN
VALUE “CompanyName”, “TODO: <公司名>”
VALUE “FileDescription”, “MFCSendMessage”
VALUE “FileVersion”, “1.0.0.1”
VALUE “InternalName”, “MFCSendMessage.exe”
VALUE “LegalCopyright”, “TODO: © <公司名>。 保留所有权利。”
VALUE “OriginalFilename”, “MFCSendMessage.exe”
VALUE “ProductName”, “TODO: <产品名>”
VALUE “ProductVersion”, “1.0.0.1”
END
END
BLOCK “VarFileInfo”
BEGIN
VALUE “Translation”, 0x804, 1200
END
END
/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//
#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO
BEGIN
IDD_MFCSENDMESSAGE_DIALOG, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 313
TOPMARGIN, 7
BOTTOMMARGIN, 193
HORZGUIDE, 2
END
END
#endif // APSTUDIO_INVOKED
#endif // 中文(简体,中国) resources
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
#define _AFX_NO_SPLITTER_RESOURCES
#define _AFX_NO_OLE_RESOURCES
#define _AFX_NO_TRACKER_RESOURCES
#define _AFX_NO_PROPERTY_RESOURCES
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
LANGUAGE 4, 2
#include “res\MFCSendMessage.rc2” // 非 Microsoft Visual C++ 编辑的资源
#include “l.CHS\afxres.rc” // 标准组件
#if !defined(_AFXDLL)
#include “l.CHS\afxribbon.rc” // MFC 功能区和控制条资源
#endif
#endif
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED