?? datasenddlg.cpp
字號:
// DataSendDlg.cpp : 實(shí)現(xiàn)文件.
//
#include "stdafx.h"
#include "DataSend.h"
#include "DataSendDlg.h"
#define BUFFER_SIZE 0x100 // 用內(nèi)存地址通信時(shí)分配的最大內(nèi)存.
#define WM_COMM WM_USER+100
const UINT wm_nRegMsg=RegisterWindowMessage("reg_data");
const UINT wm_nMemMsg=RegisterWindowMessage("mem_data");
/////////////////////////////////////////////////////////////////////////////
// CDataSendDlg dialog
CDataSendDlg::CDataSendDlg(CWnd* pParent /*=NULL*/)
: CDialog(CDataSendDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CDataSendDlg)
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 CDataSendDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDataSendDlg)
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(CDataSendDlg, CDialog)
//{{AFX_MSG_MAP(CDataSendDlg)
ON_BN_CLICKED(IDC_SEND_COPYDATA, OnSendCopydata)
ON_BN_CLICKED(IDC_SEND_USERMSG, OnSendUsermsg)
ON_BN_CLICKED(IDC_SEND_REGMSG, OnSendRegmsg)
ON_BN_CLICKED(IDC_SEND_MEM, OnSendMem)
ON_BN_CLICKED(IDC_SEND_FILEMAP, OnSendFilemap)
ON_BN_CLICKED(IDC_SEND_CLIPBOARD, OnSendClipboard)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDataSendDlg message handlers
BOOL CDataSendDlg::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.
}
void CDataSendDlg::OnSendCopydata()
{
UpdateData(); //更新數(shù)據(jù).
CWnd *pWnd=CWnd::FindWindow(NULL,_T("DataRecv")); // 查找DataRecv進(jìn)程.
if(pWnd==NULL){
AfxMessageBox(TEXT("Unable to find DataRecv."));
return;
}
COPYDATASTRUCT cpd; // 給COPYDATASTRUCT結(jié)構(gòu)賦值.
cpd.dwData = 0;
cpd.cbData = m_strCopyData.GetLength();
cpd.lpData = (void*)m_strCopyData.GetBuffer(cpd.cbData);
pWnd->SendMessage(WM_COPYDATA,NULL,(LPARAM)&cpd);// 發(fā)送.
}
void CDataSendDlg::OnSendUsermsg()
{
UpdateData(); // 更新數(shù)據(jù).
CWnd *pWnd=CWnd::FindWindow(NULL,_T("DataRecv")); // 查找DataRecv進(jìn)程.
if(pWnd==NULL){
AfxMessageBox(TEXT("Unable to find DataRecv."));
return;
}
UINT uMsg;
uMsg=atoi(m_strUserMsg);
pWnd->SendMessage(WM_COMM,NULL,(LPARAM)uMsg);// 發(fā)送.
}
void CDataSendDlg::OnSendRegmsg()
{
UpdateData(); // 更新數(shù)據(jù).
CWnd *pWnd=CWnd::FindWindow(NULL,_T("DataRecv")); // 查找DataRecv進(jìn)程.
if(pWnd==NULL){
AfxMessageBox("Unable to find DataRecv.");
return;
}
UINT uMsg;
uMsg=atoi(m_strRegMsg);
pWnd->SendMessage(wm_nRegMsg,NULL,(LPARAM)uMsg);// 發(fā)送.
}
void CDataSendDlg::OnSendMem()
{
UpdateData(); // 更新數(shù)據(jù).
CWnd *pWnd=CWnd::FindWindow(NULL,_T("DataRecv")); // 查找DataRecv進(jìn)程.
if(pWnd==NULL){
AfxMessageBox("Unable to find DataRecv.");
return;
}
// 獲取進(jìn)程號.
DWORD PID;
GetWindowThreadProcessId(pWnd->m_hWnd, (DWORD*)&PID );
HANDLE hProcess = OpenProcess (PROCESS_ALL_ACCESS,FALSE,PID);
// 分配虛擬內(nèi)存.
LPVOID lpBaseAddress;
lpBaseAddress = VirtualAllocEx(hProcess, 0, BUFFER_SIZE,
MEM_COMMIT, PAGE_READWRITE);
char data[BUFFER_SIZE];
strcpy(data,m_strMem);
// 把字符串寫入hProcess進(jìn)程的內(nèi)存.
WriteProcessMemory(hProcess, lpBaseAddress, data, BUFFER_SIZE, NULL);
// 發(fā)送基址給DataRecv進(jìn)程.
pWnd->SendMessage(wm_nMemMsg,NULL,(LPARAM)lpBaseAddress);
// 等待接收程序接收數(shù)據(jù).
Sleep(100);
// 釋放虛擬內(nèi)存.
VirtualFreeEx(hProcess,lpBaseAddress, 0, MEM_RELEASE);
}
void CDataSendDlg::OnSendFilemap()
{
UpdateData(); // 更新數(shù)據(jù).
// 創(chuàng)建內(nèi)存映像對象.
HANDLE hMapping;
LPSTR lpData;
hMapping=CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,
PAGE_READWRITE,0,BUFFER_SIZE,"MYSHARE");
if(hMapping==NULL)
{
AfxMessageBox("CreateFileMapping() failed.");
return;
}
// 將文件的視圖映射到一個(gè)進(jìn)程的地址空間上,返回LPVOID類型的內(nèi)存指針.
lpData=(LPSTR)MapViewOfFile(hMapping,FILE_MAP_ALL_ACCESS,0,0,0);
if(lpData==NULL)
{
AfxMessageBox("MapViewOfFile() failed.");
return;
}
// 給這段映像內(nèi)存寫數(shù)據(jù).
sprintf(lpData,m_strFileMap);
// 釋放映像內(nèi)存.
UnmapViewOfFile(lpData);
}
void CDataSendDlg::OnSendClipboard()
{
UpdateData(); // 更新數(shù)據(jù).
CString strData=m_strClipBoard; // 獲得數(shù)據(jù).
// 打開系統(tǒng)剪貼板.
if (!OpenClipboard()) return;
// 使用之前,清空系統(tǒng)剪貼板.
EmptyClipboard();
// 分配一內(nèi)存,大小等于要拷貝的字符串的大小,返回的內(nèi)存控制句柄.
HGLOBAL hClipboardData;
hClipboardData = GlobalAlloc(GMEM_DDESHARE, strData.GetLength()+1);
// 內(nèi)存控制句柄加鎖,返回值為指向那內(nèi)存控制句柄所在的特定數(shù)據(jù)格式的指針.
char * pchData;
pchData = (char*)GlobalLock(hClipboardData);
// 將本地變量的值賦給全局內(nèi)存.
strcpy(pchData, LPCSTR(strData));
// 給加鎖的全局內(nèi)存控制句柄解鎖.
GlobalUnlock(hClipboardData);
// 通過全局內(nèi)存句柄將要拷貝的數(shù)據(jù)放到剪貼板上.
SetClipboardData(CF_TEXT,hClipboardData);
// 使用完后關(guān)閉剪貼板.
CloseClipboard();
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -