首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实现透镜放大放大Windows任务栏

实现透镜放大放大Windows任务栏
EN

Stack Overflow用户
提问于 2020-07-27 08:28:32
回答 1查看 274关注 0票数 0

我希望能够在窗口任务栏的顶部执行镜头壮丽。到目前为止,我没有成功地实现这个功能,因为任务栏总是会在我的窗口顶部打开。Windows内置放大镜能够做到这一点,所以我希望它确实是可能的。

我附上了两个屏幕截图,显示Windows内置放大镜,以及它如何放大任务栏,以及我的应用程序如何在任务栏下面呈现。

内置窗口放大镜:

我的申请:

是否有任何方法使我的应用程序呈现在任务栏之上,从而放大任务栏?

代码语言:javascript
复制
<Window x:Class="WpfNativeTesting.MagnificationWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfNativeTesting"
        mc:Ignorable="d"
        Title="MagnificationWindow"
        
        Height="400"
        Width="400"
        
        WindowStyle="None"
        ResizeMode="NoResize"
        AllowsTransparency="true"
        ShowInTaskbar="False"
        Topmost="True">
    <Grid x:Name="ContainerGrid">
        <Grid x:Name="MagnificationGrid" />
    </Grid>
</Window>
代码语言:javascript
复制
public partial class MagnificationWindow : Window
    {
        private IntPtr HWnd;
        private IntPtr HWndMag;
        private bool MagnificationInitialized = false;
        private DispatcherTimer Timer = new DispatcherTimer();
        private RECT MagWindowRect = new RECT();
        private bool IsColorEffectSet = false;

        private float magnification = 1.0f;
        public float Magnification
        {
            get { return magnification; }
            set
            {
                if (value < 1.0f)
                {
                    value = 1.0f;
                }

                if (HWndMag != null)
                {
                    if (magnification != value)
                    {
                        magnification = value;

                        Transformation matrix = new Transformation(magnification);
                        NativeMethods.MagSetWindowTransform(HWndMag, ref matrix);
                    }
                }
            }
        }

        public MagnificationWindow()
        {
            InitializeComponent();

            Loaded += MagnificationWindow_Loaded;

            Show();
        }

        private void MagnificationWindow_Loaded(object sender, RoutedEventArgs e)
        {
            HWnd = new WindowInteropHelper(this).Handle;

            var exStyle = NativeMethods.GetWindowLong(HWnd, NativeMethods.GWL_EXSTYLE);
            exStyle |= (int)ExtendedWindowStyles.WS_EX_TOPMOST | (int)ExtendedWindowStyles.WS_EX_LAYERED | (int)ExtendedWindowStyles.WS_EX_TRANSPARENT;
            NativeMethods.SetWindowLong(HWnd, NativeMethods.GWL_EXSTYLE, exStyle);

            var style = NativeMethods.GetWindowLong(HWnd, NativeMethods.GWL_STYLE);
            style |= (int)WindowStyles.WS_CAPTION | (int)WindowStyles.WS_SYSMENU;
            NativeMethods.SetWindowLong(HWnd, NativeMethods.GWL_STYLE, exStyle);

            MagnificationInitialized = NativeMethods.MagInitialize();

            if (MagnificationInitialized)
            {
                SetupMagnifier();

                Timer.Interval = TimeSpan.FromMilliseconds(NativeMethods.USER_TIMER_MINIMUM);
                Timer.Tick += Timer_Tick;
                Timer.Start();
            }
        }

        protected override void OnClosing(CancelEventArgs e)
        {
            base.OnClosing(e);

            RemoveMagnifier();
        }

        private void Timer_Tick(object sender, EventArgs e)
        {
            UpdateMaginifier();
        }


        private void SetupMagnifier()
        {
            var hInst = NativeMethods.GetModuleHandle(null);

            NativeMethods.GetClientRect(HWnd, ref MagWindowRect);

            HWndMag = NativeMethods.CreateWindow((int)ExtendedWindowStyles.WS_EX_STATICEDGE, NativeMethods.WC_MAGNIFIER,
                    "MagnificationWindow", (int)WindowStyles.WS_CHILD | (int)MagnifierStyle.MS_SHOWMAGNIFIEDCURSOR | (int)WindowStyles.WS_VISIBLE,
                    MagWindowRect.left, MagWindowRect.top, MagWindowRect.right, MagWindowRect.bottom, HWnd, IntPtr.Zero, hInst, IntPtr.Zero);

            NativeMethods.MagShowSystemCursor(false);

            if (HWndMag == IntPtr.Zero)
            {
                return;
            }

            var matrix = new Transformation(Magnification);
            NativeMethods.MagSetWindowTransform(HWndMag, ref matrix);
        }

        private void UpdateMaginifier()
        {
            if (!MagnificationInitialized || HWndMag == IntPtr.Zero)
            {
                return;
            }

            POINT mousePoint = new POINT();
            RECT sourceRect = new RECT();

            NativeMethods.GetCursorPos(ref mousePoint);

            int width = (int)((MagWindowRect.right - MagWindowRect.left) / Magnification);
            int height = (int)((MagWindowRect.bottom - MagWindowRect.top) / Magnification);

            sourceRect.left = mousePoint.x - width / 2;
            sourceRect.top = mousePoint.y - height / 2;

            NativeMethods.MagSetWindowSource(HWndMag, sourceRect);

            POINT mouse = new POINT();
            NativeMethods.GetCursorPos(ref mouse);

            NativeMethods.SetWindowPos(HWnd, NativeMethods.HWND_TOPMOST, mouse.x - (int)(magnification * width / 2), mouse.y - (int)(magnification * height / 2), width, height, 
                (int)SetWindowPosFlags.SWP_NOACTIVATE | 
                (int)SetWindowPosFlags.SWP_NOSIZE);

            NativeMethods.InvalidateRect(HWndMag, IntPtr.Zero, true);
        }

        public void RemoveMagnifier()
        {
            if (MagnificationInitialized)
            {
                NativeMethods.MagUninitialize();

                MagnificationInitialized = false;
            }
        }    
    
        // ...
   }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-31 14:04:04

我在微软的Q/A论坛上发布了这个问题,并找到了一个解决方案,使其发挥作用。

https://learn.microsoft.com/en-us/answers/questions/54196/magnifier-control-unable-to-magnify-the-taskbar-st.html

我们需要通过在清单中设置uiAcess=true,对可执行文件进行签名,并将其放置在安全的位置(例如程序文件),使其成为一个可访问性应用程序,如下所述:

  1. 将清单中的uiAccess=true设置为在Visual中设置此选项,方法是将Linker \ manifest文件\ UAC保护设置为Yes

在可执行文件(参见https://learn.microsoft.com/en-us/previous-versions/bb756995(v=msdn.10) )上签名的

https://learn.microsoft.com/en-us/windows/security/threat-protection/security-policy-settings/user-account-control-only-elevate-uiaccess-applications-that-are-installed-in-secure-locations

  1. 将其置于安全位置(请参阅
    1. )

在对应用程序进行签名之前,我将其放置在一个安全位置,并使用以下命令创建证书并对应用程序进行签名。

makecert /n "CN=Company,O=Company,C=SE“/r /pe /h 0 /eku”1.3.6.1.5.7.3.3,1.6.1.4.311.10.3.13“/e 01/01/2021 /sv Company.cer Pvk2Pfx /pvk Company.pvk /pi /n 20”密码“”密码“

最后

签名工具签署/f "Company.pfx“/p密码"application".exe

就这样!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63111438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档