📄 datarecvdlg.cpp
字号:
// DataRecvDlg.cpp : 实现文件.
//
#include "stdafx.h"
#include "DataRecv.h"
#include "DataRecvDlg.h"
#define BUFFER_SIZE 0x100 // 用内存地址通信时分配的最大内存.
#define WM_COMM WM_USER+100
const UINT wm_nRegMsg=RegisterWindowMessage("reg_data");
const UINT wm_nMemMsg=RegisterWindowMessage("mem_data");
/////////////////////////////////////////////////////////////////////////////
// CDataRecvDlg dialog
CDataRecvDlg::CDataRecvDlg(CWnd* pParent /*=NULL*/)
: CDialog(CDataRecvDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CDataRecvDlg)
m_strCopyData = _T("");
m_strFileMap = _T("");
m_strMem = _T("");
m_strRegMsg = _T("");
m_strUserMsg = _T("");
m_strClipBoard = _T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CDataRecvDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDataRecvDlg)
DDX_Text(pDX, IDC_TEXT_COPYDATA, m_strCopyData);
DDX_Text(pDX, IDC_TEXT_FILEMAP, m_strFileMap);
DDX_Text(pDX, IDC_TEXT_MEM, m_strMem);
DDX_Text(pDX, IDC_TEXT_REGMSG, m_strRegMsg);
DDX_Text(pDX, IDC_TEXT_USERMSG, m_strUserMsg);
DDX_Text(pDX, IDC_TEXT_CLIPBOARD, m_strClipBoard);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CDataRecvDlg, CDialog)
//{{AFX_MSG_MAP(CDataRecvDlg)
ON_WM_COPYDATA()
ON_MESSAGE(WM_COMM,OnUserReceiveMsg)
ON_REGISTERED_MESSAGE(wm_nRegMsg,OnRegReceiveMsg)
ON_REGISTERED_MESSAGE(wm_nMemMsg,OnRegMemMsg)
ON_BN_CLICKED(IDC_RECV_FILEMAP, OnRecvFilemap)
ON_BN_CLICKED(IDC_RECV_CLIPBOARD, OnRecvClipboard)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDataRecvDlg message handlers
BOOL CDataRecvDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
return TRUE; // return TRUE unless you set the focus to a control.
}
BOOL CDataRecvDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
m_strCopyData=(LPSTR)pCopyDataStruct->lpData;
// 获得实际长度的字符串.
m_strCopyData=m_strCopyData.Left(pCopyDataStruct->cbData);
// 更新数据.
UpdateData(FALSE);
return CDialog::OnCopyData(pWnd, pCopyDataStruct);
}
void CDataRecvDlg::OnUserReceiveMsg(WPARAM wParam,LPARAM lParam)
{
m_strUserMsg.Format("%d\n",int(lParam));
// 更新数据.
UpdateData(FALSE);
}
void CDataRecvDlg::OnRegReceiveMsg(WPARAM wParam,LPARAM lParam)
{
m_strRegMsg.Format("%d\n",int(lParam));
// 更新数据.
UpdateData(FALSE);
}
void CDataRecvDlg::OnRegMemMsg(WPARAM wParam,LPARAM lParam)
{
LPVOID lpBaseAddress=(LPVOID)lParam;
// 把字符串写入hProcess进程的内存.
HANDLE hProcess=GetCurrentProcess();
char data[BUFFER_SIZE];
ReadProcessMemory(hProcess, lpBaseAddress, data,BUFFER_SIZE, NULL);
m_strMem=data;
// 更新数据.
UpdateData(FALSE);
}
void CDataRecvDlg::OnRecvFilemap()
{
// 创建内存映像对象.
HANDLE hMapping;
LPSTR lpData;
hMapping=CreateFileMapping((HANDLE)0xFFFFFFFF,
NULL,PAGE_READWRITE,0,0x100,"MYSHARE");
if(hMapping==NULL)
{
AfxMessageBox("CreateFileMapping() failed.");
return;
}
// 将文件的视图映射到一个进程的地址空间上,返回LPVOID类型的内存指针.
lpData=(LPSTR)MapViewOfFile(hMapping,FILE_MAP_ALL_ACCESS,0,0,0);
if(lpData==NULL)
{
AfxMessageBox("MapViewOfFile() failed.");
return;
}
// 给这段映像内存的数据赋给本地变量.
m_strFileMap.Format("%s",lpData);
// 释放映像内存.
UnmapViewOfFile(lpData);
// 更新数据.
UpdateData(FALSE);
}
void CDataRecvDlg::OnRecvClipboard()
{
// 打开系统剪贴板.
if (!OpenClipboard()) return;
// 判断剪贴板上的数据是否是指定的数据格式.
if (IsClipboardFormatAvailable(CF_TEXT)|| IsClipboardFormatAvailable(CF_OEMTEXT))
{
// 从剪贴板上获得数据.
HANDLE hClipboardData = GetClipboardData(CF_TEXT);
// 通过给内存句柄加锁,获得指向指定格式数据的指针.
char *pchData = (char*)GlobalLock(hClipboardData);
// 本地变量获得数据.
m_strClipBoard = pchData;
// 给内存句柄解锁.
GlobalUnlock(hClipboardData);
}
else
{
AfxMessageBox("There is no text (ANSI) data on the Clipboard.");
}
// 使用完后关闭剪贴板.
CloseClipboard();
// 更新数据.
UpdateData(FALSE);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -