Как программно переместить / изменить размер окна из другого приложения? - PullRequest
3 голосов
/ 20 ноября 2010

Я знаю, что могу использовать Apple Event Object Model для перемещения и изменения размеров окон приложений Какао. Но что я могу использовать для приложений Carbon?

Ответы [ 3 ]

4 голосов
/ 21 ноября 2010

Питер был прав, вы можете получить доступ к границам любого окна, используя следующий AppleScript:

tell application "System Events"
    set allProcesses to application processes
    repeat with i from 1 to count allProcesses
        tell process i
            repeat with x from 1 to (count windows)
                position of window x
                size of window x
            end repeat
        end tell
    end repeat
end tell
2 голосов
/ 12 апреля 2019

Вы также можете использовать Accessibility API.Вот как я думаю, что это делает Optimal Layout.

Сначала убедитесь, что у вашего приложения есть разрешение на его использование.

BOOL checkForAccessibility()
{
    NSDictionary *options = @{(__bridge id) kAXTrustedCheckOptionPrompt : @YES};
    return AXIsProcessTrustedWithOptions((__bridge CFDictionaryRef) options);
}

Затем используйте NSWorkspace :: RunningApplications, чтобы получитьPID приложения, окном которого вы хотите манипулировать.

NSArray<NSRunningApplication *> *runningApps =[[NSWorkspace sharedWorkspace] runningApplications];
for( NSRunningApplication *app in runningApps )
{
    if( [app bundleIdentifier] != nil && [[app bundleIdentifier] compare:@"IdentifierOfAppYouWantToFindHere"] == 0 )
    {
        PID = [app processIdentifier];
    }
}

Затем используйте PID, чтобы получить доступ к ссылке в главном окне, используя Accessibility API.

AXUIElementRef app = AXUIElementCreateApplication( PID );
AXUIElementRef win;
AXError error = AXUIElementCopyAttributeValue( app, kAXMainWindowAttribute, ( CFTypeRef* )&win );
while( error != kAXErrorSuccess )   // wait for it... wait for it.... YaY found me a window! waiting while program loads.
    error = AXUIElementCopyAttributeValue( app, kAXMainWindowAttribute, ( CFTypeRef* )&win );

Теперь вы можете установить размер и положение, используя что-то вроде этого:

CGSize windowSize;
CGPoint windowPosition;
windowSize.width = width;
windowSize.height = height;
windowPosition.x = x;
windowPosition.y = y;
AXValueRef temp = AXValueCreate( kAXValueCGSizeType, &windowSize );
AXUIElementSetAttributeValue( win, kAXSizeAttribute, temp );
temp = AXValueCreate( kAXValueCGPointType, &windowPosition );
AXUIElementSetAttributeValue( win, kAXPositionAttribute, temp );
CFRelease( temp );
CFRelease( win );
1 голос
/ 20 ноября 2010

То же самое. Вы можете использовать Apple Events в любом приложении с поддержкой сценариев, а события Apple и сценарии намного старше, чем Carbon.

...