MFC 对于使用自己的线进行启动其他进程的虚拟地址映射问题
2013-12-02 14:37
513 查看
由于当前进程和使用该进程启动的其他进程的之后,其他进程就会独立运行了,所以当主线程想使用其他进程的控件地址的时候,那么就会出现两种独立的虚拟地址的映射问题。
void CTWndToolbar::SetCtrlAction(HWNDhWnd,int nIndex)
{
if (!hWnd)
return;
int nBtnCount =::SendMessage(hWnd,TB_BUTTONCOUNT,(WPARAM)0,(LPARAM)0);
if(nIndex >= nBtnCount)
return;
HWND hMainWnd =::GetAncestor(hWnd,GA_ROOT);//回复句柄到指定窗口的父窗口
//鼠标事件
POINT ptOld = {0};
GetCursorPos(&ptOld);//屏幕坐标显示光标的位置
DWORD dwProcessID = 0;
unsigned long nSize=0;
RECT rectItem={0};
HANDLE hProcess = NULL;
RECT *pRect = NULL;
GetWindowThreadProcessId(hWnd,&dwProcessID);//找到指定窗口的创建者并返回其线程ID
hProcess =OpenProcess(PROCESS_ALL_ACCESS,false,dwProcessID);//打开一个已经存在的线程对象,并返回其句柄
if (!hProcess)
{
//::MessageBox(NULL,_T("获取进程句柄操作失败!"),_T("错误!"),MB_OK);//在程序运行过程中消息提示窗体
return ;
}
//
pRect=(RECT*)VirtualAllocEx(hProcess, NULL,sizeof(RECT), MEM_COMMIT,PAGE_READWRITE);//储备或提交的内存区域内的指定进程的虚拟地址空间
if (!pRect)
{
//MessageBox(NULL,_T("无法分配内存!"),_T("错误!"),MB_OK);
return ;
}
WriteProcessMemory(hProcess, pRect,&rectItem, sizeof(RECT), NULL);//写rectItem到指定的进程的内存区域
::SendMessage(hWnd, TB_GETITEMRECT,(WPARAM)nIndex, (LPARAM)pRect);
ReadProcessMemory(hProcess,pRect,&rectItem,sizeof(RECT),&nSize);//Thisfunction reads memory in a specified process. The entire area to beread must be accessible
POINT pt={0};
pt.x = rectItem.left +(rectItem.right-rectItem.left)/2;
pt.y = rectItem.top +(rectItem.bottom-rectItem.top)/2;
::ClientToScreen(hWnd,&pt);//转换成屏幕坐标
SetCursorPos(pt.x, pt.y);//该函数把光标移到屏幕的指定位置
//将该窗口置顶
HWND hForeWnd =NULL;
DWORDdwForeID;
DWORDdwCurID;
hForeWnd =::GetForegroundWindow();
dwCurID = ::GetCurrentThreadId();
dwForeID = ::GetWindowThreadProcessId(hForeWnd,NULL );
::AttachThreadInput( dwCurID, dwForeID,TRUE);//共享输入队列,将两个线程连接到一起
SetWndTopmost(hMainWnd,TRUE);//窗口置顶
Sleep(80);
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0,0,0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0,0);
Sleep(30);
SetWndTopmost(hMainWnd,FALSE);
::AttachThreadInput(dwCurID,dwForeID,FALSE);//取消连接
VirtualFreeEx(hProcess, pRect, 0,MEM_RELEASE);
SetCursorPos(0, 0);
CloseHandle(hProcess);
}
void CTWndToolbar::SetCtrlAction(HWNDhWnd,int nIndex)
{
if (!hWnd)
return;
int nBtnCount =::SendMessage(hWnd,TB_BUTTONCOUNT,(WPARAM)0,(LPARAM)0);
if(nIndex >= nBtnCount)
return;
HWND hMainWnd =::GetAncestor(hWnd,GA_ROOT);//回复句柄到指定窗口的父窗口
//鼠标事件
POINT ptOld = {0};
GetCursorPos(&ptOld);//屏幕坐标显示光标的位置
DWORD dwProcessID = 0;
unsigned long nSize=0;
RECT rectItem={0};
HANDLE hProcess = NULL;
RECT *pRect = NULL;
GetWindowThreadProcessId(hWnd,&dwProcessID);//找到指定窗口的创建者并返回其线程ID
hProcess =OpenProcess(PROCESS_ALL_ACCESS,false,dwProcessID);//打开一个已经存在的线程对象,并返回其句柄
if (!hProcess)
{
//::MessageBox(NULL,_T("获取进程句柄操作失败!"),_T("错误!"),MB_OK);//在程序运行过程中消息提示窗体
return ;
}
//
pRect=(RECT*)VirtualAllocEx(hProcess, NULL,sizeof(RECT), MEM_COMMIT,PAGE_READWRITE);//储备或提交的内存区域内的指定进程的虚拟地址空间
if (!pRect)
{
//MessageBox(NULL,_T("无法分配内存!"),_T("错误!"),MB_OK);
return ;
}
WriteProcessMemory(hProcess, pRect,&rectItem, sizeof(RECT), NULL);//写rectItem到指定的进程的内存区域
::SendMessage(hWnd, TB_GETITEMRECT,(WPARAM)nIndex, (LPARAM)pRect);
ReadProcessMemory(hProcess,pRect,&rectItem,sizeof(RECT),&nSize);//Thisfunction reads memory in a specified process. The entire area to beread must be accessible
POINT pt={0};
pt.x = rectItem.left +(rectItem.right-rectItem.left)/2;
pt.y = rectItem.top +(rectItem.bottom-rectItem.top)/2;
::ClientToScreen(hWnd,&pt);//转换成屏幕坐标
SetCursorPos(pt.x, pt.y);//该函数把光标移到屏幕的指定位置
//将该窗口置顶
HWND hForeWnd =NULL;
DWORDdwForeID;
DWORDdwCurID;
hForeWnd =::GetForegroundWindow();
dwCurID = ::GetCurrentThreadId();
dwForeID = ::GetWindowThreadProcessId(hForeWnd,NULL );
::AttachThreadInput( dwCurID, dwForeID,TRUE);//共享输入队列,将两个线程连接到一起
SetWndTopmost(hMainWnd,TRUE);//窗口置顶
Sleep(80);
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0,0,0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0,0);
Sleep(30);
SetWndTopmost(hMainWnd,FALSE);
::AttachThreadInput(dwCurID,dwForeID,FALSE);//取消连接
VirtualFreeEx(hProcess, pRect, 0,MEM_RELEASE);
SetCursorPos(0, 0);
CloseHandle(hProcess);
}
相关文章推荐
- 【C语言】【unix c】使用mmap将文件映射到进程的虚拟地址空间,然后对内存的操作直接反应到文件中
- cpu为什么使用虚拟地址到物理地址的空间映射,解决了什么样的问题?
- 使用exec启动其他进程时可能出现的问题
- 使用Python的Supervisor进行进程监控以及自动启动
- 关于PHP程序使用file_get_content()函数进行抓取PHP程序与smarty结合编译过程中产生的静态文件,抓取不了?连接超时?(地址映射)
- linux虚拟进程地址映射机制
- 今天在MFC中使用listctrl虚拟列表遇到的一点问题
- c# 读取其他程序正打开的文件的时“正由另一进程使用,因此该进程无法访问该文件。"的问题解决方法
- 寄存器使用结构体进行空间地址的映射
- 使用Python的Supervisor进行进程监控以及自动启动
- 解决SpringMVC启动过程中地址映射两遍及任务两次启动问题
- 使用内存映射文件进行EXE、DLL通信(非MFC)
- 地址重写中使用httpModule映射.htm的问题
- 在使用win 7 无线承载网络时,启动该服务时,有时会提示:组或资源的状态不是执行请求操作的正确状态。 网上有文章指出,解决这个问题的方法是在设备管理器中启动“Microsoft托管网络虚拟适配
- MFC 启动外部进程的问题
- 关于IIS服务启动失败的问题:“IIS提示‘另一个程序正在使用此文件,进程无法访问’”,的解决方法
- 地址重写中使用httpModule映射.htm的问题
- MFC使用CEF并实现js与C++交互功能,解决Render进程中OnContextCreated绑定与OnWebKitInitialized的js扩展无法回调问题
- 1虚拟地址,虚拟内存映射,系统调用本质,进程运行状态
- 在使用 bitvise SSH client时,进行隧道S2C端口映射时,远程主机外网不能访问问题。