在透明表单上单击以访问桌面

时间:2010-12-28 09:45:29

标签: c# visual-studio gdi

我有一个屏幕捕获实用程序,我可以在桌面上橡皮筋区域。我这样做是一种相当简单的方式,我有一个与屏幕大小相同的表单,我将绘制的桌面屏幕截图转换为灰度。当用户按住鼠标左键时,他/她可以选择表单上的区域。用户绘制的矩形填充了TransparentColor。一旦用户抬起他/她的鼠标,透明矩形就会保留在原位并且实际桌面可见。这是我的问题: 在我的开发PC上,我实际上可以点击这个透明的矩形并导航等,而在我的另一台PC上,表单会响应鼠标点击实际的透明矩形。

我在C#中使用.NET 4.0,关于如何让它在所有情况下实际点击进入桌面的任何想法?

谢谢,非常感谢:)

1 个答案:

答案 0 :(得分:7)

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

[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()将Form设置为Normal,否则它将是透明的。

希望这些代码有用,人们会使用它。