C#鼠标穿透功能(WinForm)

C#鼠标穿透功能(WinForm)

在WinForm开发时,会用到这样一个场景,给屏幕增加水印Logo,但不影响画面的操作。这里就会用到鼠标穿透功能。

User32.Dll函数

要想实现鼠标穿透功能,需要用到User32.Dll的几个函数:SetWindowLong、GetWindowLong、SetLayeredWindowAttributes。

SetWindowLong

语法规则

LONG SetWindowLongA([in] HWND hWnd,[in] int  nIndex,[in] LONG dwNewLong
);

描述:更改指定窗口的属性。 函数还将指定偏移量的 32 位 (长) 值设置为额外的窗口内存。

参数类型描述
[in] hWndHWND窗口的句柄,以及窗口所属类的间接句柄。
[in] nIndexint要设置的值的从零开始的偏移量。 有效值在零到额外窗口内存的字节数之间,减去整数的大小。 若要设置任何其他值,请指定以下值之一。
[in]dwNewLongLONG替换值

其中nIndex的值含义如下,常用到值为GWL_EXSTYLE=(-20)和GWL_STYLE=(-16)

含义
GWL_EXSTYLE-20设置新的 扩展窗口样式
GWL_HINSTANCE-6设置新的应用程序实例句柄。
GWL_ID-12设置子窗口的新标识符。 该窗口不能是顶级窗口。
GWL_STYLE-16设置新 窗口样式
GWL_USERDATA-21设置与窗口关联的用户数据。 此数据供创建窗口的应用程序使用。 其值最初为零。
GWL_WNDPROC-4为窗口过程设置新地址。如果窗口不属于调用线程所在的进程,则无法更改此属性。

返回值:Long

如果函数成功,则返回值是指定 32 位整数的上一个值。

如果函数失败,则返回值为零。 要获得更多的错误信息,请调用 GetLastError。

如果指定的 32 位整数的上一个值为零,并且函数成功,则返回值为零,但函数不会清除最后一个错误信息。 这使得很难确定成功或失败。 若要处理此问题,在调用 SetWindowLong 之前,应通过调用 SetLastError 0 来清除最后一个错误信息。 然后,函数失败将由返回值零和 GetLastError 结果指示为非零。

目前基本不做判断

GetWindowLong

语法规则

LONG GetWindowLongA([in] HWND hWnd,[in] int  nIndex
);

描述

检索有关指定窗口的信息。 该函数还会检索 32 位 (DWORD) 指定偏移量到额外窗口内存的值。

参数类型描述
[in] hWndHWND窗口的句柄,以及窗口所属类的间接句柄。
[in] nIndexint要检索的值的从零开始的偏移量。 有效值的范围是零到额外窗口内存的字节数减去 4;例如,如果指定了 12 个或更多字节的额外内存,则值 8 将是第三个 32 位整数的索引。 若要检索任何其他值,请指定以下值之一。

其中nIndex的值含义如下,常用到值为GWL_EXSTYLE=(-20)和GWL_STYLE=(-16)

含义
GWL_EXSTYLE-20检索 扩展窗口样式
GWL_HINSTANCE-6检索应用程序实例的句柄。
GWL_HWNDPARENT-8检索父窗口的句柄(如果有)。
GWL_ID-12检索窗口的标识符。
GWL_STYLE-16检索 窗口样式
GWL_USERDATA-21检索与窗口关联的用户数据。 此数据供创建窗口的应用程序使用。 其值最初为零。
GWL_WNDPROC-4检索窗口过程的地址,或表示窗口过程地址的句柄。 必须使用 CallWindowProc函数调用窗口过程。

返回值
类型: LONG

如果函数成功,则返回值为请求的值。

如果函数失败,则返回值为零。 要获得更多的错误信息,请调用 GetLastError。

如果以前未调用 SetWindowLong , 则 GetWindowLong 为额外窗口或类内存中的值返回零。

