?? 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 + -