请教透明窗体的消息拦截方法 现在有两个窗体A和B,B窗体是透明的,并且在最前面.如果在B窗体区域点击鼠标, 会把消息直接传到A窗体上,请问有没有方法可以拦截透明窗体B的鼠标消息, 使其不能直接透到A窗体上呢. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你指什么消息会传递到A,如果用ShowDialog显示,不会的 比如说A窗体上有个按钮btn, 那么当B窗体显示在前面的时候, 因为是透明的,可以看到A窗体上的btn,这时点击btn,能够进入到btn的消息处理函数. 我的需求是此时btn不接受鼠标消息. 只有A窗体显示在最前面时才让其接受鼠标消息,进入到btn的消息处理函数中. 第一种: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(); 1 用showDialog。2 100%改为一个比较小的值,但是不是0. 可能大家还没明白我的真正用意啊!!!在表述一下吧比如说A窗体上有个按钮btn, 那么当B窗体显示在前面的时候, 因为是透明的,可以看到A窗体上的btn,这时点击btn,能够进入到btn的消息处理函数. 我的需求是此时btn不接受鼠标消息, 但是B窗体仍然能够接收鼠标消息, 比如说此时我可以用鼠标在B窗体上画图形或者手写字体(当然用非透明色)等等。只有A窗体显示在最前面时才让其接受鼠标消息,进入到btn的消息处理函数中. 问下楼主用什么属性设置窗体透明,使鼠标透过透明窗体。我用Opacity属性设的没这效果。 因为已经完全透明了.所以就穿透了.可以设置透明度为1%,或者Graphics.FillRectangle填充一层Color.Fromargb(1,255,255,255)虽然看起来还是透明的,但实际已经不穿透了. 设置透明度为1%这个方法试过了,不好用!!!!“Graphics.FillRectangle填充一层Color.Fromargb(1,255,255,255)”这个方法没太明白亚, 能不能结合代码大概说下呢, 非常感谢哦。最好有个完整的sample代码哦 设置透明度为1%这个方法试过了,不好用!!!!“Graphics.FillRectangle填充一层Color.Fromargb(1,255,255,255)”这个方法没太明白亚, 能不能结合代码大概说下呢, 非常感谢哦。最好有个完整的sample代码哦 将窗体透明度设置为1(SetLayeredWindowAttributes或者UpdateLayeredWindow)可以接收消息,但是发现个别机器有不好使的情况。 WinCE 解析如何将Json转化为DataSet 急。 关于委托和事件的代码 大家看看 这里哪里出错误了。。。 关于视屏播放器 请问 Asp.NET 动态换肤的问题! 接口问题 xtra gridcontrol 获得行删除记录的问题 高手请进!!帮忙解决下!!!!!!!!! 齐心协力解决问题:如何检查DataGrid中是否出现了垂直滚动条? 专科不爽啊,想专升本! 数据库的连接问题? 请问一下winform中做出和word类似的任意样式表格,表格里可以有任意字段和输入框,如何设计? 求解C#调用ORACLE(带有输入输出参数)过程中的错误
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();
2 100%改为一个比较小的值,但是不是0.
只有A窗体显示在最前面时才让其接受鼠标消息,进入到btn的消息处理函数中.
“Graphics.FillRectangle填充一层Color.Fromargb(1,255,255,255)”这个方法没太明白亚, 能不能结合代码大概说下呢, 非常感谢哦。最好有个完整的sample代码哦
“Graphics.FillRectangle填充一层Color.Fromargb(1,255,255,255)”这个方法没太明白亚, 能不能结合代码大概说下呢, 非常感谢哦。最好有个完整的sample代码哦