设为首页 收藏本站
查看: 692|回复: 0

[经验分享] Windows核心编程(5)

[复制链接]

尚未签到

发表于 2018-6-15 08:04:24 | 显示全部楼层 |阅读模式
  一、工具提示窗口
  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>  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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-523954-1-1.html 上篇帖子: Windows2003下配置nginx+php环境 下篇帖子: Install Windows Server 2016
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表