Мне удалось найти правильное решение этой проблемы, после того, как я очень глубоко в нее заглянул. Оказывается, при правильных вызовах Win32 API можно задать форму «Невидимый» для щелчков мышью. Это может быть достигнуто путем:
[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 миллисекунд и анализирующий положение курсора. Если он находится над областью, которую я хочу, он установит для формы значение Normal с помощью SetFormNormal (), в противном случае он будет прозрачным.
Надеюсь, этот бит кода поможет, и люди будут его использовать.