上下文:我正在开发一个WPF应用程序,用户经常需要从其他程序手动转录数据。没有双显示器,这涉及很多Alt-tabbing。
我认为在Visual Studio中提供与工具提示相同的功能会非常好 - 您可以点击 Ctrl 使它们略微透明。
我遇到的“问题”是,您只能(有用)使用透明度,如果您的窗口AllowsTransparency
,那么只有WindowStyle = None
才有可能。我真的不想在我的应用程序中重新创建标题栏等所有复杂功能。
有没有合适的选择?
答案 0 :(得分:2)
使用一点Win32 Interop,您可以获得窗口的HWND并使用CreateRgn并为窗口定义剪切区域,这将根据需要呈现窗口的任何部分“透视”。它还将修改命中测试,因此,窗口不仅“透视”,而且还“点击”。
以下是我的一个宠物项目中的一些内容,这消除了窗口的客户区域。这里的一些代码可能是特定于WPF的,但最终这里显示的Win32 API自90年代初以来一直存在。
[DllImport("gdi32.dll")]
internal static extern IntPtr CreateRectRgnIndirect([In] ref Mubox.Win32.Windows.RECT lprc);
[DllImport("gdi32.dll")]
internal static extern IntPtr CreateRectRgn(int nLeftRect, int nTopRect, int nRightRect, int nBottomRect);
[DllImport("user32.dll")]
internal static extern int SetWindowRgn(IntPtr hWnd, IntPtr hRgn, bool bRedraw);
[DllImport("gdi32.dll")]
internal static extern int CombineRgn(IntPtr hrgnDest, IntPtr hrgnSrc1, IntPtr hrgnSrc2, CombineRgnStyles fnCombineMode);
public enum CombineRgnStyles : int
{
RGN_AND = 1,
RGN_OR = 2,
RGN_XOR = 3,
RGN_DIFF = 4,
RGN_COPY = 5,
RGN_MIN = RGN_AND,
RGN_MAX = RGN_COPY
}
#endregion
IntPtr windowRegion = Control.Windows.CreateRectRgn(0, 0, parkingWindowRect.Width, parkingWindowRect.Height);
Mubox.Win32.Windows.RECT clipRect = new Mubox.Win32.Windows.RECT();
Mubox.Win32.Windows.GetClientRect(this.Handle, out clipRect);
clipRect.Left = (parkingWindowRect.Width - clipRect.Width) / 2;
clipRect.Right += clipRect.Left;
clipRect.Top = (parkingWindowRect.Height - clipRect.Height) - clipRect.Left;
clipRect.Bottom = parkingWindowRect.Height - clipRect.Left;
IntPtr clipRegion = Control.Windows.CreateRectRgnIndirect(ref clipRect);
Control.Windows.CombineRgn(windowRegion, windowRegion, clipRegion, Windows.CombineRgnStyles.RGN_XOR);
Control.Windows.DeleteObject(clipRegion);
Control.Windows.SetWindowRgn(this.Handle, windowRegion, true);