Tại sao studio trực quan nắm bắt các sự kiện quan trọng trước khi có khóa tự động?


82

Gần đây tôi đã chuyển sang bố cục bàn phím Dvorak như một thử nghiệm. Một trong những phần khó khăn nhất của quá trình chuyển đổi là xử lý các phím nóng. Hầu hết các phím nóng được thiết kế với QWERTY và, để làm cho vấn đề tồi tệ hơn, các phím nóng dường như bị ràng buộc về bộ nhớ cực kỳ cơ bắp.

Thay vì học lại tất cả các phím nóng, tôi đã viết một kịch bản autohotkey để dịch Dvorak bố trí trở lại QWERTY khi Ctrl, Althoặc Winbấm phím nào kết hợp với các phím khác. Nó hoạt động tuyệt vời ở mọi nơi tôi đã thử, ngoại trừ Visual Studio '08. Có vẻ như các lần nhấn phím đang bị bắt trước khi phím tắt tự động có thể dịch chúng.

Tại sao điều này lại xảy ra và làm cách nào để khắc phục sự cố này?

Dưới đây là một đoạn trích (từ đầu) kịch bản của tôi:

; control + letter
^;::^z
^q::^x
^j::^c
^k::^v

Cập nhật: Tập lệnh hoạt động tốt trên Win7 với ahk, vs08 và coderush mới được cài đặt. Máy tôi đang gặp sự cố đang chạy vista. Bất kỳ suy nghĩ về cách chẩn đoán thêm?

Cập nhật 2: Tập lệnh hoạt động tốt với Vista và 2010 beta 2. Có vẻ là một cái gì đó chỉ với vista 08 +. Sẽ thử cài đặt mới vs08 tối nay.

Câu trả lời:


174

Aha! Tôi đã tìm ra nó. Nếu ahk và ứng dụng đích không chạy theo cùng đặc quyền (hoặc người dùng) thì ahk sẽ không chặn / mô phỏng các sự kiện bàn phím một cách chính xác. Trong trường hợp của tôi, visual studio được chạy với đặc quyền của quản trị viên (nâng cao) trong khi tập lệnh ahk được chạy với tư cách là người dùng hiện đang đăng nhập.

Một trong hai cách sau đã giải quyết được vấn đề:

  • Chạy cả vs và ahk với tư cách là người dùng hiện tại
  • Biên dịch tập lệnh và chạy cả vs và ứng dụng đã biên dịch với tư cách quản trị viên

15
Chỉ muốn nói thêm rằng nó không phải về các quyền khác nhau . Nhưng thay vào đó, thực tế là tập lệnh AutoHotkey sẽ không hoạt động trên ứng dụng đang chạy ở cấp đặc quyền cao hơn tập lệnh. Xem câu trả lời của tôi dưới đây.
Himanshu P

2
Bạn có thể thêm "Run as admin" vào menu ngữ cảnh cho ahk. Nó lưu một bước biên dịch. howtogeek.com/howto/windows-vista/…
Adam Bell

Tôi đã tìm thấy ở đây một cách sạch hơn để chạy các kịch bản AutoHotkey as administrator trên mỗi khởi động mà không cần sự can thiệp của người sử dụng bằng các phương tiện của Task Scheduler: autohotkey.com/boards/viewtopic.php?t=21434
Jose Antonio

Chúc mừng cho điều đó🙏
ảo

48

Chỉ muốn thêm một vài điểm vào giải pháp do chính OP tìm ra.

1) Vấn đề không phải là AHK và VS đang chạy với các quyền khác nhau - chỉ là các phím nóng được tạo bởi một tập lệnh chạy ở chế độ không phải quản trị viên sẽ không hoạt động trên các ứng dụng chạy ở chế độ quản trị , nhưng sẽ không có vấn đề gì nếu nó chiều ngược lại.

