社区
C#
帖子详情
请教透明窗体的消息拦截方法
dabao1026
2011-04-11 05:07:46
现在有两个窗体A和B,B窗体是透明的,并且在最前面.如果在B窗体区域点击鼠标, 会把消息直接传到A窗体上,
请问有没有方法可以拦截透明窗体B的鼠标消息, 使其不能直接透到A窗体上呢.
...全文
198
17
打赏
收藏
请教透明窗体的消息拦截方法
现在有两个窗体A和B,B窗体是透明的,并且在最前面.如果在B窗体区域点击鼠标, 会把消息直接传到A窗体上, 请问有没有方法可以拦截透明窗体B的鼠标消息, 使其不能直接透到A窗体上呢.
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
17 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
wind4fly
2011-07-13
打赏
举报
回复
用事件绑定来触发点击吧。
whappy2000
2011-07-13
打赏
举报
回复
将窗体透明度设置为1(SetLayeredWindowAttributes或者UpdateLayeredWindow)可以接收消息,但是发现个别机器有不好使的情况。
dabao1026
2011-04-16
打赏
举报
回复
设置透明度为1%这个方法试过了,不好用!!!!
“Graphics.FillRectangle填充一层Color.Fromargb(1,255,255,255)”这个方法没太明白亚, 能不能结合代码大概说下呢, 非常感谢哦。最好有个完整的sample代码哦
dabao1026
2011-04-13
打赏
举报
回复
设置透明度为1%这个方法试过了,不好用!!!!
“Graphics.FillRectangle填充一层Color.Fromargb(1,255,255,255)”这个方法没太明白亚, 能不能结合代码大概说下呢, 非常感谢哦。最好有个完整的sample代码哦
dabao1026
2011-04-12
打赏
举报
回复
自己顶一下, 哪位大侠指导下哦
dylike
2011-04-12
打赏
举报
回复
不去试一试怎么知道没效果呢.这种填充法是我最常用的了.
dabao1026
2011-04-12
打赏
举报
回复
没发现比较有效果的办法啊
A1218Tiger
2011-04-12
打赏
举报
回复
上当了。
dylike
2011-04-12
打赏
举报
回复
因为已经完全透明了.所以就穿透了.可以设置透明度为1%,或者Graphics.FillRectangle填充一层Color.Fromargb(1,255,255,255)虽然看起来还是透明的,但实际已经不穿透了.
秋色之美
2011-04-12
打赏
举报
回复
[Quote=引用 4 楼 liuzhc 的回复:]
1 用showDialog。
2 100%改为一个比较小的值,但是不是0.
[/Quote]
正确,透明的窗体是没办法取得焦点的。
不有一个办法就是作系统鼠标勾子,拦截系统的鼠标事件
A1218Tiger
2011-04-12
打赏
举报
回复
问下楼主用什么属性设置窗体透明,使鼠标透过透明窗体。我用Opacity属性设的没这效果。
dabao1026
2011-04-12
打赏
举报
回复
自己顶一下, 哪位大侠指导下哦
dabao1026
2011-04-11
打赏
举报
回复
可能大家还没明白我的真正用意啊!!!在表述一下吧
比如说A窗体上有个按钮btn, 那么当B窗体显示在前面的时候, 因为是透明的,可以看到A窗体上的btn,这时点击btn,能够进入到btn的消息处理函数. 我的需求是此时btn不接受鼠标消息, 但是B窗体仍然能够接收鼠标消息, 比如说此时我可以用鼠标在B窗体上画图形或者手写字体(当然用非透明色)等等。
只有A窗体显示在最前面时才让其接受鼠标消息,进入到btn的消息处理函数中.
拿凤姐抵债
2011-04-11
打赏
举报
回复
1 用showDialog。
2 100%改为一个比较小的值,但是不是0.
-小蕾-
2011-04-11
打赏
举报
回复
第一种:
API:
[DllImport("user32.dll" , EntryPoint = "ShowCursor" , CharSet = CharSet.Auto)]
public static extern void ShowCursor(int status);
status:0/1 :隐藏/显示
==================================================================
第二种:
using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace WindowsApplication5
{
public partial class Form1 : Form
{
/// <summary>
/// 获取鼠标闲置时间
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public struct LASTINPUTINFO
{
[MarshalAs(UnmanagedType.U4)]
public int cbSize;
[MarshalAs(UnmanagedType.U4)]
public uint dwTime;
}
/// <summary>
/// 获取鼠标闲置时间
/// </summary>
/// <param name="plii"></param>
/// <returns></returns>
[DllImport("user32.dll")]
public static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);
/// <summary>
/// 设置鼠标状态的计数器(非状态)
/// </summary>
/// <param name="bShow">状态</param>
/// <returns>状态技术</returns>
[DllImport("user32.dll", EntryPoint = "ShowCursor", CharSet = CharSet.Auto)]
public static extern int ShowCursor(bool bShow);
public Form1()
{
InitializeComponent();
//定时期
System.Windows.Forms.Timer timer = new Timer();
timer.Enabled = true;
timer.Interval = 100;
timer.Tick += new EventHandler(timer_Tick);
}
//鼠标状态计数器
int iCount = 0;
void timer_Tick(object sender, EventArgs e)
{
//鼠标状态计数器>=0的情况下鼠标可见,<0不可见,并不是直接受api函数影响而改变
long i=getIdleTick() ;
if (i > 5000)
{
while (iCount >= 0)
{
iCount=ShowCursor(false);
}
}
else
{
while (iCount < 0)
{
iCount = ShowCursor(true);
}
}
}
/// <summary>
/// 获取闲置时间
/// </summary>
/// <returns></returns>
public long getIdleTick()
{
LASTINPUTINFO vLastInputInfo = new LASTINPUTINFO();
vLastInputInfo.cbSize = Marshal.SizeOf(vLastInputInfo);
if (!GetLastInputInfo(ref vLastInputInfo)) return 0;
return Environment.TickCount - (long)vLastInputInfo.dwTime;
}
}
}
============================================================================
第三种:
Cursor.Hide();
Cursor.Show();
dabao1026
2011-04-11
打赏
举报
回复
比如说A窗体上有个按钮btn, 那么当B窗体显示在前面的时候, 因为是透明的,可以看到A窗体上的btn,这时点击btn,能够进入到btn的消息处理函数. 我的需求是此时btn不接受鼠标消息. 只有A窗体显示在最前面时才让其接受鼠标消息,进入到btn的消息处理函数中.
bdmh
2011-04-11
打赏
举报
回复
你指什么消息会传递到A,如果用ShowDialog显示,不会的
java学习杂谈
Java学习杂谈(十三)--ORMPosted at 2010/03/06 Under Java经验汇总评论暂缺
这是最后一篇Java杂谈了,以ORM框架的谈论收尾,也算是把J2ee的最后一方面给涵盖到了,之所以这么晚才总结出ORM这方面,一是笔者这两周比较忙,另一方面也想善始善终,仔细的先自己好好研究一下ORM框架技术,不想草率的敷衍了事。
其实J2ee的规范指南里面就已经包括了一些对象持久化技术,例如JDO(Java Data
Qt开发经验总结
增加了很多轮子,同时原有模块拆分的也更细致,估计为了方便拓展个管理。把一些过度封装的东西移除了(比如同样的功能有多个函数),保证了只有一个函数执行该功能。把一些Qt5中兼容Qt4的
方法
废弃了,必须用Qt5中对应的新的函数。跟随时代脚步,增加了不少新特性以满足日益增长的客户需求。对某些模块和类型及处理进行了革命性的重写,运行效率提高不少。有参数类型的变化,比如 long * 到 qintptr * 等,更加适应后续的拓展以及同时对32 64位不同系统的兼容。
Qt开发经验(转载)
本文转载于https://qtchina.blog.csdn.net/?type=blog,feiyangqingyun的博客,感谢大佬的经验分享。 默认QtCreator是单线程编译,可能设计之初考虑到尽量不过多占用系统资源,而现在的电脑都是多核心的,默认msvc编译器是多线程编译的不需要手动设置,而对于其他编译器,需要手动设置才行。
方法
一:在每个项目的构建设置中(可以勾选一个 shadow build 的页面地方)的build步骤,make arguments增加一行 -j16 即可,此设置会保
Java学习杂谈
Java学习杂谈一 1. 关于动态加载机制—— 学习Java比C++更容易理解OOP的思想,毕竟C++还混合了不少面向过程的成分。很多人都能背出来Java语言的特点,所谓的动态加载机制等等。当然概念往往是先记住而后消化的,可有多少人真正去体会过动态加载的机制,试图去寻找过其中的细节呢? 提供大家一个
方法
: 在命令行窗口运行Java程序的时候,加上这个很有用的参数:
Java的一些基础知识
—— Java学习杂谈一 1. 关于动态加载机制—— 学习Java比C++更容易理解OOP的思想,毕竟C++还混合了不少面向过程的成分。很多人都能背出来Java语言的特点,所谓的动态加载机制等等。当然概念往往是先记住而后消化的,可有多少人真正去体会过动态加载的机制,试图去寻找过其中的细节呢? 提供大家一个
方法
: 在命令行窗口运行Java程序的时候,加上这个很有用的参数:
C#
111,097
社区成员
642,554
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章