Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 单击透明窗体上的桌面_C#_Visual Studio_Gdi - Fatal编程技术网

C# 单击透明窗体上的桌面

C# 单击透明窗体上的桌面,c#,visual-studio,gdi,C#,Visual Studio,Gdi,我有一个屏幕捕捉工具,我可以用橡皮筋在桌面上的一个区域。我已经做了这是一个相当简单的方式,我有一个窗体,它的大小与我在屏幕上绘制的桌面转换成灰度的屏幕截图的大小相同。当用户按住鼠标左键时,他/她可以在窗体上选择一个区域。用户绘制的矩形用透明色填充。一旦用户抬起鼠标,透明的矩形就留在原位,实际的桌面就可见了。我的问题来了: 在我的dev PC上,我可以点击这个透明矩形并四处导航等。而在我的另一台PC上,窗体会在鼠标点击实际的透明矩形时做出响应 我正在使用C#中的.NET4.0,有没有关于如何让它在

我有一个屏幕捕捉工具,我可以用橡皮筋在桌面上的一个区域。我已经做了这是一个相当简单的方式,我有一个窗体,它的大小与我在屏幕上绘制的桌面转换成灰度的屏幕截图的大小相同。当用户按住鼠标左键时,他/她可以在窗体上选择一个区域。用户绘制的矩形用透明色填充。一旦用户抬起鼠标,透明的矩形就留在原位,实际的桌面就可见了。我的问题来了: 在我的dev PC上,我可以点击这个透明矩形并四处导航等。而在我的另一台PC上,窗体会在鼠标点击实际的透明矩形时做出响应

我正在使用C#中的.NET4.0,有没有关于如何让它在所有情况下都能真正点击桌面的想法


谢谢,非常感谢:)

在深入研究之后,我设法找到了解决这个问题的正确方法。事实证明,通过正确的Win32 API调用,可以将窗体设置为“不可见”,以防鼠标单击。这可以通过以下方式实现:

public const int GWL_EXSTYLE = -20;
public const uint WS_EX_LAYERED = 0x00080000;
public const uint WS_EX_TRANSPARENT = 0x00000020;

[DllImport("user32.dll", SetLastError = true)]
static extern int GetWindowLong(IntPtr hWnd, int nIndex);

[DllImport("user32.dll")]
static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);

[DllImport("user32.dll")]
static extern bool SetLayeredWindowAttributes(IntPtr hwnd, uint crKey, byte bAlpha, uint dwFlags);

public void SetFormTransparent(IntPtr Handle) {
    oldWindowLong = GetWindowLong(Handle, GWL_EXSTYLE);
    SetWindowLong(Handle, GWL_EXSTYLE, Convert.ToInt32(oldWindowLong | WS_EX_LAYERED | WS_EX_TRANSPARENT));
}

public void SetFormNormal(IntPtr Handle) {
    SetWindowLong(Handle, GWL_EXSTYLE, Convert.ToInt32(oldWindowLong | WS_EX_LAYERED));
}
但每件事都有诀窍。你需要注意的是,所有在论坛上的点击都会通过表单发送到表单下面的任何地方。为了确保如果我点击我的表单,例如点击一个按钮,并且我想点击该按钮,我做了一个简单的技巧。我在后台有一个计时器,每N毫秒运行一次,分析光标的位置。如果它在我想要的区域上方,它将通过SetFormNormal()将窗体设置为Normal,否则它将是透明的


希望此代码有帮助,人们会使用它。

与其使用计时器,为什么不利用表单上每个控件的OnMouseEnter/OnMouseDown事件呢?请为常量添加缺少的值。以下是一些有用的链接:,