
MFC
尚书左仆射
我喜欢按照不按套路出牌的套路出牌。
展开
-
Windows下向指定窗口模拟发送键盘消息
在操作系统中,鼠标和键盘的操作会被转换为相应的系统消息,窗口过程在接收到消息后会进行对应的处理。发送消息,我们可以使用SendMessage()和PostMessage(),所以,只要使用这两个函数来发送鼠标和键盘的相关消息就可以了。此外,还可以通过keybd_event()和mouse_event()两个专用的函数进行鼠标和键盘按键的模拟操作。下面是一个简单的向指定窗口发送消息的例子:1原创 2016-05-18 21:10:24 · 27376 阅读 · 1 评论 -
调皮的MFC(1)
新建一个MFC工程,集成环境会先帮我们生成一个框架。框架中用到的最重要的基础类层次结构如下所示:其中在虚矩形框中的类是我们自己继承的类,实矩形框中的类是MFC中自带的类(取自深入浅出MFC)。下面对MFC中自带的类做一些大致的说明:CObject类MFC的CObject类为程序员提供了对象诊断、运行时类型标识、序列化和动态生成等功能。(1)对象诊断:利用成员函数原创 2016-07-19 20:22:20 · 1398 阅读 · 0 评论 -
windows下的内联hook实现
HOOK技术正如其名,就像是代码中放下的一个“钩子”,它在静静地等待捕获系统中的某个消息或动作。在编程技术中,钩子技术在DOS时代就已经存在了。在windows下,钩子按照实现技术的不同和挂钩位置的不同,其种类也是越来越多,但是设置钩子的本质却是始终不变的。那么钩子究竟有什么用?它能干的事非常多,例如输入监控、API拦截、消息捕获、改变程序执行流程等。杀毒软件会用HOOK技术钩住一些API函数原创 2016-05-19 18:17:51 · 6431 阅读 · 5 评论 -
MFC中的Document-View结构
MFC之所以为Application Framework,最重要的一个特征就是它能够将管理数据的程序代码和负责显示数据的程序代码分离开来,而这种能力有Document/View提供。想要实现数据管理和显示的分离,需要搞清楚一些几个问题:1. 程序的哪个部分持有数据2. 程序的哪个部分负责更新数据3. 如何以多种方式显示数据4. 如何让数据的更改有一致性5. 如何实原创 2016-07-21 12:08:36 · 4769 阅读 · 0 评论 -
WM_PAINT消息详解
原文地址:http://blog.sina.com.cn/s/blog_5344089201009whk.htmlWM_PAINT是Windows窗口系统中一条重要的消息,应用程序通过处理该消息实现在窗口上的绘制工作。1. 系统何时发送WM_PAINT消息? 系统会在多个不同的时机发送WM_PAINT消息:当第一次创建一个窗口时,当改变窗转载 2016-08-06 22:26:01 · 1042 阅读 · 0 评论 -
在ListCtrl控件中插入图标
在ListCttrl控件(Report风格)的使用上,有时需要向子列中插入图标,例如要制作一个下载软件,我们计划在控件的第一列用图标的形式显示下载状态:排队、下载中、出错等等,第二列计划用图标显示下载文件类型,要做出这样的效果,就必须使用CListCtrl的SetItem(八个参数)方法,由于我这台电脑上没有MSDN所以这八个参数具体都是什么意思我暂时不清楚,在这只介绍下跟我们的操作关系密切的几个转载 2016-08-06 20:45:14 · 2896 阅读 · 3 评论 -
实现远程代码注入
前面我写过DLL的注入代码(详见:DLL注入与卸载),但是也并非就一定要另外实现一个动态链接库再注入我们的所需操作。这次我们就直截了当一点,直接在目标进程中注入我们所需的代码来实现操控。要在目标进程中完成一定的功能,当然需要调用相关的API函数了,只是这次我们要使用的API出现在不同的DLL中。Kernel32.dll文件在每个进程中的地址是相同的,但这并不代表其他DLL文件在每个进程中的地址原创 2016-08-28 16:39:09 · 1431 阅读 · 2 评论 -
实现DLL的注入与卸载
在Windows系统下,为了避免各个进程相互影响,每个进程的地址空间都是被隔离的。在执行DLL注入时需要通过创建“远程线程”来实现。所谓“远程线程”,并不是跨计算机,而是跨进程的。简而言之,就是进程A在进程B中创建一个线程,这个线程就叫“远程线程”。要向其它进程中“注入”DLL就需要在目标进程中调用相应的API函数(LoadLibrary),可是目标进程不会自己“乖乖地”调用加载函数,这时候要原创 2016-05-15 19:10:53 · 9641 阅读 · 4 评论 -
DLL的简单实现及调用
DLL(Dynamic Link Library,动态连接库)是一个可以被其他应用程序调用的应用模块,其中封装了可以被调用的资源或函数。DLL属于可执行文件,他符合Windows系统的PE文件格式,不过他的运行是依附于EXE文件创建的进程来执行的,不能单独运行。一个DLL文件可以被多个进程所装载调用。DLL是动态连接库,相对应的,是静态连接库。动态连接库是在EXE文件运行时被加载执行的,而静原创 2016-05-14 16:47:16 · 2828 阅读 · 0 评论 -
MFC命令传递的内部流程
我们在《MFC消息流动的内部实现》中已经看到,当消息为命令消息(WM_COMMAND)时,在CWnd::OnWndMsg中将交由OnCommand虚函数来处理。该处的OnCommand函数不一定是CWnd:: OnCommand,具体情况要视this指针所指对象而定。在MFC中以下数个类都改写了OnCommand虚函数:class CWnd : public CCmdTargetclass原创 2016-08-01 14:33:57 · 2537 阅读 · 0 评论 -
MFC消息流动的内部实现
消息的一生神秘而漫长,期间曲折多为人所不知。今天就让我们一起“撩”一下这位高冷的神秘妹纸吧。事实上,MFC中利用hook技术,把看似无关的操作关联了起来。所谓hook(钩子)是Windows中一种高级的编程技术,它可以保证,在特定情况发生的时候就转去执行我们所指定的操作(是一种霸道机关术)。MFC的hook发生在CWnd派生类对象的产生之际。在WINCORE.CPP中我们可以看到如下的代码原创 2016-07-31 22:18:53 · 2359 阅读 · 0 评论 -
调皮的MFC(2)
上回书说到,WinMain和窗口处理函数分别被相应的类操作和宏操作所取代。这次我们就来看一下,取代之后的MFC程序是如何运行的吧。先把类继承图贴出来,随时可以回顾一下。主cpp文件中的第一个操作语句:// The one and only CMyWinApp objectCMyWinApp theApp;1.生成一个对象自然是要调用构造函数的,但是不仅要调用自身的构原创 2016-07-20 15:23:19 · 2301 阅读 · 1 评论 -
win32程序概况
学习MFC之前朋友建议我先学Windows编程,的确还是有道理的,毕竟MFC把自己“裹得太严实”,如果有win32的编程经验势必可以更好地掌握MFC。所以喽,文中和大家一起分享我学习win32部分后的总结。Windows程序和操作系统之间的爱恨纠葛请看下图:1中表示的是系统消息队列。当操作系统启动并初始化时,线程Raw Input Thread(RIT)就会启动,并创系统硬件输原创 2016-07-16 22:00:05 · 1748 阅读 · 0 评论 -
MFC消息映射机制实现
Windows程序的本质是依靠消息来维持运行的。每一个消息都有一个代码,并以WM_开头的常量表示。MFC把消息分为三大类:1.命令消息(WM_COMMAND):命令消息意味着“使用者命令程序做某些操作”。凡由UI对象产生的消息都是这种命令消息,可能来自菜单或加速键或工具栏按钮,并且都以WM_COMMAND呈现。什么样的类有资格接受命令消息?凡派生自CCmdTarget的类皆有资格。从c原创 2016-07-23 16:49:10 · 1411 阅读 · 0 评论 -
MFC类别型录网之对象动态创建
要实现动态生成的功能,其实利用前面建立的“类别型录”网也已经很接近了。再看一下我们依旧要用的数据结构CRuntimeClass的定义:struct CRuntimeClass{// Attributes LPCSTR m_lpszClassName; int m_nObjectSize; UINT m_wSchema; // schema number of the loaded c原创 2016-07-22 16:44:14 · 1170 阅读 · 0 评论 -
MFC类别型录网之执行期类型识别
我们知道MFC具有运行时类型识别(RTTI)的功能,那它究竟是怎么实现的呢?在MFC的内部,它通过一个叫CRuntimeClass的数据结构以及几个特殊的宏操作来构建一个“类别型录”网,通过在运行时查询该网上的信息来判断某个对象的所属类型。CRuntimeClass该类定义于AFX.H中,内容如下:struct CRuntimeClass{// Attributes LPCS原创 2016-07-22 14:26:10 · 1084 阅读 · 0 评论 -
线程同步实现
线程同步是指同一进程中的多个线程相互协调工作达到一致性。当我们编写程序时,有时会使用多个代码段同时读取或修改相同地址空间中的共享数据。此时,操作系统中可能会出现一个代码段在读取数据,而另一个代码段却在修改数据的情况。这样的情况会导致程序发生读写错误,这显然不是我期望看到的。为了避免出现类似的情况,我们需要用到线程同步技术。即当一个线程对资源正在进行读写时,其它的线程则需等待。线程的同步常用的有原创 2016-08-07 16:27:40 · 594 阅读 · 0 评论