Có thể gõ phím các ký tự đặc biệt trong AppleScript không?


6

Con bọ:

Đối với một số ký tự và ký hiệu đặc biệt nhất định, AppleScript sẽ thất bại với keystrokeký tự thực tế và thay vào đó sẽ chỉ đơn giản là gõ chữ cái a.


Một ví dụ:

Mã AppleScript sau:

tell application "System Events" to keystroke "² ³ é ½ ₭"

nhập chuỗi văn bản sau (bất kể tôi đang sử dụng ứng dụng nào):

a a a a a

Cách giải quyết:

Người ta có thể "nhập" văn bản một cách hiệu quả bằng cách đặt các ký tự đặc biệt vào bảng tạm, sau đó dán bảng tạm, như vậy:

set the clipboard to "² ³ é ½ ₭"
tell application "System Events" to keystroke "v" using command down

Tôi tránh sử dụng phương pháp trên để đưa văn bản vào bảng tạm trong AppleScript, vì nó nhất thiết phải chuyển đổi bảng tạm thành văn bản có định dạng trong quá trình.

Tôi thích sử dụng phương pháp được cung cấp ở đây , để đảm bảo rằng văn bản đơn giản được đặt trên bảng tạm. Nhưng, phương pháp này chuyển đổi các ký tự đặc biệt thành mojibake.

Ví dụ: sử dụng cùng một chuỗi như trên, phương thức này sẽ đặt văn bản sau vào bảng tạm:

² ³ é ½ ₭

Tuy nhiên, bạn có thể giải thích thủ công vấn đề này bằng cách thêm một replace_charstuyên bố cho mỗi ký tự đặc biệt.


Câu hỏi:

Có cách nào để nhập các ký tự đặc biệt qua AppleScript mà không cần phải liên quan đến bảng tạm không?

Ví dụ, có cách nào để tôi có thể thêm các ký tự đặc biệt mong muốn vào "ngân hàng" hoặc tệp hệ thống ở đâu đó để System Eventsứng dụng quen thuộc với chúng không?


Câu trả lời:


7

Có thể với CoreGraphics ( CGEventPost), đó là API C (nó không hoạt động trong Cacao-AppleScript), nhưng có thể gọi một tệp thực thi từ AppleScript.


Đây là phương pháp để tạo tệp thực thi với Xcode (Phiên bản 8.3.3):

Bạn có thể tự làm điều đó (bạn có thể tải xuống Xcode từ App Store ) hoặc nhờ một người đáng tin cậy tạo ra tệp thực thi.

1- Mở Xcode, chọn menu " Tệp " -> " Mới " -> " Dự án ..." nhập mô tả hình ảnh ở đây


2- Chọn macOSCông cụ dòng lệnh , nhấp vào nút " Tiếp theo ". nhập mô tả hình ảnh ở đây


3- Đặt tên cho nó TypeCharacters, chọn Objective-C làm Ngôn ngữ, nhấp vào nút " Tiếp theo ". nhập mô tả hình ảnh ở đây


4- Lưu dự án vào thư mục mong muốn.


5- Trong cửa sổ Xcode, chọn main.mbiểu tượng, xóa văn bản trong cửa sổ và dán một trong hai mã sau:

Mã cần một vòng lặp vì một lỗi, CGEventKeyboardSetUnicodeString()phương thức cắt một chuỗi vượt quá hai mươi ký tự hoặc đó là một giới hạn (không được ghi lại).

Mã này sử dụng một vòng lặp để nhập danh sách các ký tự ở mỗi lần lặp, danh sách có thể chứa một đến hai mươi ký tự. (Thật nhanh, 1 giây để nhập 2400 ký tự trong tài liệu của TextEdit trên máy tính của tôi.)

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        if (argc > 1) {
            NSString *theString = [NSString stringWithUTF8String:argv[1]];
            NSUInteger len = [theString length];
            NSUInteger n, i = 0;
            CGEventRef keyEvent = CGEventCreateKeyboardEvent(nil, 0, true);
            unichar uChars[20];
            while (i < len) {
                n = i + 20;
                if (n>len){n=len;}
                [theString getCharacters:uChars range:NSMakeRange(i, n-i)];
                CGEventKeyboardSetUnicodeString(keyEvent, n-i, uChars);
                CGEventPost(kCGHIDEventTap, keyEvent); // key down
                CGEventSetType(keyEvent, kCGEventKeyUp);
                CGEventPost(kCGHIDEventTap, keyEvent); // key up (type 20 characters maximum)
                CGEventSetType(keyEvent, kCGEventKeyDown);
                i = n;
                [NSThread sleepForTimeInterval:0.004]; // wait 4/1000 of second, 0.002 it's OK on my computer, I use 0.004 to be safe, increase it If you still have issues
            }
            CFRelease(keyEvent);
        }
    }
    return 0;
}

