[英]Topmost transparent clickable through form with clickable through controls C#
我在透明表單上使用GDI繪制了一些矩形。
表單是全屏的,並且始終位於最上面。 另外,可以使用以下方法單擊它:最上面的表單,單擊“通過”是否可行?
但是,繪制的矩形像我的窗體一樣無法單擊,並且每次單擊它們時應用程序都會失去焦點。 另外,當我將鼠標懸停在它們上面時,我可以看到我的應用程序光標(窗體下方的窗口是一個游戲,因此具有自定義光標)。
您能告訴我如何使所有控件都無法集中顯示和單擊嗎? 有可能還是我必須使用DirectX繪圖之類的東西?
我搜索了整個Web和stackoverflow,使用了各種解決方案,但沒有任何效果。
謝謝。
我不確定我是否完全理解您要完成的任務,但是,如果您希望創建一個可以接收鼠標點擊但不會“竊取”焦點的控件,則很有可能:
public class Box : Control
{
public Box()
{
// Prevent mouse clicks from 'stealing' focus:
TabStop = false;
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
DrawText(e.Graphics);
}
// Display control text so we know what the button does:
private void DrawText(Graphics graphics)
{
using (var brush = new SolidBrush(this.ForeColor))
{
graphics.DrawString(
this.Text, this.Font, brush,
new PointF()
{
X = ((float)this.Width / 2f),
Y = (((float)this.Height / 2f) - (this.Font.GetHeight(graphics) / 2f))
},
new StringFormat()
{
Alignment = StringAlignment.Center
});
}
}
}
這個簡單的控件將顯示為矩形,它仍然能夠接收鼠標點擊和觸發點擊事件,但是不會從窗體上的其他控件(也不是窗體本身)上搶走焦點。
將表單上的透明鍵設置為其背景色將使表單的其余部分不可見,從而僅顯示矩形“按鈕”。 這也可以用組合Opacity
屬性,以使所顯示半透明的,但正好為零的不透明度形式不會用鼠標(由Windows設計)進行交互。
僅將窗體的TopMost
屬性設置為true可能不足以將窗口保持在所有其他窗口的頂部。 首次創建表單時,您可能需要在表單中進行以下API調用( 例如 ,放置在構造函數中, OnLoad
事件等 ):
SetWindowPos(this.Handle, HWND_TOPMOST, 0, 0, 0, 0, (SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW));
關於此功能的MSDN文檔可以在這里找到。
為了進行此調用,您將需要在窗體類中添加以下Windows API聲明:
[DllImport("user32.dll")]
static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
並添加以下常量:
private const int SWP_NOMOVE = 0x0002;
private const int SWP_NOSIZE = 0x0001;
private const int SWP_SHOWWINDOW = 0x0040;
private static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);
我希望這有幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.