反向表单点击直通
本文关键字:直通 表单 | 更新日期: 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);
}
}