Mã này sử dụng một vòng lặp để nhập một ký tự ở mỗi lần lặp (Nó chậm hơn mã đầu tiên).

#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        if (argc > 1) {
            NSString *theString = [NSString stringWithUTF8String:argv[1]];
            UniChar uChar;
            CGEventRef keyEvent = CGEventCreateKeyboardEvent(nil, 0, true);
            for (int i = 0; i < [theString length]; i++)
            {
                uChar = [theString characterAtIndex:i];
                CGEventKeyboardSetUnicodeString(keyEvent, 1, &uChar);
                CGEventPost(kCGHIDEventTap, keyEvent); // key down
                CGEventSetType(keyEvent, kCGEventKeyUp);
                CGEventPost(kCGHIDEventTap, keyEvent); // key up (type the character)
                CGEventSetType(keyEvent, kCGEventKeyDown);
                [NSThread sleepForTimeInterval:0.001]; // wait 1/1000 of second, no need of this line on my computer, I use 0.001 to be safe, increase it If you still have issues
            }
            CFRelease(keyEvent);
        }
    }
    return 0;
}

Lưu ý : Mã này hoạt động trên macOS Sierra và sẽ hoạt động trên El Capitan , nhưng không hoạt động trên hệ điều hành cũ .

nhập mô tả hình ảnh ở đây


6- Chọn menu " Sản phẩm " -> " Xây dựng ".


7- Chọn TypeCharactersbiểu tượng trong thư mục Sản phẩm , nhấp chuột phải và chọn menu " Hiển thị trong Trình tìm kiếm " trong menu ngữ cảnh.

nhập mô tả hình ảnh ở đây


8- Từ Finder, di chuyển tệp " TypeChar character " vào thư mục mong muốn, thoát Xcode , chỉ vậy thôi.


Từ một AppleScript , hãy gọi tệp thực thi, như thế này

set myString to "ùéèà ² ³ é ½ ₭ "
do shell script "'/full path/of/TypeCharacters' " & quoted form of myString

Câu trả lời đáng kinh ngạc. Giải pháp này cũng hoạt động hoàn hảo trên OS X 10.11.6. Tôi không thể mơ về một giải pháp tốt hơn. Tôi cũng đánh giá cao các ảnh chụp màn hình chi tiết. Rất rất cảm ơn!!!
quả cầu rubik

Tôi đã phát hiện ra một lỗi: Nếu độ dài myStringvượt quá 20 ký tự, thì chuỗi sẽ bị cắt ngắn. Đó là, bất kỳ văn bản nào sau ký tự thứ hai mươi sẽ không được gõ. Bạn có biết làm sao để sửa cái này không?
quả cầu rubik

Bây giờ, tôi sử dụng một vòng lặp để nhập từng ký tự, (được thử nghiệm với một chuỗi từ 2000 ký tự trở lên), tôi đã cập nhật mã trong câu trả lời của mình.
jackjr300

Giải pháp mới của bạn đã giải quyết được vấn đề. Cảm ơn! Lưu ý bên cạnh, bạn đã xóa #import <Foundation/Foundation.h>dòng khỏi mã trong bản chỉnh sửa của mình, nhưng dòng này vẫn cần thiết để xây dựng thành công. Tôi biết rằng dòng mã này ở đó theo mặc định, nhưng một số sự mơ hồ tồn tại bởi vì các hướng dẫn của bạn nói "xóa văn bản trong cửa sổ."
quả cầu rubik

