有没有办法欺骗WPF应用程序认为它在某个DPI上运行?
我想在各种DPI级别(96,120,144,192)测试我的程序,而不更改系统设置(需要在Windows 7下注销/输入).
我可以手动设置1 DIU的大小吗?(在96 DPI时,1 DIU = 1像素.我想将1 DIU设置为1.25像素以模拟120 DPI.)
我的应用程序设计为位于系统托盘中,其行为类似于Windows 7中的网络/卷/电源/操作中心托盘项目(以及Windows Vista中的等效项目).也就是说,当单击托盘图标时它变为可见,并且当焦点丢失时变为隐藏.
该应用程序是用WPF编写的,但我目前正在使用WinForms的NotifyIcon作为托盘图标.
我想知道是否有人对如何确定应用程序托盘图标的位置(即屏幕坐标)有任何建议.默认的Windows Vista/7托盘项目有一些方法可以执行此操作,因为弹出窗口在相关托盘图标上方居中对齐.
在Vista中这不是一个问题:我将应用程序永久设置在右下角,这看起来很好(尽管没有任何逻辑包含任务栏没有放在屏幕底部的情况).但是,在Windows 7中,我的应用程序最终会遮挡新系统托盘弹出框,而不是像音量控件等一样悬停在它上面.
到目前为止,我在搜索中看到的最佳解决方案是处理NotifyIcon上的鼠标添加事件,并使用鼠标坐标来确定图标的位置.我认为如果除非有人有更好的想法,我最终会使用这种方法,尽管它并不理想,因为根据用户点击的图标内的位置,位置会略有不同.
有没有办法让WPF窗口透明而不会丢失非客户区域(边框,标题栏,关闭/最小化/最大化按钮)?
将"AllowTransparency"设置为"true"需要将"WindowStyle"设置为"None"(如本答案中所述),这将删除非客户区域.
其中一位WPF开发人员发表了关于透明窗口如何在WPF中工作的博客,以及为什么难以实现对非客户区域透明度的支持.
无论您的窗口样式如何建议,透明的WPF窗口都没有任何可见的非客户区域.这适用于许多场景,其目的是创建自定义窗口形状,但对于只想"淡入"普通窗口的人来说这可能很烦人.
因此,仅WPF解决方案似乎是不可能的.
调用本机SetLayeredWindowAttributes函数并传递WPF窗口的句柄和LWA_ALPHA没有效果,如预期的那样.
我能想到的唯一其他方法是在Win32(或可能是WinForms)窗口中托管WPF内容.但我怀疑试图这样做会导致空域问题.
WPF分层窗口在不同的操作系统上具有不同的功能...... WPF不支持透明度颜色键,因为WPF无法保证呈现您请求的确切颜色,特别是在渲染是硬件加速时.
我不确定我是否正确阅读上述内容,但听起来好像试图托管具有透明度的WPF内容是不可能的.
有任何想法吗?

为什么加null在HashSet没有抛出Exception,但添加null在TreeSet抛出异常。
Set<String> s = new TreeSet<String>();
s.add(null);
Run Code Online (Sandbox Code Playgroud)
抛出 NullPointerException
Set<String> s = new HashSet<String>();
Run Code Online (Sandbox Code Playgroud)
允许Null添加值。
wpf ×3
coordinates ×1
dpi ×1
hashset ×1
java ×1
notifyicon ×1
opacity ×1
position ×1
system-tray ×1
transparency ×1
treeset ×1