Windows核心编程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Windows核心编程相关的知识,希望对你有一定的参考价值。

一、窗口非客户区的鼠标消息

1.WM_NCMOUSEMOVE  鼠标移动

鼠标左键

WM_NCLBUTTONDOWN 按下

WM_NCLBUTTONUP  松开

WM_NCLBUTTONDBLCLK 双击

鼠标右键

WM_NCRBUTTONDOWN 按下

WM_NCRBUTTONUP  松开

WM_NCRBUTTONDBLCLK 双击

鼠标中键

WN_NCMBUTTONDOWN 按下

WM_NCMBUTTONUP 松开

WM_NCMBUTTONDBLCLK 双击

二.WM_NCHITTEST消息

1.是操作系统发给鼠标下面的窗口,以便确定鼠标是在窗口的哪个部分

上面,所有的窗口鼠标消息产生之前都是要先响应该消息,该消息由默认

窗口消息处理程序处理,返回值提示鼠标所在区域

HTCAPTION 在非客户区标题栏上

HTCLIENT 客户区

HTCLOSE 在关闭按钮上

HTHELP 非客户区帮助按钮

HTMAXBUTTON 最大化按钮

HTMINBUTTON 最小化按钮

HTTRANSPARENT 鼠标穿过窗口

...


2.滚轮消息 WM_MOUSEWHEEL

它表示鼠标被滚动的消息,这个消息不限于客户区,也不限于非客户区

WPARAM参数 低16位表示哪个键被按下, 高16位表示滚动的距离

正值表示向前滚动,负值向后滚动.

LPARAM参数 低16客户区X坐标  高16位客户区Y坐标



三.SetWindowPos函数

1.改变窗口的位置,大小和Z-Order.并且可以设置窗口的显示状态

HWND hWnd 要改变位置,大小,或Z-Order的窗口

HWND hWndInsertAfter 窗口句柄 hWnd在Z-Order上将被置于他后面

int x,int y 窗口的位置

int cx,int cy 窗口大小

UINT uFlags操作标准

成功返回TRUE 失败返回FALSE

uFlags参数

SWP_NOSIZE    维持当前窗口大小.就是忽略cx和cy参数

SWP_NOMOVE    维持当前窗口的位置,也就是忽略X和Y参数

SWP_NOZORDER    不改变窗口Z-Order次序

SWP_NOOWNERZORDER 不改变Z序中所有者窗口位置

SWP_NOREDRAW    不重绘窗口

SWP_NOSENDCHANGING 不发送窗口位置改变消息

SWP_FRAMECHANGED  强制窗口标题栏以及边框重绘,即发送WM_NCPAINT消息

SWP_HIDEWINDOW   隐藏窗口

SWP_SHOWWINDOW   显示窗口

SWP_NOACTIVATE   不激活窗口



四.多个窗口同步移动的方法

BeginDeferWindowPos 返回用于存储多窗口位置和大小信息的句柄HWND

DeferWindowPos函数把指定窗口的新位置大小信息存储在句柄HDWP中

EndDeferWindowPos最好调用EndDeferWindowPos来同时更新之前存储好的多窗口位置大小


HDWP BeginDeferWindowPos(

    int nNumWindos 村粗几个窗口的位置大小信息

) 返回值为多窗口的位置跟大小信息


DeferWindowPos(

    HDWP hWinPosInfo,BeginDeferWindowPos返回的多窗口位置跟大小信息句柄

    HWND hWnd,  要改变位置或大小信息的窗口

    HWND hWndInsertAfter,

    int x,int y,    窗口位置

    int cx,int cy,窗口大小

    UINT uFlags, //跟SetWindowPos的uFlags参数一样

)

EndDeferWindowPos(

    HDWP hWinPosInfo eginDeferWindowPos返回的多窗口位置跟大小信息句柄

)

函数返回TRUE 成功,FALSE失败



五、菜单函数

1.HMENU WINAPI CreateMenu(VOID)

 HMENU WINAPI CreatePopupMenu(VOID)


2.这两函数都返回了创建后的菜单的句柄.这两个函数的区别:


CreateMenu是创建水平菜单,通常是放置在顶级窗口中,

同时也是作为顶级菜单的,就行我们经常看到的"文件"

编辑,等菜单


6CreatePopupMenu创建的是一个垂直的弹出菜单,

经常被用来做另一个菜单的子菜单或者右键菜单


3.销毁菜单的函数 BOOL WINAPI DestoryMenu(HMENU hMenu)


4.添加菜单项

BOOL WINAPI AppendMenu(

HMENU hMenu,  //要修改的菜单

UINT uFlag,   //新菜单选项的状态信息,

MF_STRING 新建一个字符串菜单选项

MF_BITMAP 新建一个位图菜单选项

MF_POPUP 新选项为一个弹出式菜单

MF_CHECKED 新选项为一个已选中的菜单选项,即菜单选项前面有一个打钩

MF_DISABLED 新建一无法选中的菜单项,但外观不变灰

MF_GRAYED 新菜单选项无效,用户无法选中该选项, 且外观变灰


UINT_PTR uIDNewItem, //新菜单选项的命令ID

LPCWSTR lpNewItem  //新菜单选项的内容,

如果是MF_BITMAP 则为位图的句柄,否则为显示在菜单项上的内容.

)


