winform没有得到焦点

本文关键字:焦点 winform | 更新日期: 2023-09-27 18:21:40

all,

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

任何想法。谢谢大家!

winform没有得到焦点

我想这就是你想要的:

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,尤其是在低视角下观看时,我可以更清楚地看到图像。太甜蜜了。

如上所述

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();
  }

这样,如果辅助窗体获得焦点,它就会将其传递给主窗体

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

myForm.TopMost=真;

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

但是,您也可以尝试使用SetWindowLongPtr函数来设置窗口的属性。这里有一个链接,指向一个似乎做了你所追求的事情的人。