ObjectiveC辅助功能API:UnMaximize Window

时间:2018-06-14 14:50:11

标签: objective-c cocoa accessibility accessibility-api

我不确定我是否正确引用了这个,但当我使用“ UnMaximize ”这个词时,我指的是:

  

单击绿色按钮时,左上角是第三个绿色按钮   Chrome窗口,它最大化窗口。当我用这个词的时候   上面的“ UnMaximize ”,我指的是点击该行为的行为   再次按钮,使其不再全屏显示。

(顺便说一下,MacOS术语中的正确用法是什么?)

我喜欢使用Easy Move+Resize App。虽然它可以移动Windows,但不幸的是,它对最大化的窗口没有影响。幸运的是,代码可以在Github上找到。

我很好奇是否有人可以指出如何使用辅助功能API取消对窗口的简化

UnMaximize与kAXCloseButtonAttribute

等同的是什么

如果有帮助,我正在使用MacOs 10.12。

1 个答案:

答案 0 :(得分:0)

我感谢 @Willeke-Willeke 为我指明了正确的方向。

正如我在问题中提到的,我正在查看Easy Move+Resize AppGitHub的代码。此代码/应用程序的问题在于,它不适用于当前已最大化的Windows,即它尝试移动这些Windows,但不能移动,因为它们已修复。 注意:该功能仅在多显示器设置中有用,并且与之相关。)此应用程序适用于未最大化的Windows。

在这里,我试图添加将取消最大化窗口以便移动它的代码,然后在其移动后再次最大化它。显然,下面的代码是在此应用程序的上下文中使用的,但我相信在其他上下文中对用户有用。

我首先向 EMRMoveResize.h

添加了一个wasMaximized属性
//EMRMoveResize.h
@property bool wasMaximized;

接下来,我移到 EMRAppDelegate.m ,其中是实际的事件回调代码。请注意,我们仅关注移动,即仅关注鼠标左键(此应用使用鼠标右键进行大小调整,当窗口最大化时不会使用。)因此,我们只关心kCGEventLeftMouseDownkCGEventLeftMouseDragged,最后加上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 的专家,因此,如果您觉得可以改进,请随时编辑此文章。