Windows核心编程(5)
2021-04-16 00:26
标签:c++ mfc 1.有时候把鼠标移动到一个窗口控件的时候 会有一个提示弹出来,这个的原理就是给工具提示窗口 发送一个消息,TM_ADDTOOL 2其中参数LPARAM是TOOLINFO结构体指针 typedef struct tagTOOLINFO{ UINT uFlag 焦点域的属性 HWND hWnd 包含工具的窗口标题,如果指定TTF_IDISHWND标准 则忽略值,而是用uid成员的值作为窗口句柄 UINT_PTR uId 吐过uFlag包含TTF_IDISHWND 此值为"工具"窗口句柄, 如果内有包含 此值为工具ID, RECT rect 如果包含TTF_IDISHWNDj就忽略此值,否则指定工具大小的RECT结构 HINSTANCE hinst 应用程序实例句柄 LPTSTR lpszText 这个域可以有如下几个值: 如果为LPSTR_TEXTCALBACK 工具就向它的窗口发送TTN_NEEDTEXT消息获得要点是的字符串 如果为资源标识 则显示资源标识所对应的字符串 如果为字符串指针,则显示字符指针指向的字符串 LPARAM lParam void* lpReserved )TOOLINFO; } 二、窗口半透明 1.创建带有扩展属性的窗口,CreateWindow函数参数没有扩展属性信息 要带有扩展信息使用CreateWindowEx 参数1 窗口窗口的扩展样式 参数2 窗口类名 参数3 窗口标题 参数4 窗口样式 参数5 6 坐标 参数7 8 大小 参数9 父窗口 参数10 窗口菜单句柄 参数11 程序实例句柄 参数12 创建窗口附加数据指针 通过CREATESTRUCT结构体传递到WM_CREATE消息的LPARAM参数中 2改变窗口各种属性: 风格,扩展风格,ID,窗口消息过程,用户数据等 LONG SetWindowLong( 参数1 改变属性的窗口 参数2 nIndex 改变的类型 改变样式或扩展样式 GWL_STYLE GWL_EXSTYLE ID类型 GWL_ID 应用程序句柄类型 GWL_HINSTANCE 用户数据类型 GWL_USERDATA 窗口消息处理类型 GWL)WNDPROC LONG dwNewLong 窗口的新属性值,具体的属性类型依赖于nIndex参数 ) 返回创建旧属性,具体返回什么依赖nIndex参数 3获取窗口的属性 GetWindowLong 参数1 要获取的窗口句柄 参数2 含义和上面的nIndex意义 返回nIndex参数类型获得相应返回值 4.要修改扩展样式,就要先获得原来的扩展样式 然后再修改,比如将普通窗口改成层窗口 //获得样式 LONG lExStyle = GetWindowLong(hWnd,GWL_EXSTYLE); //修改样式 lExStyle |= WS_EX_LAYERED //设置样式 SetWindowLong(hWnd,GWL_EXSTYLE,lExStyle ); 5.普通窗口变成层窗口 就可以具有半透明效果了 SetLayeredWindowAttributes 设置层窗口属性 参数1 设置属性窗口 参数2 掩码颜色 可以用RGB指定 参数3 透明度取值范围(0-255)0完全透明 255不透明 参数4 透明方式 LWA_ALPHA 参数2无效 参数3有效 LWA_COLORKEY 窗口中颜色为参数2的地方变透明 参数3失效 执行成功返回TRUE 三、不规则窗口 1.大部分窗口都是长方形这样的,当要做成一个 不规则的窗口应该这样做 2.SetWindowRgn函数 在窗口区域之外的部分不显示,相当于透明消息 窗口区域内的正常显示,窗口区域的编辑相当于窗口形状 参数1 HWND 要改变窗口区域的句柄 参数2 HRGN 新的窗口区域句柄 参数3 BOOL 设置窗口区域后 窗口界面是否重画 成功返回非零值 3.窗口RGN CreateRectRgn 创建普通矩形区域 CreateRoundRectRgn 创建圆角矩形 CreateEllipticRgn 创建园型区域 ExtCreateRegion 创建自定义区域 4 CreateRoundRectRgn 参数1 左上角x坐标 参数2 左上角y坐标 参数3 右下降x坐标 参数4 右下角y坐标 int w圆角园宽度 int h园高度 5.CreateEllipticRgn
参数1 园的外切矩形左上角x坐标 参数2 园的外切矩形左上角y坐标 参数3 园的外切矩形右下降x坐标 参数4 园的外切矩形右下角y坐标 6.ExtCreateRegion 参数1 lpx为执行XFORM结构体指针,用对创建后的区域做变化 如果指针为空 代表创创建后区域不变换 DWORD nCount lpData所指向控件大小 CONST RGNDATA* lpData 指向RGNDATA结构体指针,包含区域数据信息 7.RGNDATA结构体 RGNDATAHEADER rdg 指向RGNDATAHEADER 结构体变量为区域数据头信息 char Buffer[1]执行一个任意大小缓冲区.存放区域信息的RECT结构体 8.RGNDATAHEADER 结构体 DWIRD dwSize 结构体大小 DWORD iType 区域类型 必须为RDH_RECTANGLES DWORD nCount 组成区域的所有矩形个数 DWORD nRgnSize 组成区域的所有矩形的缓冲区大小 RECT rcBound 区域的矩形边界 四、截获窗口消息或事件 1.有时候要改变Windows的MessageBox 改成自己的, 但是他是Windows里的, 我们没有源码, 所以我们需要用到 拦截他的PAINT消息,改变他的绘制效果. 2.可以通过子类化的方法 SetWindowLong 把他的消息过程改了 但是呢 他这个你要在哪里改呢, 如果是在他弹出来后在更改 这样就给人效果不好了, 所以你要知道窗口是再哪初始化最好的 然后来修改, 对话框一般在WM_INITDIALOG消息进行初始化 所以在这里修改最好.把他子类化, 3.那我怎么知道WM_INITDIALOG这个消息呢 通过Windows里的钩子 五、钩子 在目标消息函数处理之前,处理该消息 1.安装钩子函数SetWindowsHookEx HHOOK SetWindowsHookEx( int idHook, //钩子类型 HOOKPROC lpfn, //钩子程序函数指针 ( 如果dwThreadId参数为0或者是由别的进程创建的线程表示, 那么ipfn必须指向DLL中的钩子程序,, 如果dwThreadId为当前进程所创建的线程标识,那么ipfn可以 指向当前进程的钩子程序,lpfn为HOOKPROC typedef LRESULT(CALLBACK* HOOKPROC)(int code,WPARAM,LPARAM) code 提示了是否处理该消息,如果参数值为HC_ACTION,则可以处理 该消息,如果code值小于0,则不需要处理消息,这是要调用CallNext HookEx函数并返回这个函数的值,CallNextHookEx为调用钩子列表 中下一个钩子的钩子程序. ) HINSTANCE hmod,//lpfn所在程序模块的实例句柄,如果dwThreadId 为当前进程所创建的线程表示并且钩子程序代码也也位于当前进程, 则hmode必须为NULL DWORD dwThreadId, //钩子程序相关联的线程的标识符,如果为0, 钩子程序就与所有程序关联,这时的钩子就是全局钩子. ) 2.钩子类型 每一类型的钩子可以使应用程序能够监视不同类型的消息处理机制 具体有:WH_CALLWNDPROC和WH_CALLWNDPROCRET:这两种类型使你 监视发送到窗口过程的消息,系统再消息发送到接收窗口过程之前调用 WH_CALLWNDPROC类型的钩子,在窗口过程处理完消息之后调用 WH_CALLWNDPROCRET类型的钩子 WH_CBT:以下事件之前,系统都调用WH_CBT类型钩子 1) 激活,建立,最小化,最大化,移动,改变窗口大小,等窗口事件 2) 完成系统指令 3) 来自系统消息队列中的移动鼠标,键盘事件 4) 设置输入焦点事件 5) 同步系统消息队列事件 WH_GETMESSAGE: 监视从消息队列返回的消息,可使用 该钩子类型去监视鼠标和键盘输入,已经发送到消息队列中的其他消息 WH_KEYBOARD:应用程序可以使用WH_KEYBODY类型的钩子监视消息队列中的 键盘消息, WH_MOUSE 应用程序可以使用WH_MOUSE类型的钩子来监视消息队列中鼠标消息 3.将钩子信息床底到当前钩子链中的下一个子程,一个钩子程序可以调用这个 函数之前或之后处理钩子的信息 CallNextHookEx( HHOOK hhk,当前钩子句柄 int nCode, 等同于HOOKPROC的nCode WPARAM wParam, 等同于HOOKPROC的wParam LPARAM lParam, 等同于HOOKPROC的lParam ) 4.HOOKPROC回调函数 LRESULT CAKKBACK HookProc( WPARAM 取决于钩子类型 LPARAM 取决于钩子类型 比如钩子类型是WH_KEYBOARD那么lParam和wParam等同于WM_KEYDOWN的 lParam和wParam,如果钩子类型为WH_CALLWNDPROC,wParam表示消息 是否来源于当前线程(非零,则表示当前线程,否则来源于其他线程) LPARAM就为指向CWPSTRUCT结构体指针. 5.卸载钩子 UnhookWindowsHookEx 卸载之前安装成功的钩子 BOOL UnhookWindowsHookEx( HHOOK hhk //之前安装钩子返回的钩子句柄 )成功返回TRUE Windows核心编程(5) 标签:c++ mfc 原文地址:http://blog.51cto.com/12158490/2103691
UINT cbSize 结构体大小
int iCode HC_ACTION HC_GETNEXT HC_SKIP HC_NOREMOVE.....