【问题标题】:Clickthrough to desktop on a transparent form在透明表单上点击进入桌面
【发布时间】:2020-09-22 21:48:47
【问题描述】:

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

我在 C# 中使用 .NET 4.0,有什么想法可以让它在所有情况下实际点击进入桌面吗??

谢谢你,非常感谢:)

【问题讨论】:

    标签: c# visual-studio gdi


    【解决方案1】:

    在深入研究后,我设法找到了解决此问题的适当方法。事实证明,通过正确的 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() 将表单设置为正常,否则它将是透明的。

    希望这段代码能有所帮助,人们会使用它。

    【讨论】:

    猜你喜欢
    • 2012-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多