反向表单点击直通

本文关键字:直通 表单 | 更新日期: 2023-09-27 18:02:45

你可以创建一个Click-Through-Able…

进口:

[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);
代码:

int initialStyle = GetWindowLong(this.Handle, -20);
SetWindowLong(this.Handle, -20, initialStyle | 0x80000 | 0x20);

现在我该如何在运行一次代码后逆转效果呢?

我试过了:

int initialStyle = GetWindowLong(this.Handle, -20);
SetWindowLong(this.Handle, -20, initialStyle | 0x10000 | 0x10);

但这行不通。

提前感谢!

反向表单点击直通

作为另一个选项,您可以通过以下方式删除这些样式:

var style = GetWindowLong(this.Handle, -20);
SetWindowLong(this.Handle, -20, style & ~(0x80000 | 0x20));

注意

使用这些常量,代码会更容易理解:
const int GWL_EXSTYLE = -20;
const int WS_EX_LAYERED = 0x80000;
const int WS_EX_TRANSPARENT = 0x20;

为了将样式恢复到其初始状态,您需要将样式设置为第一个代码片段中的initialStyle的值。

你不能只是简单地在样式上添加更多的标志,然后期望它恢复正常。


public class Example
{
    private int _initialStyle = 0;
    public void ApplyStyle()
    {
        _initialStyle = GetWindowLong(...);
        SetWindowLong(..., _initialStyle | /* styles */);
    }
    public void RestoreStyle()
    {
        SetWindowLong(..., _initialStyle);
    }
}