全部,
我只是想做一个可以覆盖所有屏幕并且无法获得焦点的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
在我的电脑屏幕上显示 a,尤其是在低视角观看时,我可以更清楚地看到图像。那太甜了。
正如托菲所说
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-forms,它们将覆盖最后一个。
myForm.TopMost = True;
如果您不希望窗口让点击通过,您可能需要点击 GDI+ 或 DX。
但是您也可以尝试使用SetWindowLongPtr函数来设置窗口的属性。这是一个似乎已经完成了您所追求的人的链接。