3 votes

JXA JavaScript pour l'automatisation Comment faire en sorte que JXA clique sur quelque chose ?

Quel est l'équivalent en JXA de

--AppleScript
    tell application ("System Events")
        click at(x,y)
    end tell

3voto

OnePablo Points 1

Dans JXA, il apparaît que le click() doit être envoyée à un élément spécifique de l'interface utilisateur (qui peut être un processus d'application), alors que ce n'est pas le cas dans AppleScript.

(()=>{
    return clickAt('Safari', [60, 44]);
})();

// {x, y} relative to screen's top-left
function clickAt(appName, [x, y]) {
    const sys = Application('System Events');
    const proc = sys.processes[appName];
    if (!proc.exists()) return -1;

    return proc.click({ at: [x, y] });
}

Comme vous le savez probablement, cette Événements du système est un clic simulé, qui détecte simplement un élément de l'interface utilisateur aux coordonnées spécifiées, appartenant au processus spécifié (indépendamment de l'obscurcissement de la fenêtre, c'est-à-dire que les applications à l'arrière, hors de vue, répondront à la commande), et si cet élément reconnaît une action de clic (typiquement si son actions contiennent un nommé AXPress ), alors l'action est déclenchée. Il ne s'agit donc pas d'un véritable événement de clic de souris traité par le système.

Mais, étant donné que vous travaillez en JXA, vous pouvez éventuellement bénéficier de sa passerelle Objective-C étendue :

(()=>{
    mouseclick();       // Clicks at mouse location
    mouseclick(35, 60); // Clicks at coordinates {35, 60}
                        // relative to top-left of screen
})();

function mouseclick(x = null, y = null) {
    ObjC.import('Cocoa');
    const nil = $();

    const mouseLoc = $.NSEvent.mouseLocation;
    const screenH = $.NSScreen.mainScreen.frame.size.height;
    mouseLoc.y = screenH - mouseLoc.y;
    var coords = mouseLoc;

    if (x && y) coords = {x: x, y: y};

    var mousedownevent = $.CGEventCreateMouseEvent(nil, 
                                $.kCGEventLeftMouseDown,
                                coords,
                                nil);

    var mouseupevent = $.CGEventCreateMouseEvent(nil, 
                            $.kCGEventLeftMouseUp,
                            coords,
                            nil);

    $.CGEventPost($.kCGHIDEventTap, mousedownevent);
    $.CGEventPost($.kCGHIDEventTap, mouseupevent);
    $.CFRelease(mousedownevent);
    $.CFRelease(mouseupevent);
}

Ce site mouseclick() envoie un événement réel qui sera traité comme s'il avait été généré par un clic physique sur la souris. Ainsi, comme on peut s'y attendre, un clic de souris ne pénètre pas dans les fenêtres obscures de l'application arrière ; il agit sur ce que vous voyez dans un paysage de pixels en 2D.

1voto

grg Points 181593
Application("System Events")
  .applicationProcesses.whose({frontmost: true}).at(0)
  .click({ at: [x, y] })

click est effectué sur un UIElement, donc nous en obtenons un, puis nous appelons click avec cela.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X