-1

全部,

我只是想做一个可以覆盖所有屏幕并且无法获得焦点的winform。但它仍然保持在屏幕的顶部。这意味着用户还可以使用这个最顶层的 winform 进行其他操作。

任何想法。感谢大家!

4

3 回答 3

0

我认为这就是你想要的:

public class Form1 : Form {
  [DllImport("user32")]
  private static extern bool SetLayeredWindowAttributes(IntPtr hwnd, int crKey, byte alpha, int flags);
  public Form1(){
     InitializeComponent();
     Load += (s,e) => {
       TopMost = true;
       FormBorderStyle = FormBorderStyle.None;
       WindowState = FormWindowState.Maximized;
       ShowInTaskbar = false;
       SetOpacity(50);//try this to see it in action :)
     };
  }
  protected override CreateParams CreateParams {
      get {
           CreateParams cp = base.CreateParams;
           cp.ExStyle |= 0x20 | 0x80000;   // WS_EX_TRANSPARENT and WS_EX_LAYERED
           return cp;
      }
  }
  //This is called to set your form opacity, by default (after applying above ex-styles) the opacity is 0.
  public void SetOpacity(byte opacity){
      SetLayeredWindowAttributes(Handle, 0, opacity, 0x2);//LWA_ALPHA = 0x2
  }
  public void DecorateForm(){
     //Your code to decorate form...
  }
}

上面的代码是创建某种形式的Click through表单,该表单不是交互式的,但可以在其他窗口之上显示所有内容,而不会阻止用户与它们交互。我正在使用这种技术faded image of my love在我的电脑屏幕上显示 a,尤其是在低视角观看时,我可以更清楚地看到图像。那太甜了。

于 2013-07-09T08:00:40.863 回答
0

正如托菲所说

public Form1()
  {
     InitializeComponent();
     TopMost = true;
  }

将表单保持在顶部。为了你可以的焦点

private Form masterForm;
  public Form2(Form master)
  {
     masterForm = master;
     InitializeComponent();
     GotFocus += new EventHandler(Form2_GotFocus);
  }

  void Form2_GotFocus(object sender, EventArgs e)
  {
     masterForm.Focus();
  }

这样,如果辅助表单获得焦点,它将把它交给主表单

于 2013-07-09T06:42:47.540 回答
0

将表单的 TopMost 属性设置为 true。即使其他窗体或窗口具有焦点,这也会使窗体保持在顶部。如果创建了新的 TopMost-forms,它们将覆盖最后一个。

myForm.TopMost = True;

如果您不希望窗口让点击通过,您可能需要点击 GDI+ 或 DX。

但是您也可以尝试使用SetWindowLongPtr函数来设置窗口的属性。这是一个似乎已经完成了您所追求的人的链接。

于 2013-07-09T06:17:47.860 回答