我一直在为此苦苦挣扎,并查看了几篇建议将其作为正确程序的 stackoverflow 帖子:
在我的代码中,我几乎完全遵循这种技术。然而,我的代码不起作用,我对为什么有点困惑。我想知道我是否使用了错误的程序?需要明确的是,我想要的效果是让用户单击我的表单并访问它下面的内容。例如,我在 Visual Studio 之上运行。如果我尝试单击该应用程序,我会改为单击 Visual Studio。
更新:
当我调用我的代码时,会发生以下两种情况之一(取决于我调用 setwindowlong 方法的位置):
- 窗口不绘制
- 窗口绘制,但可点击
选项 1 发生在我在 initializecomponent 之后立即运行代码时 选项 2 发生在我在 initializecomponent 之前运行它时
这是在其他任何事情之前绘制我的表单的完整代码:
[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 frmPhoneQueueViewer()
{
InitializeComponent();
// Set the form click-through
int initialStyle = GetWindowLong(this.Handle, -20);
SetWindowLong(this.Handle, -20, initialStyle | 0x80000 | 0x20);
//Get height of taskbar to exclude it, then bind to lower right of screen
int nTaskBarHeight = Screen.PrimaryScreen.Bounds.Bottom -Screen.PrimaryScreen.WorkingArea.Bottom;
Rectangle workingArea = Screen.GetWorkingArea(this);
this.Location = new Point(Screen.PrimaryScreen.Bounds.Right - this.Size.Width, workingArea.Bottom - Size.Height + nTaskBarHeight);
this.TopMost = true;
this.FormBorderStyle = FormBorderStyle.None;
this.ControlBox = false;
this.Text = string.Empty;
this.ShowInTaskbar = false;
PopulatePhoneQueueData();
}