我不确定我是否正确引用了这个,但当我使用“ UnMaximize ”这个词时,我指的是:
单击绿色按钮时,左上角是第三个绿色按钮 Chrome窗口,它最大化窗口。当我用这个词的时候 上面的“ UnMaximize ”,我指的是点击该行为的行为 再次按钮,使其不再全屏显示。
(顺便说一下,MacOS术语中的正确用法是什么?)
我喜欢使用Easy Move+Resize App。虽然它可以移动Windows,但不幸的是,它对最大化的窗口没有影响。幸运的是,代码可以在Github上找到。
我很好奇是否有人可以指出如何使用辅助功能API取消对窗口的简化
UnMaximize与kAXCloseButtonAttribute
如果有帮助,我正在使用MacOs 10.12。
答案 0 :(得分:0)
我感谢 @Willeke-Willeke 为我指明了正确的方向。
正如我在问题中提到的,我正在查看Easy Move+Resize App上GitHub的代码。此代码/应用程序的问题在于,它不适用于当前已最大化的Windows,即它尝试移动这些Windows,但不能移动,因为它们已修复。 (注意:该功能仅在多显示器设置中有用,并且与之相关。)此应用程序适用于未最大化的Windows。
在这里,我试图添加将取消最大化窗口以便移动它的代码,然后在其移动后再次最大化它。显然,下面的代码是在此应用程序的上下文中使用的,但我相信在其他上下文中对用户有用。
我首先向 EMRMoveResize.h
添加了一个wasMaximized
属性
//EMRMoveResize.h
@property bool wasMaximized;
接下来,我移到 EMRAppDelegate.m ,其中是实际的事件回调代码。请注意,我们仅关注移动,即仅关注鼠标左键。 (此应用使用鼠标右键进行大小调整,当窗口最大化时不会使用。)因此,我们只关心kCGEventLeftMouseDown
, kCGEventLeftMouseDragged
,最后加上kCGEventLeftMouseUp
。用伪代码,我做了类似的事情:
If (LeftMouseDown) {
Find out if Window is Maximized
If (Window is Maximized) {
set the wasMaximized property
Click FullScreen Button to UnMaximize the Window in Order to Move it
}
现在窗口已未最大化,将与 LeftMouseDragged 事件中的其他窗口一样移动,但我尚未对其进行任何更改。最后,
If(LeftMouseUp) {
If(wasMaximized value was set) {
Click FullScreen Button again to Maximize the Window (Since it started out as Maximized)
Reset the wasMaximized property
}
}
现在将代码段更改为 EMRAppDelegate.m
if (type == kCGEventLeftMouseDown
|| type == kCGEventRightMouseDown) {
//..
//Skipped Unchanged Code
//..
//Find out if Window is Maximized
CFTypeRef TypeRef = nil;
if (AXUIElementCopyAttributeValue((AXUIElementRef)_clickedWindow, CFSTR("AXFullScreen"), &TypeRef)) {
if(Debug) NSLog(@"Could not get wasMaximized Value");
} else {
[moveResize setWasMaximized: CFBooleanGetValue(TypeRef)];
if(Debug) NSLog(CFBooleanGetValue(TypeRef) ? @"Updated Maximized to True" : @"Updated Maximized to False");
}
//Click FullScreen Button to UnMaximize the Window in Order to Move it
if([moveResize wasMaximized]) {
AXUIElementRef buttonRef = nil;
AXUIElementCopyAttributeValue(_clickedWindow, kAXFullScreenButtonAttribute, (CFTypeRef*)&buttonRef);
if(Debug) NSLog(@"buttonRef: %p", buttonRef);
AXUIElementPerformAction(buttonRef, kAXPressAction);
CFRelease(buttonRef);
}
//..
//Skipped Unchanged Code
//..
}
if (type == kCGEventLeftMouseUp
|| type == kCGEventRightMouseUp) {
//..
//Skipped Unchanged Code
//..
//Click FullScreen Button again to Maximize the Window (Since it started out as Maximized)
AXUIElementRef _clickedWindow = [moveResize window];
if([moveResize wasMaximized]) {
AXUIElementRef buttonRef = nil;
AXUIElementCopyAttributeValue(_clickedWindow, kAXFullScreenButtonAttribute, (CFTypeRef*)&buttonRef);
if(Debug) NSLog(@"buttonRef: %p", buttonRef);
AXUIElementPerformAction(buttonRef, kAXPressAction);
CFRelease(buttonRef);
[moveResize setWasMaximized: false];
}
//..
//Skipped Unchanged Code
//..
}
这对我有用。但是我不是 Objective C 或 MacOS 的专家,因此,如果您觉得可以改进,请随时编辑此文章。