温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Windows核心编程(5)

发布时间:2020-04-17 05:31:16 来源:网络 阅读:999 作者:超级极客 栏目:编程语言

一、工具提示窗口

1.有时候把鼠标移动到一个窗口控件的时候

会有一个提示弹出来,这个的原理就是给工具提示窗口

发送一个消息,TM_ADDTOOL 


2其中参数LPARAM是TOOLINFO结构体指针

typedef struct tagTOOLINFO{
UINT cbSize  结构体大小

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(
int iCode HC_ACTION HC_GETNEXT HC_SKIP HC_NOREMOVE.....

WPARAM 取决于钩子类型

LPARAM 取决于钩子类型

比如钩子类型是WH_KEYBOARD那么lParam和wParam等同于WM_KEYDOWN的

lParam和wParam,如果钩子类型为WH_CALLWNDPROC,wParam表示消息

是否来源于当前线程(非零,则表示当前线程,否则来源于其他线程)

LPARAM就为指向CWPSTRUCT结构体指针. 


5.卸载钩子

UnhookWindowsHookEx

卸载之前安装成功的钩子

BOOL UnhookWindowsHookEx(

    HHOOK hhk  //之前安装钩子返回的钩子句柄 

)成功返回TRUE




向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI