VC++ 剪贴板 共享内存 自定义消息 广播消息 操作使用

![在这里插入图片描述](https://img-blog.csdnimg.cn/20190404161017400.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDU1NDU2MA==,size_16,color_FFFFFF,t_70

// 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)&copyData);	

}

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值