Compare commits
124 Commits
v1.0.0-bet
...
main
Author | SHA1 | Date |
---|---|---|
|
bfaf96e7bf | |
|
638ae4d90e | |
|
b7b68b26af | |
|
745d020f2a | |
|
43f7f34b59 | |
|
898f0b7b3c | |
|
2433aaab25 | |
|
e20bf86961 | |
|
801b2eee20 | |
|
01042b8bff | |
|
f32254860e | |
|
a811fa52b6 | |
|
602698dbd5 | |
|
7e6c73367f | |
|
a5805b5f10 | |
|
0e7600c621 | |
|
ef2b3c7dce | |
|
f699336571 | |
|
25fa4d63c6 | |
|
e8512b8768 | |
|
654ac8e4ed | |
|
f04475b357 | |
|
d30ee310cd | |
|
426af7b721 | |
|
00acbab4a6 | |
|
461e614973 | |
|
bd72c67078 | |
|
620bbaa388 | |
|
c4a913918d | |
|
2c749d533f | |
|
0d52239f11 | |
|
8313bad0e3 | |
|
071278c447 | |
|
10364dd246 | |
|
59bc8e1452 | |
|
d833cd9463 | |
|
a0cf7361fc | |
|
93be5d4898 | |
|
be047bf13a | |
|
76aa59d518 | |
|
58ee1aeba1 | |
|
8f738c31b5 | |
|
c78906de64 | |
|
76a0843bac | |
|
0f74f9ed10 | |
|
2118066156 | |
|
0564cacea1 | |
|
0cdab6ca4a | |
|
0b70efc09c | |
|
e98cf8b11e | |
|
08532be5f6 | |
|
40cc1d9f42 | |
|
ab8dd51fea | |
|
a91219c45e | |
|
ced8d4ab5b | |
|
b8a1486ed1 | |
|
417e935482 | |
|
35b9f02dea | |
|
40d1fb0b69 | |
|
165049e5ab | |
|
1d4d91bbc1 | |
|
f00b5d9a60 | |
|
aca04c56a6 | |
|
4e73fe9920 | |
|
b282e19b4e | |
|
f2fe7d434a | |
|
2000949c25 | |
|
671706ada0 | |
|
ded17da84e | |
|
67f4e60953 | |
|
ff5b950ea1 | |
|
3734a6c296 | |
|
899a84a27b | |
|
e04e0ccb9c | |
|
7f40cd7c1b | |
|
df43422613 | |
|
eb7ff3c373 | |
|
8f12dc30cf | |
|
4f67007869 | |
|
e4a4a3bbb8 | |
|
cf6108fc59 | |
|
0e49d916ca | |
|
1bf6ee956f | |
|
4b31cce73c | |
|
1642a452d0 | |
|
34de0d90cf | |
|
f9c272f3c5 | |
|
ce3c023f72 | |
|
302a66cc71 | |
|
a9c901069e | |
|
103d0c1be3 | |
|
1fc853e2e0 | |
|
7caa23f0fe | |
|
b256e7f50c | |
|
4d49c71b93 | |
|
476e564b08 | |
|
a7edcc6956 | |
|
07ded160df | |
|
65d7e66387 | |
|
bbb5ed2221 | |
|
841e746f0c | |
|
22a93030f8 | |
|
eff6dc4c9d | |
|
44773f15c4 | |
|
41d047355c | |
|
4a60ab5cf1 | |
|
2e82df32e5 | |
|
adbed956e8 | |
|
4b603fdcac | |
|
54ccc46303 | |
|
83823f9f82 | |
|
ae37accf5a | |
|
e8724302fe | |
|
accfb0defc | |
|
4de70c5f46 | |
|
8ac5def42a | |
|
7d77d287f9 | |
|
71a296282e | |
|
e89c20608b | |
|
7dfabb82a9 | |
|
1dabb3672f | |
|
eba09c729e | |
|
75f78a2dec | |
|
64b677868b |
|
@ -0,0 +1,81 @@
|
||||||
|
[remote.github]
|
||||||
|
owner = "1204244136" # 替换为你的GitHub用户名
|
||||||
|
repo = "DoroHelper" # 替换为你的仓库名
|
||||||
|
|
||||||
|
[changelog]
|
||||||
|
header = """
|
||||||
|
# 更新日志
|
||||||
|
"""
|
||||||
|
|
||||||
|
body = """
|
||||||
|
{%- macro remote_url() -%}
|
||||||
|
https://github.com/{{ remote.github.owner }}/{{ remote.github.repo }}
|
||||||
|
{%- endmacro -%}
|
||||||
|
|
||||||
|
{% macro print_commit(commit) -%}
|
||||||
|
- {% if commit.scope %}*({{ commit.scope }})* {% endif %}\
|
||||||
|
{% if commit.breaking %}[**breaking**] {% endif %}\
|
||||||
|
{{ commit.message | upper_first }} \
|
||||||
|
({{ commit.id }}) \
|
||||||
|
@{{ author.login | default(value=commit.author.name) }}
|
||||||
|
{% endmacro -%}
|
||||||
|
|
||||||
|
{% if version %}\
|
||||||
|
## {{ version | trim_start_matches(pat="v") }} ({{ timestamp | date(format="%Y-%m-%d") }})
|
||||||
|
{% else %}\
|
||||||
|
## 未发布
|
||||||
|
{% endif %}\
|
||||||
|
|
||||||
|
{% for group, commits in commits | group_by(attribute="group") %}
|
||||||
|
### {{ group | striptags | trim | upper_first }}
|
||||||
|
{% for commit in commits
|
||||||
|
| filter(attribute="scope")
|
||||||
|
| sort(attribute="scope") %}
|
||||||
|
{{ self::print_commit(commit=commit) }}
|
||||||
|
{%- endfor %}
|
||||||
|
{% for commit in commits %}
|
||||||
|
{%- if not commit.scope -%}
|
||||||
|
{{ self::print_commit(commit=commit) }}
|
||||||
|
{% endif -%}
|
||||||
|
{% endfor -%}
|
||||||
|
{% endfor -%}
|
||||||
|
{%- if github -%}
|
||||||
|
{% if github.contributors | filter(attribute="is_first_time", value=true) | length != 0 %}
|
||||||
|
## 新贡献者 ❤️
|
||||||
|
{% endif %}\
|
||||||
|
{% for contributor in github.contributors | filter(attribute="is_first_time", value=true) %}
|
||||||
|
* @{{ contributor.username }} made their first contribution
|
||||||
|
{%- if contributor.pr_number %} in \
|
||||||
|
[#{{ contributor.pr_number }}]({{ self::remote_url() }}/pull/{{ contributor.pr_number }}) \
|
||||||
|
{%- endif %}
|
||||||
|
{%- endfor -%}
|
||||||
|
{%- endif %}
|
||||||
|
"""
|
||||||
|
|
||||||
|
footer = """
|
||||||
|
|
||||||
|
[已有 Mirror酱 CDK?点击前往高速下载](https://mirrorchyan.com/zh/projects?rid=DoroHelper&source=doro-gh-release)
|
||||||
|
"""
|
||||||
|
|
||||||
|
[git]
|
||||||
|
conventional_commits = true
|
||||||
|
filter_unconventional = false
|
||||||
|
commit_parsers = [
|
||||||
|
{ message = "^feat", group = "新增 | New" },
|
||||||
|
{ message = "^fix", group = "修复 | Fix" },
|
||||||
|
{ message = "^perf", group = "改进 | Improved" },
|
||||||
|
{ message = "^docs", group = "文档 | Docs" },
|
||||||
|
{ message = "^refactor", group = "重构 | Refactor" },
|
||||||
|
{ message = "^style", group = "样式 | Style" },
|
||||||
|
{ message = "^test", group = "测试 | Test" },
|
||||||
|
{ message = "^build", group = "依赖 | Build" },
|
||||||
|
{ message = "^chore", group = "维护 | Chore" },
|
||||||
|
{ message = "^ci", group = "集成 | Ci" },
|
||||||
|
{ message = "^revert", group = "撤销 | Revert" },
|
||||||
|
]
|
||||||
|
|
||||||
|
ignore_tags = "rc"
|
||||||
|
sort_commits = "oldest"
|
||||||
|
|
||||||
|
[git.github]
|
||||||
|
commits = true
|
|
@ -94,7 +94,6 @@ jobs:
|
||||||
const owner = context.repo.owner;
|
const owner = context.repo.owner;
|
||||||
const repo = context.repo.repo;
|
const repo = context.repo.repo;
|
||||||
const sha = context.sha;
|
const sha = context.sha;
|
||||||
|
|
||||||
console.log(`Attempting to create tag ${tag} at commit ${sha}`);
|
console.log(`Attempting to create tag ${tag} at commit ${sha}`);
|
||||||
try {
|
try {
|
||||||
await github.rest.git.createRef({
|
await github.rest.git.createRef({
|
||||||
|
@ -119,69 +118,45 @@ jobs:
|
||||||
|
|
||||||
- name: Determine if Pre-release
|
- name: Determine if Pre-release
|
||||||
id: prerelease_check
|
id: prerelease_check
|
||||||
shell: bash
|
shell: pwsh
|
||||||
run: |
|
run: |
|
||||||
VERSION_TAG="${{ steps.get_version.outputs.VERSION_TAG }}"
|
$VERSION_TAG = "${{ steps.get_version.outputs.VERSION_TAG }}"
|
||||||
IS_PRERELEASE="false"
|
$IS_PRERELEASE = "false"
|
||||||
if [[ "$VERSION_TAG" == *beta* || "$VERSION_TAG" == *alpha* || "$VERSION_TAG" == *rc* ]]; then
|
# PowerShell 中的字符串匹配操作
|
||||||
IS_PRERELEASE="true"
|
if ($VERSION_TAG -like "*beta*" -or $VERSION_TAG -like "*alpha*" -or $VERSION_TAG -like "*rc*") {
|
||||||
fi
|
$IS_PRERELEASE = "true"
|
||||||
echo "IS_PRERELEASE=$IS_PRERELEASE" >> $GITHUB_OUTPUT
|
}
|
||||||
echo "Release version: ${VERSION_TAG}, Is Prerelease: ${IS_PRERELEASE}"
|
echo "IS_PRERELEASE=$IS_PRERELEASE" | Out-File -FilePath $env:GITHUB_OUTPUT -Append
|
||||||
|
Write-Host "Release version: ${VERSION_TAG}, Is Prerelease: ${IS_PRERELEASE}"
|
||||||
|
|
||||||
- name: Generate Changelog
|
- name: Generate Changelog # 更改此步骤
|
||||||
id: changelog
|
id: changelog
|
||||||
shell: bash
|
uses: orhun/git-cliff-action@v4
|
||||||
|
with:
|
||||||
|
config: .github/cliff.toml # 假设你的 cliff.toml 文件在此路径
|
||||||
|
args: --latest --strip header # 生成最新版本的更新日志,并去除头部的标题
|
||||||
|
env:
|
||||||
|
OUTPUT: CHANGES.md # Git-cliff 将输出到此文件,但我们通过输出获取内容
|
||||||
|
GITHUB_REPO: ${{ github.repository }} # 提供仓库信息给 git-cliff
|
||||||
|
|
||||||
|
- name: Read Changelog Content # 读取 git-cliff 生成的内容
|
||||||
|
id: read_changelog_content
|
||||||
|
shell: pwsh # 确保使用 PowerShell
|
||||||
run: |
|
run: |
|
||||||
CURRENT_TAG="${{ steps.get_version.outputs.VERSION_TAG }}"
|
# 在 PowerShell 中读取文件内容并赋值给变量
|
||||||
echo "Current Tag for Changelog: ${CURRENT_TAG}"
|
$CHANGELOG_BODY = Get-Content -Path CHANGES.md -Raw
|
||||||
|
|
||||||
# Ensure local git knows about all tags, especially the one just created
|
# 定义一个多行分隔符,确保它在 $CHANGELOG_BODY 内容中不出现
|
||||||
# git fetch --tags # Already done in previous step, but good to be aware
|
$DELIMITER = "EOF_CHANGELOG_BODY"
|
||||||
|
|
||||||
ALL_SORTED_TAGS=$(git tag --sort=-v:refname)
|
# 将输出写入 GitHub Output 文件,使用多行分隔符
|
||||||
echo "All sorted tags:"
|
"CHANGELOG_BODY<<$DELIMITER" | Out-File -FilePath $env:GITHUB_OUTPUT -Append
|
||||||
echo "${ALL_SORTED_TAGS}"
|
$CHANGELOG_BODY | Out-File -FilePath $env:GITHUB_OUTPUT -Append
|
||||||
|
"$DELIMITER" | Out-File -FilePath $env:GITHUB_OUTPUT -Append
|
||||||
|
|
||||||
LAST_TAG=""
|
Write-Host "--- Generated Changelog ---"
|
||||||
FOUND_CURRENT_TAG=false
|
Write-Host "$CHANGELOG_BODY"
|
||||||
|
Write-Host "-------------------------"
|
||||||
# Loop to find the tag immediately preceding CURRENT_TAG in the sorted list
|
|
||||||
while IFS= read -r tag_item; do
|
|
||||||
if [ "$FOUND_CURRENT_TAG" = true ]; then
|
|
||||||
# The first tag encountered after CURRENT_TAG is the previous one in semantic versioning
|
|
||||||
LAST_TAG="$tag_item"
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
if [ "$tag_item" = "$CURRENT_TAG" ]; then
|
|
||||||
FOUND_CURRENT_TAG=true
|
|
||||||
fi
|
|
||||||
done <<< "$ALL_SORTED_TAGS"
|
|
||||||
|
|
||||||
echo "Previous Tag for Changelog: ${LAST_TAG}"
|
|
||||||
|
|
||||||
CHANGELOG_BODY=""
|
|
||||||
if [ -z "${LAST_TAG}" ]; then
|
|
||||||
echo "No previous tag found. Generating changelog from the beginning up to ${CURRENT_TAG}."
|
|
||||||
# This will list all commits leading to the CURRENT_TAG if it's the first tag
|
|
||||||
CHANGELOG_BODY=$(git log --pretty=format:"* %s (%h)" "${CURRENT_TAG}")
|
|
||||||
if [ -z "$CHANGELOG_BODY" ]; then
|
|
||||||
CHANGELOG_BODY="* Initial release or no new commits to list for ${CURRENT_TAG}."
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo "Generating changelog from ${LAST_TAG}..${CURRENT_TAG}"
|
|
||||||
CHANGELOG_BODY=$(git log --pretty=format:"* %s (%h)" "${LAST_TAG}..${CURRENT_TAG}")
|
|
||||||
if [ -z "$CHANGELOG_BODY" ]; then
|
|
||||||
CHANGELOG_BODY="* No changes detected between ${LAST_TAG} and ${CURRENT_TAG}."
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "CHANGELOG_BODY<<EOF" >> "$GITHUB_OUTPUT"
|
|
||||||
echo "$CHANGELOG_BODY" >> "$GITHUB_OUTPUT"
|
|
||||||
echo "EOF" >> "$GITHUB_OUTPUT"
|
|
||||||
echo "--- Generated Changelog ---"
|
|
||||||
echo "$CHANGELOG_BODY"
|
|
||||||
echo "-------------------------"
|
|
||||||
|
|
||||||
- name: Compile AutoHotkey Script with Action
|
- name: Compile AutoHotkey Script with Action
|
||||||
id: compile_script
|
id: compile_script
|
||||||
|
@ -195,18 +170,22 @@ jobs:
|
||||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
- name: Create GitHub Release
|
- name: Create GitHub Release
|
||||||
uses: softprops/action-gh-release@v2
|
uses: softprops/action-gh-release@v2.2.2
|
||||||
with:
|
with:
|
||||||
tag_name: ${{ steps.get_version.outputs.VERSION_TAG }}
|
tag_name: ${{ steps.get_version.outputs.VERSION_TAG }}
|
||||||
name: ${{ steps.get_version.outputs.VERSION_TAG }}
|
name: ${{ steps.get_version.outputs.VERSION_TAG }}
|
||||||
body: |
|
body: |
|
||||||
${{ steps.changelog.outputs.CHANGELOG_BODY }}
|
${{ steps.read_changelog_content.outputs.CHANGELOG_BODY }}
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
测试版兼容性较差,请谨慎下载
|
|
||||||
draft: false
|
draft: false
|
||||||
prerelease: ${{ steps.prerelease_check.outputs.IS_PRERELEASE }}
|
prerelease: ${{ steps.prerelease_check.outputs.IS_PRERELEASE }}
|
||||||
files: DoroHelper.exe
|
files: DoroHelper.exe
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Trigger MirrorChyanUploading
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
gh workflow run --repo $GITHUB_REPOSITORY mirrorchyan_uploading
|
||||||
|
gh workflow run --repo $GITHUB_REPOSITORY mirrorchyan_release_note
|
||||||
|
env:
|
||||||
|
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
name: mirrorchyan_release_note
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
release:
|
||||||
|
types: [edited]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
mirrorchyan:
|
||||||
|
runs-on: macos-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- id: uploading
|
||||||
|
uses: MirrorChyan/release-note-action@v1
|
||||||
|
with:
|
||||||
|
mirrorchyan_rid: DoroHelper
|
||||||
|
|
||||||
|
upload_token: ${{ secrets.MirrorChyanUploadToken }}
|
||||||
|
owner: 1204244136
|
||||||
|
repo: DoroHelper
|
||||||
|
github_token: ${{ secrets.GITHUB_TOKEN }}
|
|
@ -0,0 +1,20 @@
|
||||||
|
name: mirrorchyan_uploading
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
mirrorchyan:
|
||||||
|
runs-on: macos-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: MirrorChyan/uploading-action@v1
|
||||||
|
with:
|
||||||
|
filetype: latest-release
|
||||||
|
filename: "DoroHelper.exe"
|
||||||
|
mirrorchyan_rid: DoroHelper
|
||||||
|
|
||||||
|
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
owner: 1204244136
|
||||||
|
repo: DoroHelper
|
||||||
|
upload_token: ${{ secrets.MirrorChyanUploadToken }}
|
2671
DoroHelper.ahk
2671
DoroHelper.ahk
File diff suppressed because it is too large
Load Diff
47
README.md
47
README.md
|
@ -4,9 +4,17 @@
|
||||||
|
|
||||||
# DoroHelper
|
# DoroHelper
|
||||||
|
|
||||||
PC 端日常任务清理助手。一键清理多项日常事务。支持除国服外的所有客户端。
|
PC 端日常任务清理助手。一键清理多项日常事务。支持除**国服**外的所有客户端。
|
||||||
|
|
||||||
**作者也不玩国服,本脚本以后和将来也不会支持国服**。
|
<p align="center">
|
||||||
|
<img alt="AutoHotkeyV2" src="https://img.shields.io/badge/AutoHotkeyV2-white?logo=AutoHotkey&logoColor=black">
|
||||||
|
<img alt="platform" src="https://img.shields.io/badge/platform-Windows-blueviolet">
|
||||||
|
<img alt="license" src="https://img.shields.io/github/license/1204244136/DoroHelper">
|
||||||
|
<br/>
|
||||||
|
<img alt="commit" src="https://img.shields.io/github/commit-activity/m/1204244136/DoroHelper">
|
||||||
|
<img alt="stars" src="https://img.shields.io/github/stars/1204244136/DoroHelper?style=social">
|
||||||
|
<a href="https://mirrorchyan.com/?source=doro-github-release" target="_blank"><img alt="mirrorc" src="https://img.shields.io/badge/Mirror%E9%85%B1-%239af3f6?logo=countingworkspro&logoColor=4f46e5"></a>
|
||||||
|
</p>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -16,6 +24,8 @@ PC 端日常任务清理助手。一键清理多项日常事务。支持除国
|
||||||
|
|
||||||
- 牢 D 功能类似的[模拟器脚本](https://github.com/takagisanmie/NIKKEAutoScript)
|
- 牢 D 功能类似的[模拟器脚本](https://github.com/takagisanmie/NIKKEAutoScript)
|
||||||
|
|
||||||
|
- 群友的[CDK 兑换网站](http://nikke.hayasa.link/)
|
||||||
|
|
||||||
## 新版本注意
|
## 新版本注意
|
||||||
|
|
||||||
下方的功能介绍均针对最新版本,老版本的对应功能请查看[legacy-v0.1.22](https://github.com/1204244136/DoroHelper/tree/legacy-v0.1.22)分支处的自述文件。
|
下方的功能介绍均针对最新版本,老版本的对应功能请查看[legacy-v0.1.22](https://github.com/1204244136/DoroHelper/tree/legacy-v0.1.22)分支处的自述文件。
|
||||||
|
@ -111,15 +121,20 @@ Doro 只是想让你少被该死的读条、闪光弹和重复劳动折磨。一
|
||||||
|
|
||||||
## 要求
|
## 要求
|
||||||
|
|
||||||
- 16:9 全屏或窗口模式
|
1. 游戏分辨率需要设置成 **16:9** 的分辨率,小于**等于** 1080p 可能有问题,暂不打算特殊支持
|
||||||
|
- 2k 和 4k(包括异形屏)用户请按 ctrl+3 按到画面不动为止,不要开启全屏,此时 nikke 应该是居中的,图片缩放应该是 1
|
||||||
- 设定-画质-开启光晕效果
|
<!-- 2. ~~如果游戏使用**全屏模式**,则需要 显示器屏幕的分辨率也是**16:9**,否则只能使用窗口模式~~
|
||||||
|
- 异形屏或部分笔记本电脑用户需要特别注意这点 -->
|
||||||
- 设定-画质-开启颜色分级
|
2. 由于使用的是图像识别,请确保游戏画面完整在屏幕内,且**游戏画面没有任何遮挡**
|
||||||
- 游戏语言设置为简体中文
|
- 多显示器请支持的显示器作为主显示器,将游戏放在主显示器内
|
||||||
- 以**管理员身份**运行 DoroHelper
|
- 不要使用微星小飞机、游戏加加等悬浮显示数据的软件
|
||||||
|
- 游戏画质越高,脚本出错的几率越低。
|
||||||
- 不要开启 windows HDR 显示
|
- 游戏帧数建议保持 60,帧数过低时,部分场景的行动可能会被吞,导致问题
|
||||||
|
3. 请不要开启会改变画面颜色相关的功能或设置,例如
|
||||||
|
- 软件层面:各种驱动的色彩滤镜,部分笔记本的真彩模式
|
||||||
|
- 设备层面:显示器的护眼模式、色彩模式、色温调节、HDR 等。
|
||||||
|
4. 游戏语言设置为**简体中文**,设定-画质-开启光晕效果,设定-画质-开启颜色分级
|
||||||
|
5. 以**管理员身份**运行 DoroHelper
|
||||||
|
|
||||||
## 步骤
|
## 步骤
|
||||||
|
|
||||||
|
@ -142,8 +157,18 @@ Doro 只是想让你少被该死的读条、闪光弹和重复劳动折磨。一
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
## 星标历程
|
||||||
|
|
||||||
|
[](https://www.star-history.com/#1204244136/DoroHelper&Timeline)
|
||||||
|
|
||||||
## 借物表
|
## 借物表
|
||||||
|
|
||||||
[Github.ahk-API-for-AHKv2](https://github.com/samfisherirl/Github.ahk-API-for-AHKv2)
|
[Github.ahk-API-for-AHKv2](https://github.com/samfisherirl/Github.ahk-API-for-AHKv2)
|
||||||
|
|
||||||
[FindText-for-AHKv2](https://www.autohotkey.com/boards/viewtopic.php?f=83&t=116471)
|
[FindText-for-AHKv2](https://www.autohotkey.com/boards/viewtopic.php?f=83&t=116471)
|
||||||
|
|
||||||
|
## 鸣谢
|
||||||
|
|
||||||
|
代码参考
|
||||||
|
|
||||||
|
[M9A](https://github.com/MAA1999/M9A)
|
||||||
|
|
|
@ -1,325 +0,0 @@
|
||||||
#Requires AutoHotkey v2.0
|
|
||||||
#SingleInstance Force
|
|
||||||
|
|
||||||
; --- 全局变量定义 ---
|
|
||||||
Global MyGui := "" ; GUI 对象
|
|
||||||
Global gFocusedProgramEdit := "" ; 聚焦窗口编辑框
|
|
||||||
Global gCalculatedCoordsEdit := "" ; 换算坐标编辑框 (可编辑)
|
|
||||||
Global gStatusText := "" ; 状态信息文本
|
|
||||||
Global gMouseCoordsEdit := "" ; 鼠标屏幕坐标显示框
|
|
||||||
Global gRelativeMouseCoordsEdit := "" ; 鼠标窗口相对坐标显示框
|
|
||||||
Global gClientAreaEdit := "" ; 客户区矩形显示框
|
|
||||||
Global gPixelColorEdit := "" ; 位置颜色显示框 (十六进制)
|
|
||||||
Global gPixelCharacterBlock := "" ; 显示颜色字符的 Text 控件
|
|
||||||
Global gSelectedRefWidth := 3840 ; 默认目标宽度 (4K)
|
|
||||||
Global gSelectedRefHeight := 2160 ; 默认目标高度 (4K)
|
|
||||||
Global gTargethWnd := "" ; 存储上次记录的目标窗口句柄
|
|
||||||
|
|
||||||
; --- 目标分辨率映射表 ---
|
|
||||||
resolutions := Map(
|
|
||||||
"4K", [3840, 2160],
|
|
||||||
"2K", [2560, 1440],
|
|
||||||
"1080p", [1920, 1080]
|
|
||||||
)
|
|
||||||
defaultRefKey := "4K"
|
|
||||||
|
|
||||||
; --- 获取当前屏幕分辨率 ---
|
|
||||||
currentW := A_ScreenWidth
|
|
||||||
currentH := A_ScreenHeight
|
|
||||||
currentResText := "当前屏幕分辨率: " . currentW . "x" . currentH
|
|
||||||
|
|
||||||
; --- 创建图形用户界面 (GUI) ---
|
|
||||||
MyGui := Gui("+AlwaysOnTop")
|
|
||||||
MyGui.Title := "DDB v1.0"
|
|
||||||
|
|
||||||
; 提示信息
|
|
||||||
MyGui.Add("Text", "xm y+10", "注意:标题栏和边框均不属于客户区")
|
|
||||||
|
|
||||||
; --- 行 1: 当前分辨率 ---
|
|
||||||
MyGui.Add("Text", "xm y+10", currentResText)
|
|
||||||
|
|
||||||
; --- 行 2: 目标分辨率 ---
|
|
||||||
MyGui.Add("Text", "xm y+15", "目标分辨率:")
|
|
||||||
radio4k := MyGui.Add("Radio", "x+m yp vSelectedResName Checked Group", "4K")
|
|
||||||
radio2k := MyGui.Add("Radio", "x+m yp", "2K")
|
|
||||||
radio1080p := MyGui.Add("Radio", "x+m yp", "1080p")
|
|
||||||
|
|
||||||
; --- 行 3: 聚焦窗口 ---
|
|
||||||
MyGui.Add("Text", "xm y+15", "聚焦窗口:")
|
|
||||||
gFocusedProgramEdit := MyGui.Add("Edit", "x+m yp w150 ReadOnly Left")
|
|
||||||
|
|
||||||
; --- 行 4: 屏幕位置 ---
|
|
||||||
MyGui.Add("Text", "xm y+10", "屏幕位置:")
|
|
||||||
gMouseCoordsEdit := MyGui.Add("Edit", "x+m yp w150 ReadOnly Left")
|
|
||||||
|
|
||||||
; --- 行 5: 窗口位置 ---
|
|
||||||
MyGui.Add("Text", "xm y+10", "窗口位置:")
|
|
||||||
gRelativeMouseCoordsEdit := MyGui.Add("Edit", "x+m yp w150 ReadOnly Left")
|
|
||||||
|
|
||||||
; --- 行 6: 客户区矩形 ---
|
|
||||||
MyGui.Add("Text", "xm y+10", "客户区: ") ; 注意标签后的空格是用户特意加的
|
|
||||||
gClientAreaEdit := MyGui.Add("Edit", "x+m yp w150 ReadOnly Left")
|
|
||||||
|
|
||||||
; --- 行 7: 位置颜色 & 复制按钮 & 颜色字符 ---
|
|
||||||
MyGui.Add("Text", "xm y+10", "位置颜色:") ; 标签
|
|
||||||
gPixelColorEdit := MyGui.Add("Edit", "x+m yp w100 ReadOnly Left") ; 显示框
|
|
||||||
copyColorButton := MyGui.Add("Button", "x+m yp", "复制") ; 复制按钮
|
|
||||||
copyColorButton.OnEvent("Click", CopyPixelColor)
|
|
||||||
; 使用带颜色的文本字符 '■' 显示颜色,初始为灰色
|
|
||||||
myGui.SetFont("s12")
|
|
||||||
gPixelCharacterBlock := MyGui.Add("Text", "x+m yp c808080", "■")
|
|
||||||
myGui.SetFont("")
|
|
||||||
|
|
||||||
|
|
||||||
; --- 行 8: 换算坐标 & 复制按钮 & 跳转按钮 ---
|
|
||||||
MyGui.Add("Text", "xm y+10", "换算坐标:")
|
|
||||||
gCalculatedCoordsEdit := MyGui.Add("Edit", "x+m yp w100 Left", "") ; 允许输入
|
|
||||||
copyCoordsButton := MyGui.Add("Button", "x+m yp", "复制")
|
|
||||||
copyCoordsButton.OnEvent("Click", CopyCalculatedCoords)
|
|
||||||
jumpButton := MyGui.Add("Button", "y+10", "跳转") ; 跳转按钮另起一行
|
|
||||||
jumpButton.OnEvent("Click", JumpToCoords)
|
|
||||||
|
|
||||||
; --- 行 9: 状态信息 ---
|
|
||||||
gStatusText := MyGui.Add("Text", "xm y+10 w300 vStatusMessage", "按 Ctrl+Alt+Q 获取鼠标信息") ; 初始提示
|
|
||||||
|
|
||||||
; --- 绑定其他 GUI 事件 ---
|
|
||||||
radio4k.OnEvent("Click", ResolutionChange)
|
|
||||||
radio2k.OnEvent("Click", ResolutionChange)
|
|
||||||
radio1080p.OnEvent("Click", ResolutionChange)
|
|
||||||
MyGui.OnEvent("Close", GuiClose)
|
|
||||||
|
|
||||||
; --- 显示 GUI ---
|
|
||||||
MyGui.Show()
|
|
||||||
|
|
||||||
; ==============================================================================
|
|
||||||
; --- 函数定义 ---
|
|
||||||
; ==============================================================================
|
|
||||||
|
|
||||||
; --- GUI 事件处理: 分辨率选择变化 ---
|
|
||||||
ResolutionChange(GuiCtrlObj, Info) {
|
|
||||||
global gSelectedRefWidth, gSelectedRefHeight, gStatusText, resolutions
|
|
||||||
selectedName := MyGui["SelectedResName"].Value
|
|
||||||
logMsg := ""
|
|
||||||
if RegExMatch(selectedName, "^\w+", &match) {
|
|
||||||
selectedKey := match[0]
|
|
||||||
if resolutions.Has(selectedKey) {
|
|
||||||
gSelectedRefWidth := resolutions[selectedKey][1]
|
|
||||||
gSelectedRefHeight := resolutions[selectedKey][2]
|
|
||||||
logMsg := "目标分辨率已更改为 " . selectedKey . " (" . gSelectedRefWidth . "x" . gSelectedRefHeight . ")"
|
|
||||||
gStatusText.Value := logMsg
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
; --- 热键定义: Ctrl+Alt+Q ---
|
|
||||||
; --- 热键定义: Ctrl+Alt+Q ---
|
|
||||||
^!Q:: {
|
|
||||||
; 引用全局变量
|
|
||||||
global MyGui, gFocusedProgramEdit, gCalculatedCoordsEdit, gStatusText, gSelectedRefWidth, gSelectedRefHeight, gMouseCoordsEdit, gRelativeMouseCoordsEdit, gClientAreaEdit, gTargethWnd, gPixelColorEdit, gPixelCharacterBlock
|
|
||||||
; 定义局部变量
|
|
||||||
local hWnd, progName, winTitle, displayProgInfo, mX, mY, winX, winY, winW, relX, relY, propX, propY, finalX, finalY, isInside := False
|
|
||||||
local pixelColorRGB, strColor, sixDigitColor
|
|
||||||
|
|
||||||
; 检查 gPixelCharacterBlock 是否有效 (保留)
|
|
||||||
if !IsObject(gPixelCharacterBlock) {
|
|
||||||
MsgBox("脚本错误: 颜色字符控件 'gPixelCharacterBlock' 未初始化。" . "请检查 GUI 创建部分代码是否正确执行。", "初始化错误", "IconError")
|
|
||||||
Return
|
|
||||||
}
|
|
||||||
|
|
||||||
; 强制坐标模式
|
|
||||||
CoordMode "Mouse", "Screen"
|
|
||||||
CoordMode "Pixel", "Screen"
|
|
||||||
|
|
||||||
; 清空或重置显示字段
|
|
||||||
gCalculatedCoordsEdit.Value := ""
|
|
||||||
gRelativeMouseCoordsEdit.Value := ""
|
|
||||||
gStatusText.Value := "正在处理..."
|
|
||||||
gMouseCoordsEdit.Value := ""
|
|
||||||
gClientAreaEdit.Value := ""
|
|
||||||
gPixelColorEdit.Value := ""
|
|
||||||
; --- ↓↓↓ 直接重置颜色,不再使用 try-catch ↓↓↓ ---
|
|
||||||
gPixelCharacterBlock.Opt("c808080") ; 重置字符颜色为灰色 (依赖上面的 IsObject 检查)
|
|
||||||
|
|
||||||
; 获取当前活动窗口
|
|
||||||
hWnd := WinActive("A")
|
|
||||||
if (!hWnd) {
|
|
||||||
gStatusText.Value := "错误: 未找到活动窗口。"
|
|
||||||
gFocusedProgramEdit.Value := "N/A"
|
|
||||||
gTargethWnd := ""
|
|
||||||
gPixelCharacterBlock.Opt("c808080") ; ★★★ 直接重置 ★★★
|
|
||||||
Return
|
|
||||||
}
|
|
||||||
gTargethWnd := hWnd
|
|
||||||
|
|
||||||
; 获取并显示窗口信息
|
|
||||||
progName := WinGetProcessName("A")
|
|
||||||
winTitle := WinGetTitle("A")
|
|
||||||
displayProgInfo := progName ? progName : (winTitle ? winTitle : "N/A")
|
|
||||||
gFocusedProgramEdit.Value := displayProgInfo
|
|
||||||
|
|
||||||
; 获取并显示鼠标屏幕坐标
|
|
||||||
MouseGetPos(&mX, &mY)
|
|
||||||
gMouseCoordsEdit.Value := mX . ", " . mY
|
|
||||||
|
|
||||||
; 获取并显示像素颜色 及 更新颜色字符 (保留此处的 try-catch)
|
|
||||||
try {
|
|
||||||
pixelColorRGB := PixelGetColor(mX, mY, "RGB")
|
|
||||||
sixDigitColor := Format("{:06X}", pixelColorRGB)
|
|
||||||
strColor := "0x" . sixDigitColor
|
|
||||||
gPixelCharacterBlock.Opt("c" . sixDigitColor) ; 设置字符颜色
|
|
||||||
gPixelColorEdit.Value := strColor
|
|
||||||
} catch Error as e {
|
|
||||||
gPixelColorEdit.Value := "获取失败: " e.Message
|
|
||||||
gPixelCharacterBlock.Opt("c808080") ; ★★★ 直接重置 ★★★
|
|
||||||
}
|
|
||||||
|
|
||||||
; 获取并显示窗口客户区信息 (保留此处的 try-catch)
|
|
||||||
try {
|
|
||||||
WinGetClientPos(&winX, &winY, &winW, &winH, hWnd)
|
|
||||||
gClientAreaEdit.Value := Format("{},{} {}x{}", winX, winY, winW, winH)
|
|
||||||
} catch Error as e {
|
|
||||||
gStatusText.Value := "错误: 获取客户区失败 - " . e.Message
|
|
||||||
gClientAreaEdit.Value := "Error"
|
|
||||||
gPixelCharacterBlock.Opt("c808080") ; ★★★ 直接重置 ★★★
|
|
||||||
Return
|
|
||||||
}
|
|
||||||
|
|
||||||
; 检查窗口尺寸是否有效
|
|
||||||
if (winW <= 0 or winH <= 0) {
|
|
||||||
gStatusText.Value := "错误: 无效窗口尺寸 W:" . winW . ", H:" . winH
|
|
||||||
gClientAreaEdit.Value := Format("{},{} {}x{}", winX, winY, winW, winH)
|
|
||||||
gPixelCharacterBlock.Opt("c808080") ; ★★★ 直接重置 ★★★
|
|
||||||
Return
|
|
||||||
}
|
|
||||||
|
|
||||||
; 进行边界检查
|
|
||||||
isInside := (mX >= winX and mX < (winX + winW) and mY >= winY and mY < (winY + winH))
|
|
||||||
|
|
||||||
; 根据边界检查结果进行计算和显示
|
|
||||||
if (isInside) {
|
|
||||||
relX := mX - winX
|
|
||||||
relY := mY - winY
|
|
||||||
gRelativeMouseCoordsEdit.Value := relX . ", " . relY
|
|
||||||
|
|
||||||
propX := relX / winW
|
|
||||||
propY := relY / winH
|
|
||||||
finalX := Round(propX * gSelectedRefWidth)
|
|
||||||
finalY := Round(propY * gSelectedRefHeight)
|
|
||||||
gCalculatedCoordsEdit.Value := finalX . ", " . finalY
|
|
||||||
|
|
||||||
gStatusText.Value := "边界检查: 内部"
|
|
||||||
} else {
|
|
||||||
gRelativeMouseCoordsEdit.Value := "N/A"
|
|
||||||
gCalculatedCoordsEdit.Value := ""
|
|
||||||
gStatusText.Value := "边界检查: 外部(请重新聚焦鼠标)"
|
|
||||||
}
|
|
||||||
} ; 热键函数结束 ; 热键函数结束
|
|
||||||
|
|
||||||
; --- 跳转按钮点击处理函数 ---
|
|
||||||
JumpToCoords(GuiCtrlObj, Info) {
|
|
||||||
; 引用全局变量
|
|
||||||
global MyGui, gCalculatedCoordsEdit, gStatusText, gSelectedRefWidth, gSelectedRefHeight, gTargethWnd
|
|
||||||
|
|
||||||
; 定义局部变量
|
|
||||||
local targetX, targetY, propX, propY, desiredRelX, desiredRelY, finalScreenX, finalScreenY
|
|
||||||
local hWnd, winX, winY, winW, winH
|
|
||||||
local inputText, match
|
|
||||||
|
|
||||||
gStatusText.Value := "正在处理跳转..."
|
|
||||||
|
|
||||||
; 检查并使用存储的目标窗口句柄
|
|
||||||
if (!gTargethWnd or !WinExist("ahk_id " . gTargethWnd)) {
|
|
||||||
gStatusText.Value := "错误: 请先用 Ctrl+Alt+Q 记录一个有效的目标窗口。"
|
|
||||||
gTargethWnd := ""
|
|
||||||
Return
|
|
||||||
}
|
|
||||||
hWnd := gTargethWnd
|
|
||||||
|
|
||||||
; 获取并验证用户输入的坐标
|
|
||||||
inputText := gCalculatedCoordsEdit.Value
|
|
||||||
if (!RegExMatch(inputText, "^\s*(-?\d+)\s*[,; ]\s*(-?\d+)\s*$", &match)) {
|
|
||||||
gStatusText.Value := "错误: 无效坐标格式 (请输入 X, Y)"
|
|
||||||
Return
|
|
||||||
}
|
|
||||||
targetX := Integer(match[1])
|
|
||||||
targetY := Integer(match[2])
|
|
||||||
|
|
||||||
; 可选: 检查输入坐标范围
|
|
||||||
if (targetX < 0 or targetX >= gSelectedRefWidth or targetY < 0 or targetY >= gSelectedRefHeight) {
|
|
||||||
gStatusText.Value := "提示: 输入坐标可能超出目标分辨率范围。"
|
|
||||||
}
|
|
||||||
|
|
||||||
; 获取目标窗口的客户区信息
|
|
||||||
try {
|
|
||||||
WinGetClientPos(&winX, &winY, &winW, &winH, hWnd)
|
|
||||||
if (winW <= 0 or winH <= 0) {
|
|
||||||
throw Error("无效窗口尺寸 W:" . winW . ", H:" . winH)
|
|
||||||
}
|
|
||||||
} catch Error as e {
|
|
||||||
gStatusText.Value := "错误: 获取目标窗口客户区失败 - " . e.Message
|
|
||||||
Return
|
|
||||||
}
|
|
||||||
|
|
||||||
; 执行反向换算
|
|
||||||
if (gSelectedRefWidth <= 0 or gSelectedRefHeight <= 0) {
|
|
||||||
gStatusText.Value := "错误: 无效的目标分辨率尺寸用于计算。"
|
|
||||||
Return
|
|
||||||
}
|
|
||||||
propX := targetX / gSelectedRefWidth
|
|
||||||
propY := targetY / gSelectedRefHeight
|
|
||||||
desiredRelX := propX * winW
|
|
||||||
desiredRelY := propY * winH
|
|
||||||
finalScreenX := Round(winX + desiredRelX)
|
|
||||||
finalScreenY := Round(winY + desiredRelY)
|
|
||||||
|
|
||||||
; 尝试重新激活目标窗口
|
|
||||||
try {
|
|
||||||
WinActivate("ahk_id " . hWnd)
|
|
||||||
Sleep 100
|
|
||||||
} catch Error as e {
|
|
||||||
gStatusText.Value := "警告: 激活目标窗口失败 - " e.Message ",仍尝试跳转。"
|
|
||||||
}
|
|
||||||
|
|
||||||
; 移动鼠标
|
|
||||||
CoordMode "Mouse", "Screen"
|
|
||||||
MouseMove finalScreenX, finalScreenY, 0
|
|
||||||
|
|
||||||
; 更新状态
|
|
||||||
gStatusText.Value := "鼠标已跳转至目标窗口对应坐标: " . finalScreenX . ", " . finalScreenY
|
|
||||||
}
|
|
||||||
|
|
||||||
; --- GUI 关闭处理函数 ---
|
|
||||||
GuiClose(GuiObj) {
|
|
||||||
ExitApp()
|
|
||||||
}
|
|
||||||
|
|
||||||
; --- 复制按钮事件处理函数 ---
|
|
||||||
CopyPixelColor(GuiCtrlObj, Info) {
|
|
||||||
global gPixelColorEdit, gStatusText
|
|
||||||
local colorValue
|
|
||||||
|
|
||||||
colorValue := gPixelColorEdit.Value
|
|
||||||
if (colorValue != "" && colorValue != "获取失败") { ; 检查是否有有效内容
|
|
||||||
A_Clipboard := colorValue
|
|
||||||
gStatusText.Value := "颜色值 '" colorValue "' 已复制!"
|
|
||||||
SetTimer(() => (gStatusText.Value == "颜色值 '" colorValue "' 已复制!" ? gStatusText.Value := "" : ""), -2000)
|
|
||||||
} else {
|
|
||||||
gStatusText.Value := "没有有效颜色值可复制。"
|
|
||||||
SetTimer(() => (gStatusText.Value == "没有有效颜色值可复制。" ? gStatusText.Value := "" : ""), -2000)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
CopyCalculatedCoords(GuiCtrlObj, Info) {
|
|
||||||
global gCalculatedCoordsEdit, gStatusText
|
|
||||||
local coordsValue
|
|
||||||
|
|
||||||
coordsValue := gCalculatedCoordsEdit.Value
|
|
||||||
if (coordsValue != "") {
|
|
||||||
A_Clipboard := coordsValue
|
|
||||||
gStatusText.Value := "换算坐标 '" coordsValue "' 已复制!"
|
|
||||||
SetTimer(() => (gStatusText.Value == "换算坐标 '" coordsValue "' 已复制!" ? (gStatusText.Value := "") : ""), -2000)
|
|
||||||
} else {
|
|
||||||
gStatusText.Value := "没有换算坐标可复制。"
|
|
||||||
SetTimer(() => (gStatusText.Value == "没有换算坐标可复制。" ? (gStatusText.Value := "") : ""), -2000)
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -3031,9 +3031,10 @@ int __attribute__((__stdcall__)) PicFind(
|
||||||
. "`nnikkeID := WinGetIDLast(title)"
|
. "`nnikkeID := WinGetIDLast(title)"
|
||||||
. "`nWinGetClientPos &NikkeX, &NikkeY, &NikkeW, &NikkeH, nikkeID"
|
. "`nWinGetClientPos &NikkeX, &NikkeY, &NikkeW, &NikkeH, nikkeID"
|
||||||
. "`nPicTolerance := 1"
|
. "`nPicTolerance := 1"
|
||||||
. "`nTrueRatio := A_ScreenDPI / 96 * NikkeW / 2347"
|
. "`nTrueRatio := NikkeW / 2331"
|
||||||
. "`nt1:=A_TickCount, Text:=X:=Y:=`"`"" s
|
. "`nFindText().PicLib(`"|<" Comment ">" color "$" txt "`", 1)`n"
|
||||||
. "`nif (ok:=FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.1*PicTolerance, 0.1*PicTolerance, Text,,,,,,, TrueRatio, TrueRatio)){"
|
. "`nt1:=A_TickCount, Text:=X:=Y:=`"`""
|
||||||
|
. "`nif (ok:=FindText(&X, &Y, NikkeX, NikkeY, NikkeX + NikkeW, NikkeY + NikkeH, 0.2*PicTolerance, 0.2*PicTolerance, FindText().PicLib(`"" Comment "`"),,,,,,, TrueRatio, TrueRatio)){"
|
||||||
. "`n `; FindText()." . "Click(" . "X, Y, `"L`")"
|
. "`n `; FindText()." . "Click(" . "X, Y, `"L`")"
|
||||||
. "`n}`n"
|
. "`n}`n"
|
||||||
. "`n`; ok:=FindText(&X:=`"wait`", &Y:=3, 0,0,0,0,0,0,Text) `; " r[7]
|
. "`n`; ok:=FindText(&X:=`"wait`", &Y:=3, 0,0,0,0,0,0,Text) `; " r[7]
|
||||||
|
|
Loading…
Reference in New Issue