5.设置菜单项的前面是否要打钩

DWORD CheckMenuItem(

HMENU hMenu,  //要设置的菜单句柄

UINT uIDCheckItem, 要设置的菜单项

要么是菜单的ID,要么是索引值,值类型取决于 uCheck

UINT uCheck 

MF_BYCOMMAND 指明使用菜单项的ID

MF_BYPOSITION 指明菜单项使用索引值

MF_CHECKED: 为菜单添加打钩标志 
MF_UNCHECKED 去除打钩标志


6.禁用一个菜单项

BOOL EnableMenuItem

参数1 hMenu 菜单句柄

参数2 和上面一样

参数3 

MF_BYCOMMAND 指明使用菜单项的ID

MF_BYPOSITION 指明菜单项使用索引值

MF_DISABLED 设置菜单项禁用 但不变灰

MF_ENABLED 设置菜单项启用

MF_GRAYED 设置菜单项禁用,选项变灰



7.在指定位置显示一个弹出菜单

BOOL TrackPopupMenu

参数1 菜单句柄

参数2 uFlags 菜单属性

int x,int y,屏幕坐标系,菜单的左上角坐标

int nReserved,保留着 为0即可

HWND hWnd 此窗口接收菜单的消息

函数返回前,此窗口不接收菜单的WM_COMMAND消息

CONST RECT*prcRect 保留值 NULL即可


uFlag参数属性:

设置菜单的水平方向的定位

TPM_CENTERALIGN: 弹出的菜单中心位置与参数x对齐

TPM_LEFTALIGN: 弹出的菜单左边界位置与参数x对齐

TPM_RIGHTALIGN: 弹出的菜单右边界位置与参数x对齐

设置菜单的垂直方向定位

TPM_BOTTOMALIGN: 弹出的菜单底边界与参数y对齐

TPM_TOPALIGN: 弹出的菜单顶边界位置与参数y对齐

TPM_VCENTERALIGN: 弹出的菜单中心位置与参数y对齐

设置菜单是否向窗口发送消息

TPM_NONOTIFY 用户选择菜单项后 不发送消息给窗口

TPM_RETURNCMD 用户选择菜单后,直接把菜单项的ID返回到返回值里

设置用户要鼠标的哪个键来选择菜单

TPM_LEFTBUTTON 鼠标左键

TPM_RIGHTBUTTON 鼠标右键   



六、广播消息

1.SendMessage 只能发送一个消息给一个窗口

如果要给多个窗口发送同一个消息的话,就要用到广播消息

2.把某个消息广播给指定的接收者,接收者可以是一个应用程序

网络驱动器,系统级设备驱动器,应用程序的顶级窗口

也能接收到广播消息, 

3.广播消息的消息值 必须是系统中已经注册的消息值

所以是不能使用自定义消息的.


4.向Windows注册消息

UINT RegisterWindowMessage函数

注册一个新的窗口消息.保证该消息的值在体统范围内是唯一的

参数 LPCTSTR lpString  被注册的消息的名字

返回 被注册的消息值


5.广播系统已注册的消息

long BroadcastSystemMessage

(

DWORD flags 选项

BSF_QUERY 每次发送消息给一接收者,只有接收者返回TURE才发送给下一个接受者

BSF_NOHANG 把挂起的应用程序当成超时,有一个接受者超时,就停止广播

BSF_NOTIMEOUTINFOTHUNG 只要接收者没挂起,一直等待消息响应,不会出现超时

BSF_FORCEIFHUNG 继续广播消息,即使超时或者接受者挂起

BSF_POSTMESSAGE 寄送消息,不等待消息响应,直接返回

BSF_IGNORECURRENTTASK 不发送消息给属于当前任务的窗口,这样应用程序就不会接收自己的消息


LPDWORD lpInfo 指向接受者信息的DWORD指针 并可以为下列值组合

BSM_ALLCOMPONENTS 广播到所有的系统组件

BSM_ALLDESKTOPS 广播到所有桌面

BSM_APPLICATIONS 广播到应用程序


UINT Msg 消息ID

WPARAM wParam消息参数

LPARAM 消息参数

)




七、动态的将一个窗口嵌入到一个窗口

1.首先这个窗口样式一开始是Popup,

当你拖动这个窗口到要嵌入的窗口,然后你修改样式为WM_CHILD

2. 设置父窗口

HWND SetPaert(

参数1 hWndChild  指定的窗口新父窗口的子窗口

参数2 hWndNewParent  新父窗口

返回值 hWndChild之前的父窗口

 




以上是关于Windows核心编程的主要内容,如果未能解决你的问题,请参考以下文章

windows核心编程--4线程和线程同步

C++Windows核心编程读书笔记

Windows核心编程之核心总结(第一章 错误处理)(2018.5.26)

Windows核心编程第一章.错误处理

windows核心编程--3有关进程的三个函数

Windows核心编程相关资料