5

Làm thế nào để phát hiện xem trình đọc màn hình có đang chạy (JAWS) không?C#: Cách phát hiện xem trình đọc màn hình có đang chạy không?

Như tôi đã hiểu trong .NET 4, chúng tôi có thể sử dụng AutomationInteropProvider.ClientsAreListening từ không gian tên System.Windows.Automation.Provider, nhưng nếu tôi phải làm điều đó cho .NET 2.0 thì sao?

Tôi đã cố gắng kiểm tra ClientsAreListening mã nguồn, nó gọi phương thức bên ngoài RawUiaClientsAreListening từ thư viện UIAutomationCore.dll.

Bạn có ý tưởng nào về cách triển khai phát hiện JAWS trong .NET 2.0 không?

+0

Tò mò - bạn định làm gì khác nếu bạn xác định rằng trình chạy màn hình đang chạy? Lưu ý rằng một số ứng dụng không có màn hình có thể đặt cờ SPI_SCREENREADER, vì vậy bạn có thể nhận được các kết quả dương hoặc âm sai. Lý tưởng nhất là ứng dụng của bạn sẽ hoạt động mà không cần phải kiểm tra cờ này. Bạn có thực sự kiểm tra cho screenreaders nói chung, hoặc JAWS cụ thể? – BrendanMcK

Trả lời

4

Sử dụng SystemParametersInfo function chuyển một số uiAction của SPI_GETSCREENREADER.

Bạn sẽ cần phải sử dụng P/Invoke cho điều này, ví dụ:

internal class UnsafeNativeMethods 
{ 
    public const uint SPI_GETSCREENREADER = 0x0046; 

    [DllImport("user32.dll", SetLastError = true)] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    public static extern bool SystemParametersInfo(uint uiAction, uint uiParam, ref bool pvParam, uint fWinIni); 
} 

public static class ScreenReader 
{ 
    public static bool IsRunning 
    { 
     get 
     { 
      bool returnValue = false; 
      if (!UnsafeNativeMethods.SystemParametersInfo(UnsafeNativeMethods.SPI_GETSCREENREADER, 0, ref returnValue, 0)) 
      { 
       throw new Win32Exception(Marshal.GetLastWin32Error(), "error calling SystemParametersInfo"); 
      } 
      return returnValue; 
     } 
    } 
} 

Đây có thể là tốt hơn so với sử dụng ClientsAreListening tài sản là tài sản này dường như trở thành sự thật cho bất kỳ khách hàng tự động hóa, không chỉ màn hình độc giả.

Xem thêm:

Bạn cũng nên lắng nghe các thông điệp WM_SETTINGCHANGE để phát hiện nếu một trình đọc màn hình khởi động/dừng chạy.


Cập nhật (để đáp ứng với ý kiến ​​BrendanMcK của):

Mặc dù điều này không bao giờ được ghi nhận một cách rõ ràng trong càng nhiều từ, nhìn vào mô tả của lá cờ Tôi nghĩ rằng mục đích của lá cờ này là tương đối rõ ràng :

Xác định xem tiện ích của trình đánh giá màn hình có đang chạy hay không. Tiện ích xem xét màn hình hướng thông tin văn bản đến thiết bị đầu ra, chẳng hạn như bộ tổng hợp giọng nói hoặc màn hình chữ nổi. Khi cờ này được thiết lập, một ứng dụng sẽ cung cấp thông tin văn bản trong các tình huống nơi nó sẽ trình bày thông tin bằng đồ họa.

Điều này được nói là ứng dụng thiết lập cờ này bất cứ khi nào một ứng dụng muốn giao diện người dùng để hành xử như thể một người đọc màn hình là chạy, bất kể có hay không ứng dụng mà thực sự là một trình đọc màn hình hay không .

Những việc phù hợp cần làm để phản hồi cờ này là add text in order to "read" otherwise intuitive UI state to the user. Nếu cần cấp tiến thay đổi để làm cho trình đọc màn hình UI của bạn có thể truy cập được thì khả năng giao diện người dùng của bạn cũng không trực quan đối với người dùng bị sigted và có thể làm với suy nghĩ lại.

+0

Tuyệt vời! Nó hoạt động! –

+1

Lưu ý rằng ClientsAreListening chỉ cho bạn biết về khách hàng trợ năng tích cực lắng nghe các sự kiện trợ năng. Có thể có những người khác vẫn sử dụng khả năng truy cập - ví dụ: để loại bỏ giao diện người dùng cho các động từ để nhận dạng giọng nói - nhưng hãy sử dụng một số phương tiện khác để xác định thời điểm cạo và không nghe các sự kiện trợ năng. Tóm lại, API này chỉ cho bạn biết rằng bạn cần gửi các sự kiện; không phải liệu ứng dụng trợ năng có đang chạy hay không. – BrendanMcK

+0

@BrendanMcK Ngược lại 'SPI_GETSCREENREADER' chỉ đơn giản là cờ được thiết lập bởi trình đọc màn hình để chỉ ra cho người khác rằng họ đang chạy (bất kể phương thức được sử dụng) – Justin

Các vấn đề liên quan