SetLayeredWindowAttributes

语法规则

BOOL SetLayeredWindowAttributes([in] HWND     hwnd, [in] COLORREF crKey,[in] BYTE     bAlpha,[in] DWORD    dwFlags
);

描述:设置分层窗口的不透明度和透明度颜色键。

参数类型描述
[in] hWndHWND分层窗口的句柄。 使用 CreateWindowEx 函数创建窗口时指定WS_EX_LAYERED,或者在创建窗口后通过 SetWindowLong 设置WS_EX_LAYERED来创建分层窗口。

Windows 8: 顶级窗口和子窗口支持 WS_EX_LAYERED 样式。 以前的 Windows 版本仅支持 顶级窗口WS_EX_LAYERED 。
[in] crKeyCOLORREFCOLORREF 结构,指定要在组合分层窗口时使用的透明度颜色键。 窗口以这种颜色绘制的所有像素都是透明的。 若要生成 COLORREF,请使用 RGB 宏。
[in]bAlphaBYTE用于描述分层窗口的不透明度的 Alpha 值。 类似于 BLENDFUNCTION 结构的 SourceConstantAlpha 成员。 当 bAlpha 为 0 时,窗口是完全透明的。 当 bAlpha 为 255 时,窗口是不透明的。
[in]dwFlagsDWORD要执行的操作。 此参数可使用以下一个或多个值。
含义
LWA_ALPHA0x00000002使用 bAlpha 确定分层窗口的不透明度。
LWA_COLORKEY0x00000001使用 crKey 作为透明度颜色。

第二个就是要设置的一个透明色,第三个是要设置的透明度,bAlpha的范围是 0-255,如果是0,那么完全透明,如果是255,是完全不透明。 第四个参数,就是设置是按照透明色来透明,还是按照bAlpha来透明。或者两个都设置。 如果 dwFlags 设置了LWA_COLORKEY,那么crKey就起作用,窗口中所有的crKey颜色区域就会全部透明,如果dwFlags设置了LWA_ALPHA,那么bAlpha就会起作用,整个窗口就会按照bAlpha的值来透明。也可以这两个一起设置来同时实现这两个效果。