2) Không nhất thiết phải biên dịch tập lệnh, chỉ cần đặt autohotkey.exe chạy ở chế độ quản trị (đó là những gì tôi làm), hoặc cách khác là tạo lối tắt cho tập lệnh cụ thể và đặt nó luôn chạy ở chế độ quản trị. (btw, chỉ ra rằng, không có hiệu suất tăng bằng cách chạy phiên bản đã biên dịch của tập lệnh AHK, bởi vì mã vẫn được thông dịch - chỉ là bây giờ trình thông dịch được nhúng trong tệp thực thi được tạo)


2

Điều này là do tính năng bảo mật được gọi là Cách ly Đặc quyền Giao diện Người dùng (UIPI) , là một phần của Kiểm soát Tài khoản Người dùng (UAC).

Có một số cách giải quyết được liệt kê trong Câu hỏi thường gặp:

Làm cách nào để khắc phục các sự cố do Kiểm soát tài khoản người dùng (UAC)?

Các cách giải quyết phổ biến như sau:

  • Bật tùy chọn Thêm 'Chạy với quyền truy cập giao diện người dùng' vào menu ngữ cảnh trong Thiết lập phím tự động . Có thể bật hoặc tắt tùy chọn này mà không cần cài đặt lại AutoHotkey bằng cách chạy lại AutoHotkey Setup từ menu Start. Sau khi nó được kích hoạt, hãy khởi chạy tệp script của bạn bằng cách nhấp chuột phải vào nó và chọn Chạy với quyền truy cập giao diện người dùng hoặc sử dụng dòng lệnh như "AutoHotkeyU32_UIA.exe" "Your script.ahk"(nhưng bao gồm đường dẫn đầy đủ).
  • Chạy tập lệnh với tư cách quản trị viên. Lưu ý rằng điều này cũng khiến mọi chương trình do tập lệnh khởi chạy chạy với tư cách quản trị viên và có thể yêu cầu người dùng chấp nhận lời nhắc phê duyệt khi khởi chạy tập lệnh.
  • Tắt chính sách bảo mật cục bộ "Chạy tất cả quản trị viên trong Chế độ phê duyệt của quản trị viên" (không được khuyến nghị).
  • Tắt hoàn toàn UAC. Điều này không được khuyến nghị và không khả thi trên Windows 8 trở lên.

Tôi thường không khuyên bạn nên chạy một tập lệnh với tư cách là quản trị viên để giải quyết vấn đề này, vì nó có những tác dụng phụ có thể không mong muốn hoặc không mong muốn. Ví dụ: bất kỳ chương trình nào mà tập lệnh khởi Runchạy cũng sẽ chạy với tư cách quản trị viên. Tập lệnh cũng sẽ có quyền ghi không cần thiết vào các thư mục khác nhau, chẳng hạn như Tệp Chương trình. Một chút mã xấu (mã độc được sao chép từ đâu đó hoặc mã có lỗi) có thể gây hại nhiều hơn theo cách này.

Tất nhiên, tôi cũng không khuyến nghị hai lựa chọn cuối cùng. Điều đó chỉ để lại Run with UI Access , có thể được bật và sử dụng như mô tả ở trên.


0

Rõ ràng có một giải pháp cho điều này.

Từ tài liệu Program.htm # Installer_uiAccess .
Chủ đề diễn đàn của Lexikos

Trích:

EnableUIAccess

Sửa đổi AutoHotkey.exe để cho phép các tập lệnh thực hiện những điều sau ngay cả khi UAC được bật:

Tương tác với các cửa sổ của chương trình quản trị mà không cần chạy tập lệnh với tư cách quản trị viên. Sử dụng SendPlay. Có những hạn chế; vui lòng đọc bài viết trước khi sử dụng kịch bản này.

Liên kết tải xuống tệp ahk bị hỏng trên diễn đàn nhưng tôi tìm thấy nó trên Github: EnableUIAccess.ahk


Tại sao bạn lại xem EnableUIAccess.ahk? Nó đã lỗi thời. Tài liệu bạn đã liên kết cho bạn biết về tùy chọn được tích hợp sẵn trong trình cài đặt AutoHotkey. Trình cài đặt chứa mọi thứ bạn cần. (Tôi cũng đã đăng chi tiết hơn như một câu trả lời.)
Lexikos
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.