MFC 对于使用自己的线进行启动其他进程的虚拟地址映射问题

原创 2013年12月02日 14:37:49

  由于当前进程和使用该进程启动的其他进程的之后,其他进程就会独立运行了,所以当主线程想使用其他进程的控件地址的时候,那么就会出现两种独立的虚拟地址的映射问题。

  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);
}

相关文章推荐

IA32体系32位Linux系统虚拟地址映射上

首先呢,先来了解相关历史和概念 接下来就看看实模式下的地址映射吧! 好了,本篇就先介绍这么多,一次看太多不容易消化,但还是要多看几遍哟觉得没问题的了就可以看下篇啦,下篇是重中之重!!!(保...

C++_IA32体系linux系统虚拟地址映射

IA32体系linux系统虚拟地址映射

32位Linux系统虚拟地址映射

80386

IA32体系32位Linux系统虚拟地址映射下

看到这里了,说明你已经基本掌握了地址映射的过程再坚持五分钟,再来总结一遍加补充知识! 啊,终于结束了,收工......晚安...

Unix v6中对虚拟地址映射到物理地址以及在内核态如何访问用户空间的u值

在v6中能访问的虚拟地址空间为64KB,虚拟地址长度为16位,物理地址空间的地址长度在PDP-11/40上为18位共256KB。 MMU管理: MMU由2组寄存器组成,一组在用户态使用,另...

linux中S3C2440的物理地址映射到虚拟地址详解

linux-2.6.30.4\arch\arm\plat-s3c\include\plat\ map-base.h #defineS3C_ADDR_BASE (0xF4000000) #ifndef...

Linux下的虚拟地址映射详解(二)线性地址到物理地址的映射

现在有这么一个函数   void main() { int a = 2; cout   while(a) { ; } cout }       函数运行起来会是这个样子:先打印出a的地址,假设是0x1...

Linux虚拟地址空间布局以及进程栈和线程栈总结

本文转自多个博客,以及最后有我的总结。我们有单独从头到尾写一个总结的原因是别人已经写得很好了,我不花大量时间是无法达到这水平的。 一:Linux虚拟地址空间布局 (转自:Linux虚拟地址空间布局...

mips的内存管理-kseg0,kseg1虚拟和物理地址映射理解

《mips-24kf-manual.gliethttp.pdf》p89页 所以mips复位和中断发生,都会自动进入kernel模式 . The core enters Kernel mode bo...

进程通信之内存地址映射与共享,同时如何在Linux0.11下实现共享内存

Mr.Peach这一周经历了许多磨难,所以才在deadline前2天写了这篇博文,关于进程通信时,共享内存的相关理解。 这一切都要从哈工大的第五次操作系统实验说起,它的任务就是将第四次的消费者生产者...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MFC 对于使用自己的线进行启动其他进程的虚拟地址映射问题
举报原因:
原因补充:

(最多只允许输入30个字)