Tôi nghĩ rằng giải pháp mới có một lỗi mới. Mỗi lần như vậy, văn bản đánh máy sẽ thiếu một ký tự hoặc thay đổi thứ tự của văn bản. Điều này xảy ra bất kể chiều dài chuỗi. Đây là một ví dụ thực tế: Chuỗi mà tệp TypeChar character đã được cung cấp = 278,932nhưng chuỗi sau đây đã được nhập : =2 78,93.
quả cầu rubik

4

Một cách giải quyết (với bảng tạm):

1 - Bạn có thể sử dụng phương pháp ca cao từ vỏ:

set tString to "² ³ é ½ ₭"
my stringToClipboard(tString)
tell application "System Events" to keystroke "v" using command down

on stringToClipboard(t1)
    do shell script "/usr/bin/python -c 'import sys;from AppKit import NSPasteboard, NSPasteboardTypeString; cb=NSPasteboard.generalPasteboard();cb.declareTypes_owner_([NSPasteboardTypeString], None);cb.setString_forType_(sys.argv[1].decode(\"utf8\"), NSPasteboardTypeString)' " & quoted form of t1
end stringToClipboard

2 - Hoặc một Applet Cacao-AppleScript:

use framework "AppKit"
use scripting additions
set tString to "² ³ é ½ ₭"
my stringToClipboard(tString)
tell application "System Events" to keystroke "v" using command down

on stringToClipboard(t1)
    set ca to current application
    set cb to ca's NSPasteboard's generalPasteboard()
    cb's declareTypes:{ca's NSPasteboardTypeString} owner:(missing value)
    cb's setString:t1 forType:(ca's NSPasteboardTypeString)
end stringToClipboard

3

Để keystrokeký tự, ký tự đó cần được ánh xạ tới một phím thực trên bàn phím đã chọn của bạn.

Chẳng hạn, tôi có thể keystroke é² tốt, vì tôi đang sử dụng bố cục bàn phím tiếng Pháp - PC . Tuy nhiên, bàn phím QWERTY tiêu chuẩn của Mỹ không có các phím đó và sẽ không thể sử dụng keystrokechúng.


2

Bạn có thể định nghĩa tất cả các bộ ký tự đặc biệt của mình dưới dạng các biến, như thế này

on specialKeys(input)
    tell application "System Events"
        keystroke input
    end tell
end specialKeys


set characterSet1 to "²³é½₭ "
set characterSet2 to "³ "
set characterSet3 to "é "
set characterSet4 to "¬Ω "
set characterSet5 to "₭ "
set characterSet6 to characterSet1 & characterSet2 & characterSet3 & characterSet4 & characterSet5

specialKeys(characterSet1)
-- ² ³ é ½  is the result from calling specialKeys(characterSet1) After adding the text replacement for a a a a a in my keyboard preferences

Một số ký tự đặc biệt nhấn phím chính xác khi bạn đặt chúng làm biến. Bất kỳ ký tự đặc biệt nào bạn đặt làm biến không gõ phím đúng cách, bạn có thể thêm các thay thế văn bản của Cameron trong tùy chọn hệ thống cho bàn phím của bạn.

Hãy chắc chắn chọn tất cả các mục và kéo chúng vào máy tính để bàn của bạn hoặc bất cứ nơi nào. Điều này sẽ tạo một tệp .plist sẽ là bản sao lưu các cài đặt gốc của bạn. Bạn có thể kéo tập tin này trở lại bất cứ lúc nào.

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

Sau đó, trong ScriptEditor, hãy đảm bảo rằng bạn đã bật tính năng thay thế văn bản trong menu phụ thay thế.

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây


2
Cách giải quyết "Thay thế văn bản" hoạt động như mong muốn trong phần lớn các ứng dụng OS X (ví dụ: TextEdit, Notes, Script Editor, v.v.), nhưng tôi hy vọng một giải pháp sẽ hoạt động trong mọi trường văn bản trong bất kỳ ứng dụng nào. Hỏi nhiều, tôi biết! Tôi vẫn nghĩ rằng đây là một giải pháp rất thông minh, nên +1. Cảm ơn bạn đã trả lời.
quả cầu rubik
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.