2016-10-04 3 views
5

Я проектирую окно, которое всегда находится на экране и около 20% непрозрачного. Он разработан как своеобразное окно состояния, поэтому оно всегда сверху, но я хочу, чтобы люди могли щелкнуть по окну любому другому приложению ниже. Вот непрозрачное окно сидит на вершине этого SO поста как я печатаю прямо сейчас:Windows Forms: прохождение кликов через частично прозрачное окно всегда сверху.

Example

Смотрите, что серую полосу? Это помешало бы мне вводить в поле тегов в данный момент.

+1

Не возможно с WinForms. –

+0

У вас есть доказательства, подтверждающие этот ответ? Я считаю, что трудно поверить ... –

+1

Поверьте. Мои «доказательства» - это более чем десятилетний опыт использования форм выигрыша. –

ответ

12

Вы можете сделать окно, щелкнув путем добавления WS_EX_LAYERED и WS_EX_TRANSPARENT стилей в свои расширенные стили. Кроме того, чтобы сделать его всегда на высоте установить его TopMost в true и сделать его полупрозрачным использовать подходящий Opacity значение:

using System; 
using System.Windows.Forms; 
using System.Runtime.InteropServices; 
public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
     this.Opacity = 0.5; 
     this.TopMost = true; 
    } 
    [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); 
    const int GWL_EXSTYLE = -20; 
    const int WS_EX_LAYERED = 0x80000; 
    const int WS_EX_TRANSPARENT = 0x20; 
    protected override void OnLoad(EventArgs e) 
    { 
     base.OnLoad(e); 
     var style = GetWindowLong(this.Handle, GWL_EXSTYLE); 
     SetWindowLong(this.Handle,GWL_EXSTYLE , style | WS_EX_LAYERED | WS_EX_TRANSPARENT); 
    } 
} 

Пример Результат

enter image description here

+0

@ rory.ap это похоже работает. Спасибо, Реза! –

+5

@SamWeaver - Просто доказывает, что вы всегда можете узнать новые вещи :) –

+1

Вы можете просто переопределить CreateParams и вместо этого установить ExStyle, используя P/Invoke. – TnTinMn