功能代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace demo189_窗体移动
{public partial class Form1 : Form{public Form1(){InitializeComponent();}//定义user32.dll参数值private const uint WS_EX_LAYERED = 0x80000;private const int WS_EX_TRANSPARENT = 0x20;private const int GWL_STYLE = (-16);private const int GWL_EXSTYLE = (-20);private const int LWA_ALPHA = 0;//更改指定窗口的属性[DllImport("user32", EntryPoint = "SetWindowLong")]private static extern uint SetWindowLong(IntPtr hwnd,int nIndex,uint dwNewLong);//检索有关指定窗口的信息[DllImport("user32", EntryPoint = "GetWindowLong")]private static extern uint GetWindowLong(IntPtr hwnd,int nIndex);//设置分层窗口的不透明度和透明度颜色键[DllImport("user32", EntryPoint = "SetLayeredWindowAttributes")]private static extern int SetLayeredWindowAttributes(IntPtr hwnd,int crKey,int bAlpha,int dwFlags);/// <summary> /// 设置窗体具有鼠标穿透效果 /// </summary> public void SetPenetrate(){this.TopMost = true;//GetWindowLong(this.Handle, GWL_EXSTYLE);SetWindowLong(this.Handle, GWL_EXSTYLE, WS_EX_TRANSPARENT | WS_EX_LAYERED);SetLayeredWindowAttributes(m_hWnd,0,(BYTE)220,LWA_ALPHA);//SetLayeredWindowAttributes(m_hWnd,RGB(255,0,255),(BYTE)220,LWA_ALPHA|LWA_COLORKEY);//SetLayeredWindowAttributes(m_hWnd,RGB(0,255,0),0,LWA_COLORKEY);}private void Form1_Load(object sender, EventArgs e){this.Opacity = 0.7;SetPenetrate();}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/180272.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无人零售已成为新兴趋势

无人零售已成为新兴趋势 在新零售浪潮中&#xff0c;必然会涌现新的商业形态&#xff0c;而无人零售则是其中典型代表之一。传统零售受制于人力和场地等限制&#xff0c;消费者体验较差&#xff0c;如长时间排队、缓慢结账、距离过远等问题。而无人零售解决方案&#xff0c;包括…

NextJS开发:封装shadcn/ui中的AlertDialog确认对话框

shadcn/ui很灵活可以方便的自己修改class样式&#xff0c;但是仅仅一个确认删除弹窗&#xff0c;需要拷贝太多代码和导入太多包&#xff0c;重复的代码量太多&#xff0c;不利于代码维护。所以进一步封装以符合项目中使用。 封装cx-alert-dialog.tsx import {AlertDialog,Ale…

绝地求生:成长型皮肤异色定价是否有些夸张?

大家好&#xff0c;我闲游盒小盒子&#xff01; 自从26.2更新上架回归的黑市中四款成长型皮肤以后&#xff0c;能看到社区里很多玩家都分享抽中了自己心仪的成长型皮肤。 但是对于异色很少有人去实装&#xff0c;大多数玩家都是选择去分解异色换取五张图纸然后追求升级原皮等级…

[传智杯初赛] 期末考试成绩

传智专修学院的 Java 程序设计课程的评价体系是这样的&#xff1a; 首先&#xff0c;所有学生会有一个卷面得分&#xff0c;这个得分一定是一个 [0,100][0,100] 之间的整数。 如果卷面得分在 9090 分及以上&#xff0c;那么他的 GPA&#xff08;加权平均成绩&#xff09; 就是…

JVM GC算法

一, 垃圾回收分类: 按线程数分&#xff0c;可以分为串行垃圾回收器和并行垃圾回收器。 按工作模式分&#xff0c;可以分为并发垃圾回收器和独占式垃圾回收器 按碎片处理方式分&#xff0c;可以分为压缩式垃圾回收器和非压缩式垃圾回收器按工作的内存区间分&#xff0c;又可分为…

AI数字人直播大屏:创新科技赋能企业的未来

2023年AI数字人直播大屏成为了企业领域的一项创新技术。数字人直播大屏通过结合虚拟形象和直播技术&#xff0c;为企业提供了全新的沟通和展示方式。 一、AI数字人直播大屏是什么&#xff1f; 数字人直播大屏是一种将虚拟形象和直播技术相结合的创新工具。它通过虚拟人物的形象…

python与机器学习1,机器学习的一些基础知识(完善ing)

目录 1 关于阈值θ和偏移量b和公式变形的由来 2 激活函数 3 关于回归&#xff0c;分类等 4 关于模型 5 关于回归 6 关于分类 7 关于误差和梯度下降 7-2 最小二乘法修改θ 8 深度学习 10 分类 11 参考书籍 1 关于阈值θ和偏移量b和公式变形的由来 比如很多信息传入可…

后台管理系统开源项目

最近项目没有什么事做&#xff0c;就自己整理&#xff0c;修改了一些vue2&#xff0c;react的后台管理系统项目&#xff0c;方便以后有需要可以直接提取&#xff0c;当然也方便了大家 vue2技术栈 lyl-vueProjectAdmin: vue2后台管理系统 react技术栈 lyl-reactAdminProject:…

《融合SCADA系统数据的天然气管道泄漏多源感知技术研究》误报数据识别模型开发

数据处理不作表述。因为我用的是处理后的数据&#xff0c;数据点这。 文章目录 工作内容1CC040VFD电流VFD转速压缩机转速反馈进出口差压 紧急截断阀开到位进出电动阀开到位发球筒电筒阀开到位收球筒电动阀开到位电动阀2005开到位越站阀开到位 工作内容2工作内容3 工作内容1 任…

【08】Python运算符

文章目录 1.算术运算符2.赋值运算符3.条件运算符4.逻辑运算符5.比较运算符6.运算符的优先级本期博客中,我们将学习python中常用的运算符的用法。              1.算术运算符 1.加法运算符(+): a = 10 b = 5 c = a + b print(c

Linux C语言 32-网络编程之UDP例程

Linux C语言 32-网络编程之UDP例程 本节关键字&#xff1a;C语言 网络编程 UDP协议 套接字操作 服务端 客户端 相关C库函数&#xff1a;setsockopt, socket, bind, recvfrom, sendto, close 相关接口介绍 Linux C语言 30-套接字操作 例程执行任务说明 本例程中服务端的任务…

08-学成在线项目中统一异常处理的规范

项目中的异常处理 规范异常类型 在Service类的业务方法中有很多的参数合法性校验,当请求参数不合法的时候会抛出异常,但此时异常信息只会在控制台输出,前端界面并不会提示用户 实际开发中前端和后端需要做一些约定: 一般将错误提示信息统一以json格式返回给前端,以HTTP状态码…

P9231 [蓝桥杯 2023 省 A] 平方差(拆分问题)

分析&#xff1a;x(yz)*(y-z); yz 与 y-z 同奇偶性&#xff08;x要么为奇数&#xff0c;要么为偶数&#xff09; 奇数&#xff1a;1 与 其本身 乘积 偶数&#xff1a;2 与 x/2 乘积(为4的倍数) #include<bit…

面试篇spark(spark core,spark sql,spark 优化)

一&#xff1a;为什么学习spark&#xff1f; 相比较map-reduce框架&#xff0c;spark的框架执行效率更加高效。 mapreduce的执行框架示意图。 spark执行框架示意图 spark的执行中间结果是存储在内存当中的&#xff0c;而hdfs的执行中间结果是存储在hdfs中的。所以在运算的时…

求和(打表题)

题目 打个表发现当 n 时答案为 p &#xff0c;否则为 1 &#xff0c;然后套板子。 #include <iostream> #include <algorithm> #include <vector> #include <cstring> #include <cmath>using namespace std;#define int long long using i64 …

卷积神经网络入门

1.卷积神经网络基本结构结构 卷积神经网络采用类似于动物视觉皮层组织中的神经元的连接模式&#xff0c;是一类包含卷积神经网络且具有深度结构的前馈神经网络。其基本结构如图2-1所示&#xff0c;大致包括&#xff1a;卷积层&#xff0c;激活函数&#xff0c;池化层&#xff…

Module build failed: Error: ENOENT: no such file or directory

前言 这个错误通常发生在Node.js 和 vue,js项目中&#xff0c;当你试图访问一个不存在的文件或目录时。在大多数情况下&#xff0c;这是因为你的代码试图打开一个不存在的文件&#xff0c;或者你的构建系统&#xff08;例如Webpack&#xff09;需要一个配置文件&#xff0c;但找…

【泛型】JAVA基础篇(三)

泛型&#xff08;Generics&#xff09;是Java编程语言中的一个强大的特性&#xff0c;它提供了编译时类型安全检测机制&#xff0c;这意味着可以在编译期间检测到非法的类型。泛型的使用减少了程序中的强制类型转换和运行时错误的可能性。 一、泛型使用规范 类型参数命名约定…

【LeetCode】70. 爬楼梯

70. 爬楼梯 难度&#xff1a;简单 题目 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;2 解释&#xff1a;有两种方法可以爬到楼…

面试刷题自备中

面试刷题自备中 JavaSE基础线程redisMQkafkaspringspringmvcspringbootspringcloud设计模式数据库FastDFS垃圾回收机制项目部署dockerlinux JavaSE基础 面向对象都有哪些特性以及你对这些特性的理解访问权限修饰符 public、private、protected, 以及不写&#xff08;默认&…