Вы можете использовать SetWindowLong , чтобы установить стиль окна WS_EX_TRANSPARENT:
Если многослойное окно имеет расширенный стиль окна WS_EX_TRANSPARENT, форма многослойного окна будет игнорироваться, и события мыши будут передаваться в другие окна под многослойным окном.
CodeProject имеет эту статью, детализирующую технику. Хотя он находится в VB.NET, его легко конвертировать в C #.
В прошлом я использовал следующий код:
public enum GWL
{
ExStyle = -20
}
public enum WS_EX
{
Transparent = 0x20,
Layered = 0x80000
}
public enum LWA
{
ColorKey = 0x1,
Alpha = 0x2
}
[DllImport("user32.dll", EntryPoint = "GetWindowLong")]
public static extern int GetWindowLong(IntPtr hWnd, GWL nIndex);
[DllImport("user32.dll", EntryPoint = "SetWindowLong")]
public static extern int SetWindowLong(IntPtr hWnd, GWL nIndex, int dwNewLong);
[DllImport("user32.dll", EntryPoint = "SetLayeredWindowAttributes")]
public static extern bool SetLayeredWindowAttributes(IntPtr hWnd, int crKey, byte alpha, LWA dwFlags);
protected override void OnShown(EventArgs e)
{
base.OnShown(e);
int wl = GetWindowLong(this.Handle, GWL.ExStyle);
wl = wl | 0x80000 | 0x20;
SetWindowLong(this.Handle, GWL.ExStyle, wl);
SetLayeredWindowAttributes(this.Handle, 0, 128, LWA.Alpha);
}
но он также был скопирован откуда-то еще. Важные строки здесь - в методе OnShown
. Хотя я должен признать, что линия
wl = wl | 0x80000 | 0x20;
немного загадочно, он устанавливает расширенные стили WS_EX_LAYERED и WS_EX_TRANSPARENT.
Возможно, вы также можете установить его как
wl = wl | WS_EX.Layered | WS_EX.Transparent;