{"id":24975177,"url":"https://github.com/jeffersonqin/ayase","last_synced_at":"2025-04-11T11:51:38.326Z","repository":{"id":108621627,"uuid":"391421578","full_name":"JeffersonQin/Ayase","owner":"JeffersonQin","description":"🥥 Control everything by keyboard.","archived":false,"fork":false,"pushed_at":"2022-01-10T06:32:45.000Z","size":10513,"stargazers_count":69,"open_issues_count":3,"forks_count":11,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-03-25T08:11:14.536Z","etag":null,"topics":["accessibility","cpp","csharp","dotnet","dotnet-core","keyboard","mouse","mouse-simulations","pinvoke","uiautomation","win32","win32api","win32com","wpf"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/JeffersonQin.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-07-31T17:26:33.000Z","updated_at":"2025-02-25T04:58:30.000Z","dependencies_parsed_at":"2023-03-25T20:32:39.620Z","dependency_job_id":null,"html_url":"https://github.com/JeffersonQin/Ayase","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JeffersonQin%2FAyase","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JeffersonQin%2FAyase/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JeffersonQin%2FAyase/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JeffersonQin%2FAyase/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/JeffersonQin","download_url":"https://codeload.github.com/JeffersonQin/Ayase/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248390434,"owners_count":21095795,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["accessibility","cpp","csharp","dotnet","dotnet-core","keyboard","mouse","mouse-simulations","pinvoke","uiautomation","win32","win32api","win32com","wpf"],"created_at":"2025-02-03T20:45:07.368Z","updated_at":"2025-04-11T11:51:38.298Z","avatar_url":"https://github.com/JeffersonQin.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Ayase\r\n\r\n[简体中文 | For Simplified Chinese version, please click here](README_zh-cn.md)\r\n\r\nAyase is a tool which can help you to control everything by keyboard. This is specifically designed for ~~lazy people like me~~ and blind people. It is known to all that in the most cases, we have to control the computer by **both** mouse **and** keyboard. However, the frequent switch for our hand between mice and keyboards would severely threaten the health of our wrists. Meanwhile, for blind people, though in most cases, it is convenient enough to use the screen readers to control elements on screen, most softwares cannot control both precisely and **swiftly**. You have to wait for the element or switch many times to find the element you want to control. With Ayase, these problems are all solved.\r\n\r\n# Screenshots\r\n\r\nUse Ayase to control Netease Music UWP:\r\n\r\n![netease-demo](imgs/netease-music.gif)\r\n\r\nUse Ayase to surf on the Internet:\r\n\r\n![surf-internet-demo](imgs/surf-internet.gif)\r\n\r\n# About Naming (Ayase)\r\n\r\nI love Mitsukasa Ayase forever!\r\n\r\nhttps://zh.moegirl.org.cn/三司绫濑\r\n\r\n# Features\r\n\r\n- Support high DPI, different DPI across multiple monitors, cross monitor display\r\n- Support Chrome-based Apps (e.g. Github Desktop)\r\n- Support Electron Apps (e.g. Visual Studio Code)\r\n- Support WinForms, WPF, UWP (e.g. Netease Music UWP)\r\n- Support the self-developed UI frameworks (e.g. Wechat \u0026 QQ of Tencent Inc.)\r\n- Scanning of UI tree with high speed\r\n- Support **pinyin** for Chinese (e.g. 网易云 → wyy / wangyiyun)\r\n- Ignore upper and lower case\r\n\r\nFor the discussion on accessibility development and speed optimization, please refer to my following articles. Finally, the implementation scheme I adopted is to use `C++` to invoke `Win32API / uiautomation.h` and compile into `dll` (dynamic link library). Then, I used `P/Invoke` in the `C# / WPF` project to use the library. In most cases, the performance was improved for about 80%.\r\n\r\n- [.NET C# AutomationElement 获取桌面UI元素](https://gyrojeff.top/index.php/archives/NET-C-AutomationElement-%E8%8E%B7%E5%8F%96%E6%A1%8C%E9%9D%A2UI%E5%85%83%E7%B4%A0/)\r\n- [.NET C# 手撕线程池 | 县城撕裂者](https://gyrojeff.top/index.php/archives/NET-C-%E6%89%8B%E6%92%95%E7%BA%BF%E7%A8%8B%E6%B1%A0-%E5%8E%BF%E5%9F%8E%E6%92%95%E8%A3%82%E8%80%85/)\r\n- [.NET C# AutomationElement 加速探索](https://gyrojeff.top/index.php/archives/NET-C-AutomationElement-%E5%8A%A0%E9%80%9F%E6%8E%A2%E7%B4%A2/)\r\n- [.NET C# UIAutomationElement 获取桌面元素](https://gyrojeff.top/index.php/archives/NET-C-UIAutomationElement-%E8%8E%B7%E5%8F%96%E6%A1%8C%E9%9D%A2%E5%85%83%E7%B4%A0/)\r\n- [.NET C# 通过Win32API获取窗口及控件的信息](https://gyrojeff.top/index.php/archives/NET-C-%E9%80%9A%E8%BF%87Win32API%E8%8E%B7%E5%8F%96%E7%AA%97%E5%8F%A3%E5%8F%8A%E6%8E%A7%E4%BB%B6%E7%9A%84%E4%BF%A1%E6%81%AF/)\r\n- [.NET C# 获取桌面UI元素总结](https://gyrojeff.top/index.php/archives/NET-C-%E8%8E%B7%E5%8F%96%E6%A1%8C%E9%9D%A2UI%E5%85%83%E7%B4%A0%E6%80%BB%E7%BB%93/)\r\n- [.NET C# MSAA 获取桌面UI元素](https://gyrojeff.top/index.php/archives/NET-C-MSAA-%E8%8E%B7%E5%8F%96%E6%A1%8C%E9%9D%A2UI%E5%85%83%E7%B4%A0/)\r\n- [.NET C# C++ 混编问题](https://gyrojeff.top/index.php/archives/NET-C-C-%E6%B7%B7%E7%BC%96%E9%97%AE%E9%A2%98/)\r\n\r\nNote that I do not have additional time and effort to translate those articles into English. Using translators can also understand the articles well. If you still have any questions or advice, you can contact me directly. You can find ways to contact me in my GitHub homepage. This is the first time I write `WPF / C#` this formally, so if you have any advice, please don't hesitate to raise issues or pull requests.\r\n\r\n# Project Structure\r\n\r\n```\r\n.\r\n├── Ayase                                   # Ayase Project\r\n│   ├── AccessibilityBridge                 # P/Invoke bridge for .dll\r\n│   │   ├── GNativeIUIAutomationManager.cs\r\n│   │   └── GNativeUIElement.cs\r\n│   ├── App.xaml\r\n│   ├── App.xaml.cs                         # Entrance\r\n│   ├── AssemblyInfo.cs\r\n│   ├── AutomationLib                       # Most of them are no longer used. Serve as alternatives\r\n│   │   ├── GAutomationManager.cs\r\n│   │   ├── GIUIAutomationManager.cs\r\n│   │   ├── GMSAAManager.cs\r\n│   │   ├── GRawUIManager.cs\r\n│   │   ├── GUIElement.cs\r\n│   │   └── Wrapper                         # Wrapper for Win32API used in this section\r\n│   │       ├── ObjectIdentifiers.cs\r\n│   │       ├── RECT.cs\r\n│   │       ├── ReferenceIdentifiers.cs\r\n│   │       └── Win32API.cs\r\n│   ├── Ayase.csproj\r\n│   ├── Ayase.csproj.user\r\n│   ├── HotkeyLib                           # Global hotkey wrapping\r\n│   │   ├── GHotKey.cs\r\n│   │   ├── GKeybdEvent.cs\r\n│   │   └── VirtualKeys.cs\r\n│   ├── MouseLib                            # Mouse control wrapping\r\n│   │   └── GMouse.cs\r\n│   ├── Properties\r\n│   │   └── launchSettings.json\r\n│   ├── ScreenLib                           # Screen library wrapping\r\n│   │   └── PrimaryScreen.cs\r\n│   ├── ThreadLib                           # Private thread pool\r\n│   │   └── GThreadPool.cs\r\n│   └── UI                                  # UI\r\n│       ├── FormMaskWindow.xaml\r\n│       ├── FormMaskWindow.xaml.cs\r\n│       ├── MaskWindow.cs\r\n│       ├── NotationLabel.cs\r\n│       ├── ReuseWindow.cs\r\n│       ├── ScreenMaskWindow.xaml\r\n│       ├── ScreenMaskWindow.xaml.cs\r\n│       ├── SearchWindow.xaml\r\n│       ├── SearchWindow.xaml.cs\r\n│       ├── SettingsWindow.xaml\r\n│       ├── SettingsWindow.xaml.cs\r\n│       └── WindowManager.cs                # Windows scheduling\r\n├── Ayase.Accessibility                     # dll project\r\n│   ├── Ayase.Accessibility.vcxproj\r\n│   ├── Ayase.Accessibility.vcxproj.filters\r\n│   ├── Ayase.Accessibility.vcxproj.user\r\n│   ├── GConstant.h                         # Some constants\r\n│   ├── GIUIAutomationManager.cpp           # Main implementation\r\n│   ├── GIUIAutomationManager.h\r\n│   ├── GUIElement.cpp                      # Wrapping for data structure\r\n│   ├── GUIElement.h\r\n│   ├── dllmain.cpp\r\n│   ├── framework.h\r\n│   ├── pch.cpp\r\n│   └── pch.h\r\n└── Ayase.sln\r\n```\r\n\r\nThe TOC for generated project:\r\n\r\n```\r\n.\r\n├── ...\r\n├── Ayase.Accessibility.dll\r\n└── \u003c.net target\u003e\r\n    ├── ...\r\n    └── Ayase.exe\r\n```\r\n\r\n# Dependencies\r\n\r\n- `Microsoft.Toolkit.Uwp.Notifications`\r\n- `Notifications.Wpf`\r\n- `ToolGood.Words`\r\n\r\n# Usage\r\n\r\n- Start UI Scanning: `Alt + CapLocks` (We would adjust the status of `CapLocks` automatically)\r\n- Exit UI Scanning: `Esc`\r\n- Next Element: `Tab`\r\n- Previous Element: `Shift + Tab`\r\n- Click the Selected Element: `Enter`\r\n- Move the mouse to the Selected Element: `Shift + Enter`\r\n\r\n# TODO\r\n\r\nNote: most modules have been completed but not released here due to license issues. I am now making effort to crafting new alternatives that are compatible with MIT license.\r\n\r\n- Add voice module\r\n- Add settings module\r\n- Add support for control by `AWSD`\r\n- Add pure mouse mode\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjeffersonqin%2Fayase","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjeffersonqin%2Fayase","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjeffersonqin%2Fayase/lists"}