如果我JFrame通过单击Windows WindowDecoration的最小化按钮并通过Alt-Tabbing最小化它或在Windows任务栏中单击它来最小化Aero-snapped到屏幕左侧,那么框架将正确地恢复到左侧.好!
但是,如果我最小化帧
setExtendedState( getExtendedState() | Frame.ICONIFIED );
Run Code Online (Sandbox Code Playgroud)
并通过将鼠标悬停在Windows TaskBar上来查看预览,它会将框架显示错误的位置.通过Alt-Tabbing取消最小化或在Windows任务栏中单击它后,框架将在此错误的位置和大小恢复.帧边界是"未绑定"值,如果您将帧拖离ScreenBorder,Windows通常会记住恢复该值.
Bug的屏幕录制:
我的结论是,Java不了解AeroSnap并向Windows提供了错误的界限.(例如,Toolkit.getDefaultToolkit().isFrameStateSupported( Frame.MAXIMIZED_VERT ) );返回false.)
这是我对bug的修复:
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Point;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
/**
* Fix for the "Frame does not know the AeroSnap feature of Windows"-Bug.
*
* @author bobndrew 20160106
*/
public class SwingFrameStateWindowsAeroSnapBug extends JFrame
{
Point location = null;
Dimension size = null;
public SwingFrameStateWindowsAeroSnapBug( final String title )
{
super( title ); …Run Code Online (Sandbox Code Playgroud) 假设我有一个窗口,我想在窗口关闭时保存它的位置,并在窗口再次打开时恢复它.执行此操作的典型方法是调用GetWindowPlacement/SetWindowPlacement.这需要记住位置和最大化/最小化状态.
在Windows 7上,您可以使用"Aero Snap"功能将窗口停靠在屏幕的一侧.我的问题是如何保存和恢复已被"捕捉"的窗口,以便您可以恢复"快照"状态.GetWindowPlacement/SetWindowPlacement没有解决这个问题(据我所知),我还没有在Windows 7中看到任何"Snap"API.
这里有一个类似的问题 如何检测窗口是否被Windows7调整大小,但在这种情况下,似乎OP只是想要恢复位置,而不是"Snap"状态.
几个星期前我开始使用gVim.从早期开始,我注意到在执行某些操作时,完整的gVim窗口会有一些奇怪的大小调整.我认为这与我使用Windows Aero Snap(在Windows 7 x64系统上)有关.
重现的步骤(使用空.vimrc文件,vimfiles重命名我的文件夹):
:tabe结果: gVim在屏幕上重新定位自己.所以我必须使用win+ 重新定位它left arrow.很烦人.
我与其他标签和窗口行动一样好,如::vnew,C-W o,...
有人为什么会发生这种情况,以及我能做些什么来修复它?我已经清空了我的.vimrc文件并暂时重命名了我的〜/ vimfiles文件夹以排除任何插件的干扰.
编辑:根据马修的回复和信息:help bugs,我发送了一个错误报告(实际上这篇文章)bugs@vim.org
我有一个问题,Aero Snap没有使用我正在处理的应用程序(Windows桌面,本机C++应用程序),我对发生的事情感到有点困惑,因为它看起来应该只是起作用,框.
我在mininal win32应用程序上使用了Spy ++,并在按下Win-Left时收到以下消息:
<00070> 00030D1C P WM_KEYDOWN nVirtKey:VK_LWIN cRepeat:1 ScanCode:5B fRepeat:0 fUp:0 <00071> 00030D1C P WM_KEYDOWN nVirtKey:VK_LWIN cRepeat:1 ScanCode:5B fRepeat:1 fUp:0 <00072> 00030D1C P WM_KEYDOWN nVirtKey: VK_LWIN c重复:1 ScanCode:5B f重复:1 fUp:0 <00088> 00030D1C S WM_GETMINMAXINFO lpmmi:0043FCBC
<00089> 00030D1C R WM_GETMINMAXINFO lpmmi:0043FCBC
<00090> 00030D1C S WM_WINDOWPOSCHANGING lpwp:0043FCC4
<00091> 00030D1C S WM_GETMINMAXINFO lpmmi:0043F8E8
< 00092> 00030D1C R WM_GETMINMAXINFO lpmmi:0043F8E8
<00093> 00030D1C R WM_WINDOWPOSCHANGING
..等等
所以我可以看到左键的WM_KEYDOWN没有到达应用程序,但我得到了aero snap"resize window"的东西.
当我Spy ++我的应用程序时,我可以看到左键没有被"拦截",而是被传递给应用程序,所以我没有得到任何抢购的善.
<00043> 000F0F12 P WM_KEYDOWN nVirtKey:VK_LWIN cRepeat:1 ScanCode:5B fRepeat:0 fUp:0
<00044> 000F0F12 …
如何使用Aero Snap功能查明窗口是否已调整大小?GetWindowPlacementfunction提供最新的"恢复"窗口大小.我用它如下:
WINDOWPLACEMENT wp = {};
wp.length = sizeof(WINDOWPLACEMENT);
::GetWindowPlacement( hWnd, &wp );
Run Code Online (Sandbox Code Playgroud)
例如,wp.rcNormalPosition = {top=208 bottom=520 left=152 right=510}它应该是
什么时候给出的{top=0 bottom=1920 left=152 right=510}.
请注意,这是我的错,GetWindowRect给出完全相同的错误结果.GetWindowRect给出了正确的结果.
我需要在程序出口保存窗口状态并在启动时加载它,所以我需要知道如何放置窗口.如何找出实际的窗口坐标?
好吧,我用notepad.exe(以及一些其他标准的Windows组件)进行了几次测试,并以同样的方式保存其状态 - 它不记得它是否"被抢购".所以我认为这是Windows程序的预期行为.
我正在尝试在Qt中创建Metro风格的界面,这意味着不使用Windows 7 Aero边框.我已经将窗口设置为无边框,并添加了使其可拖动的代码以及使其最小化,最大化和关闭的按钮.但是,Aero Snap不起作用.
我知道这是可能的,因为Visual Studio 2012,MS Word 2013和Steam都有Aero Snap的无边界窗口.
如何将Aero Snap实现为无边框Qt应用程序?谢谢.
这应该是一个简单的问题,但是search-foo让我失望了.我的目标是检测我是在Aero(Vista或Windows 7)下运行并默认使用我的应用程序Aerosnap.(事实证明,我写的一个公司应用程序是由几乎所有人正确运行的,他们的Outlook向左拍摄.)
该应用程序是WinForms,我目前正在做
Width = Screen.PrimaryScreen.WorkingArea.Size.Width / 2;
Height = Screen.PrimaryScreen.WorkingArea.Size.Height;
Top = Screen.PrimaryScreen.WorkingArea.Top;
Left = Screen.PrimaryScreen.WorkingArea.Left +
Screen.PrimaryScreen.WorkingArea.Size.Width / 2;
Run Code Online (Sandbox Code Playgroud)
在我的表单的加载事件中.这很好用,除非他们使用WindowKey + Arrow,它就好像它只是一个正常位置的形式.这意味着WindowKey + Right在第一次按下时不执行任何操作,并且WindowKey + Left向左按下.这不是一个主要问题,但我更愿意,如果我可以指定一个窗口大小然后将应用程序捕捉到右侧,那么这些键的行为与任何其他应用程序一样.
我不确定这是可能的,以下是我找到的东西:
这些似乎表明没有可用的特殊AeroSnap消息.有人知道吗?
有没有办法针对特定的窗口/窗口ID使用C或C ++以编程方式调用Aera最大化效果?
例如:

要么

(来源:thebuzzmedia.com)
我正在使用无边界的Qt窗口,并且Qt具有用于获取窗口ID的API。我想以编程方式触发没有已知触发器的Windows效果。
我有一个简单的问题.如何从我的C#代码以编程方式访问aero snap.就像,如果我单击"Snap Left"按钮,我希望我的程序窗口向左侧拍摄,就像它手动放在那里的药物一样.我看起来都是如此,但所有的问题似乎都是关于aero snap不使用表单,并防止它捕捉表单.不是以编程方式捕捉表单.我很高兴使用interloping.谢谢