Compare commits

..

67 commits

Author SHA1 Message Date
Xu
2980a69156 feat: 支持芬兰语 2026-05-12 09:11:04 +08:00
allcontributors[bot]
1840bded7b
docs: add rezorrand as a contributor for translation (#1407)
* docs: update README.md [skip ci]

* docs: update README_ZH.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-05-12 08:57:03 +08:00
Weblate (bot)
8daceb51f9
Translations update from Hosted Weblate (#1406)
* Added translation using Weblate (Finnish)

* Translated using Weblate (Finnish)

Currently translated at 100.0% (312 of 312 strings)

Translation: Magpie/UI
Translate-URL: https://hosted.weblate.org/projects/magpie/ui/fi/

---------

Co-authored-by: Pauli Laatikainen <paarma@gmail.com>
2026-05-12 08:56:04 +08:00
Weblate (bot)
e73483a272
Translated using Weblate (Turkish) (#1404)
Currently translated at 100.0% (312 of 312 strings)

Translation: Magpie/UI
Translate-URL: https://hosted.weblate.org/projects/magpie/ui/tr/

Co-authored-by: İsa Beyit <isabeyit79@gmail.com>
2026-05-05 19:48:52 +08:00
Karl Hook
4a2c3499a3
update: 更新效果 k7 的权重 (#1402) 2026-04-22 22:03:39 +08:00
Karl Hook
cd2388fbbd
feat: 增加效果 k7 (#1400) 2026-04-20 15:59:47 +08:00
allcontributors[bot]
1f809e80b0
docs: add Androidlate as a contributor for translation (#1399)
* docs: update README.md [skip ci]

* docs: update README_ZH.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-04-15 21:20:43 +08:00
Weblate (bot)
626eb5612b
Translated using Weblate (German) (#1398)
Currently translated at 97.7% (305 of 312 strings)

Translation: Magpie/UI
Translate-URL: https://hosted.weblate.org/projects/magpie/ui/de/

Co-authored-by: Raphael <hertzpatrick13@gmail.com>
2026-04-15 21:20:26 +08:00
Weblate (bot)
405fe46f22
Translated using Weblate (Tamil) (#1388)
Currently translated at 100.0% (312 of 312 strings)

Translation: Magpie/UI
Translate-URL: https://hosted.weblate.org/projects/magpie/ui/ta/

Co-authored-by: தமிழ்நேரம் <tamilneram247@gmail.com>
2026-03-21 11:15:45 +08:00
Xu
b57b1aec43 chore: 不再使用全局 WholeProgramOptimization 属性 2026-03-14 12:01:31 +08:00
Weblate (bot)
d1178d4ac4
Translated using Weblate (Italian) (#1386)
Currently translated at 68.5% (214 of 312 strings)

Translation: Magpie/UI
Translate-URL: https://hosted.weblate.org/projects/magpie/ui/it/

Co-authored-by: Matteo Crocetti <matteocrocetti@proton.me>
2026-03-14 11:38:43 +08:00
Xu
359c7ac176 chore: 修复 VS 更新后 _ConanDeps 可能不会触发重新编译 2026-03-12 18:59:45 +08:00
dependabot[bot]
1ffba2f447
chore(deps): bump actions/download-artifact from 7 to 8 (#1382)
Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 7 to 8.
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](https://github.com/actions/download-artifact/compare/v7...v8)

---
updated-dependencies:
- dependency-name: actions/download-artifact
  dependency-version: '8'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-02 20:50:16 +08:00
dependabot[bot]
e3c29dbdf9
chore(deps): bump actions/upload-artifact from 6 to 7 (#1381)
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 6 to 7.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v6...v7)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-02 20:49:49 +08:00
allcontributors[bot]
000257a25a
docs: add arifpedia as a contributor for translation (#1380)
* docs: update README.md [skip ci]

* docs: update README_ZH.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2026-03-02 18:54:37 +08:00
Weblate (bot)
6d50a02af8
Translated using Weblate (Indonesian) (#1379)
Currently translated at 100.0% (312 of 312 strings)

Translation: Magpie/UI
Translate-URL: https://hosted.weblate.org/projects/magpie/ui/id/

Co-authored-by: Arif Budiman <arifpedia@gmail.com>
2026-03-02 18:54:13 +08:00
Xu
06c42c0826
fix: 修复 SettingsCard 中的 TextBox 无法键入空格 (#1376) 2026-02-19 17:09:22 +08:00
Weblate (bot)
198de957aa
Translated using Weblate (German) (#1375)
Currently translated at 71.4% (223 of 312 strings)

Translation: Magpie/UI
Translate-URL: https://hosted.weblate.org/projects/magpie/ui/de/

Co-authored-by: Arved Staske <arved.staske@gmail.com>
2026-02-17 10:18:37 +08:00
Xu
65ffd9a1aa chore: VS 更新后重新编译 conan 依赖 2026-02-13 09:35:48 +08:00
Xu
4e4fde380e chore: CI 升级到 VS2026 2026-02-07 23:00:49 +08:00
Xu
991695168e chore: 更新依赖 2026-01-30 17:15:04 +08:00
Xu
959f93a816 docs: 明确许可协议
close #1370
2026-01-29 16:10:49 +08:00
Xu
a2c6608d9c
Add copyright information to README
Add copyright section specifying project ownership and restrictions.
2026-01-29 14:13:54 +08:00
Weblate (bot)
dc8f59e8e3
Translated using Weblate (Spanish) (#1369)
Currently translated at 85.8% (268 of 312 strings)

Translation: Magpie/UI
Translate-URL: https://hosted.weblate.org/projects/magpie/ui/es/

Co-authored-by: Matias Ranzani <matiasranzani76@gmail.com>
2026-01-28 21:50:01 +08:00
Xu
a5e079b0ee fix: 全屏模式缩放时不限制最小尺寸 2025-12-27 20:16:11 +08:00
Xu
c3473a0604
源窗口有弹窗时不再置顶缩放窗口 (#1356)
* fix: 源窗口有弹窗时缩放窗口不再置顶

* feat: 检测前台窗口 IL

* chore: 修复编译警告和添加注释

* perf: 转到后台等待

* fix: 小优化
2025-12-22 18:53:30 +08:00
Xu
463d6f1246 chore: 工具项目迁移到 VS18 2025-12-18 20:54:15 +08:00
Xu
22484d88e1
修复 Win10 中内存泄漏 (#1355)
* fix: 用 DispatcherQueue 代替 CoreDispatcher 以避免内存泄露

* chore: 优化注释
2025-12-16 20:50:50 +08:00
dependabot[bot]
9ec6c5dc4a
chore(deps): bump actions/upload-artifact from 5 to 6 (#1353)
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 5 to 6.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v5...v6)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-12-15 20:15:41 +08:00
dependabot[bot]
de00805204
chore(deps): bump actions/cache from 4 to 5 (#1352)
Bumps [actions/cache](https://github.com/actions/cache) from 4 to 5.
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](https://github.com/actions/cache/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-12-15 20:15:32 +08:00
dependabot[bot]
60494174ba
chore(deps): bump actions/download-artifact from 6 to 7 (#1351)
Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 6 to 7.
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](https://github.com/actions/download-artifact/compare/v6...v7)

---
updated-dependencies:
- dependency-name: actions/download-artifact
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-12-15 20:15:21 +08:00
Weblate (bot)
6c9c47f3fb
Translated using Weblate (Korean) (#1346)
Currently translated at 100.0% (312 of 312 strings)

Translation: Magpie/UI
Translate-URL: https://hosted.weblate.org/projects/magpie/ui/ko/

Co-authored-by: a6e5aa12f60f4a7a <jyw8484@gmail.com>
2025-12-02 21:15:25 +08:00
allcontributors[bot]
e67ef2b598
docs: add Howard20181 as a contributor for code (#1345)
* docs: update README.md [skip ci]

* docs: update README_ZH.md [skip ci]

* docs: update .all-contributorsrc [skip ci]

---------

Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com>
2025-12-02 18:33:04 +08:00
Howard Wu
b38dbf2c9b
设置文件版本信息 (#1344)
* 设置文件版本信息

不固定为 0.0.0.0,可以不打开应用时读取版本信息
TouchHelper 版本检查和 Updater 检查更新时可以直接从文件读取版本号

* 设置文件版本号时不考虑MP_VERSION_TAG

同时从 public.py 中移除替换逻辑

* chore: RC 优化
1. 用 MP_VERSION_STRING 取代 MP_VERSION_TAG,前者不包含开头的 v 字符
2. RC 文件不再支持 VS 编辑,删除了冗余代码。区域由非特定语言改为 en-US
3. STRINGIFY 和 WIDEN_STRINGIFY 宏移到通用头文件

* chore: 简化 resource.h

* chore: 删除 APSTUDIO_READONLY_SYMBOLS 宏
这个宏供 VS 资源编辑器使用

* chore: 始终定义 MP_MEOW_VERSION
通过 MP_VERSION_STRING 区分开发版本和发布版本

* chore: 简化版本字符串提取
使用了正则表达式的正向先行断言

---------

Co-authored-by: Xu <blinue@outlook.com>
2025-12-02 18:28:58 +08:00
Xu
dc6c65fe14 chore: slnx 指定启动项目 2025-12-01 14:17:10 +08:00
Xu
6fc3594d9d
支持 Visual Studio 2026 (#1343)
* chore: 支持 VS2026

* docs: 更新文档以及排除 pdb

* chore: 修复 pdb 生成

* chore: 禁止 Magpie.Core 生成 pdb

* chore: 清理
2025-11-27 21:57:38 +08:00
dependabot[bot]
2c4e6aa8ca
chore(deps): bump actions/checkout from 5 to 6 (#1342)
Bumps [actions/checkout](https://github.com/actions/checkout) from 5 to 6.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v5...v6)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-11-24 20:25:01 +08:00
Xu
7287e8be40 fix: 修复特定情况下终止缩放时崩溃 2025-11-19 15:47:20 +08:00
Weblate (bot)
45583f105a
Translated using Weblate (French) (#1341)
Currently translated at 91.3% (285 of 312 strings)

Translation: Magpie/UI
Translate-URL: https://hosted.weblate.org/projects/magpie/ui/fr/

Co-authored-by: Rémy Haitayan <remy.haitayan@gmail.com>
2025-11-18 08:26:58 +08:00
Xu
19bf67e285 perf: 删除 CompSwapchainPresenter 中无用传参 2025-11-16 17:15:24 +08:00
Xu
730d73ecea perf: 降低低帧率下 WGC 的延迟 2025-11-14 22:03:29 +08:00
Xu
c10034af50 perf: 优化 Deband 在启用内联效果参数时的性能 2025-11-11 16:11:57 +08:00
CHLBC
bcd5b6fed6 Translated using Weblate (Chinese (Traditional Han script))
Currently translated at 100.0% (312 of 312 strings)

Translation: Magpie/UI
Translate-URL: https://hosted.weblate.org/projects/magpie/ui/zh_Hant/
2025-11-11 14:47:12 +08:00
Xu
046b2868c7 fix: 强制法语字体缓存过期 2025-11-10 19:46:13 +08:00
Xu
15d3e392c4
修复源窗口被最小化时偶尔没有移出屏幕 (#1335)
* fix: 修复源窗口被最小化后没有移出屏幕的错误

* fix: 位于中间状态时不再继续检查

* fix: 修复切换窗口时偶尔源窗口不会被带到顶部

* refactor: 常用 SWP 组合定义为宏

* perf: 提高细粒度

* fix: 置顶窗口可能失败,需多次尝试
2025-11-10 18:41:37 +08:00
Xu
2eb70761c9 fix: 修复叠加层法语显示错误 2025-11-10 09:07:00 +08:00
Weblate (bot)
8fba0716e6
Translations update from Hosted Weblate (#1334)
* Translated using Weblate (French)

Currently translated at 81.0% (253 of 312 strings)

Translation: Magpie/UI
Translate-URL: https://hosted.weblate.org/projects/magpie/ui/fr/

* Translated using Weblate (Russian)

Currently translated at 100.0% (312 of 312 strings)

Translation: Magpie/UI
Translate-URL: https://hosted.weblate.org/projects/magpie/ui/ru/

* Translated using Weblate (Vietnamese)

Currently translated at 100.0% (312 of 312 strings)

Translation: Magpie/UI
Translate-URL: https://hosted.weblate.org/projects/magpie/ui/vi/

---------

Co-authored-by: Louis <mail+github@louisroche.net>
Co-authored-by: Quân Trần <tquanwibu123@gmail.com>
2025-11-07 12:10:10 +08:00
Weblate (bot)
9e48ef9ab5
Translated using Weblate (Japanese) (#1331)
Currently translated at 100.0% (312 of 312 strings)

Translation: Magpie/UI
Translate-URL: https://hosted.weblate.org/projects/magpie/ui/ja/

Co-authored-by: animeojisan <engine54jp@gmail.com>
2025-11-06 11:41:25 +08:00
Xu
1413dc3e69 perf: 优化性能测试模式流畅度 2025-11-05 11:11:55 +08:00
Xu
d3fe8e56bb perf: 避免多个 WM_FRONTEND_RENDER 导致重复渲染 2025-11-04 20:34:41 +08:00
Xu
1b637c774b feat: 实现开发者选项禁用缩放窗口置顶 2025-11-04 19:40:33 +08:00
Xu
b187013b29 perf: 着色器添加 noperspective 修饰符
我们不涉及 3D 渲染,noperspective 可以稍微提高性能
2025-11-04 10:59:29 +08:00
Xu
ac758361c4 chore: 更新依赖 2025-11-04 10:30:12 +08:00
Xu
27037c3b45 fix: 修复窗口模式缩放会遮挡权限更高的窗口 2025-11-04 10:11:18 +08:00
dependabot[bot]
37f38253c7
chore(deps): bump actions/download-artifact from 5 to 6 (#1326)
Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 5 to 6.
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](https://github.com/actions/download-artifact/compare/v5...v6)

---
updated-dependencies:
- dependency-name: actions/download-artifact
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-27 22:02:12 +08:00
dependabot[bot]
1988cde675
chore(deps): bump actions/upload-artifact from 4 to 5 (#1325)
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4 to 5.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-10-27 22:01:56 +08:00
Weblate (bot)
88f6ac243f
Translated using Weblate (Russian) (#1312)
Currently translated at 100.0% (311 of 311 strings)

Translation: Magpie/UI
Translate-URL: https://hosted.weblate.org/projects/magpie/ui/ru/

Co-authored-by: NightFox <NightFox@myied.org>
2025-10-04 08:12:23 +08:00
Weblate (bot)
1afc257050
Translated using Weblate (Chinese (Traditional Han script)) (#1311)
Currently translated at 100.0% (311 of 311 strings)

Translation: Magpie/UI
Translate-URL: https://hosted.weblate.org/projects/magpie/ui/zh_Hant/

Co-authored-by: CHLBC <chris010613@yahoo.com.tw>
2025-10-01 08:36:55 +08:00
Weblate (bot)
4bef67d775
Translated using Weblate (Japanese) (#1308)
Currently translated at 100.0% (311 of 311 strings)

Translation: Magpie/UI
Translate-URL: https://hosted.weblate.org/projects/magpie/ui/ja/

Co-authored-by: animeojisan <engine54jp@gmail.com>
2025-09-23 23:16:18 +08:00
Weblate (bot)
fb46f324c1
Translated using Weblate (Korean) (#1307)
Currently translated at 98.6% (296 of 300 strings)

Translation: Magpie/UI
Translate-URL: https://hosted.weblate.org/projects/magpie/ui/ko/

Co-authored-by: TinyUD <dongwon6073@gmail.com>
2025-09-22 19:28:10 +08:00
Xu
81e314d3a6
存在黑边时支持更改输出画面位置 (#1306)
* feat: 初步实现改变画面位置

* feat: 实现保存配置项和调整选项位置

* feat: 本地化

* chore: 修改措辞

* chore: 修改措辞

* chore: 修改措辞
2025-09-22 19:12:58 +08:00
Weblate (bot)
28bbb84cea
Translated using Weblate (Korean) (#1298)
Currently translated at 92.3% (277 of 300 strings)

Translation: Magpie/UI
Translate-URL: https://hosted.weblate.org/projects/magpie/ui/ko/

Co-authored-by: OkTeak Lim <downmix1@gmail.com>
2025-09-14 09:13:27 +08:00
dependabot[bot]
0d7ba8bd37
chore(deps): bump actions/setup-python from 5 to 6 (#1290)
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 5 to 6.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](https://github.com/actions/setup-python/compare/v5...v6)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-08 19:43:27 +08:00
Weblate (bot)
8fc3205844
Translated using Weblate (Portuguese (Brazil)) (#1289)
Currently translated at 84.6% (254 of 300 strings)

Translation: Magpie/UI
Translate-URL: https://hosted.weblate.org/projects/magpie/ui/pt_BR/

Co-authored-by: Luis <luisfelipekawaii@gmail.com>
2025-09-08 08:00:56 +08:00
Xu
2718439414 fix: 修复复制配置文件时不复制自动隐藏光标配置 2025-09-06 17:45:11 +08:00
Weblate (bot)
74b02f46ab
Translated using Weblate (Russian) (#1280)
Currently translated at 100.0% (300 of 300 strings)

Translation: Magpie/UI
Translate-URL: https://hosted.weblate.org/projects/magpie/ui/ru/

Co-authored-by: udaffskij <udaffskij@gmail.com>
2025-08-28 22:46:10 +08:00
Xu
23b9774716 fix: 将 SGSR.hlsl 复制到输出文件夹 2025-08-27 19:26:18 +08:00
132 changed files with 5950 additions and 1078 deletions

View file

@ -306,6 +306,42 @@
"contributions": [ "contributions": [
"translation" "translation"
] ]
},
{
"login": "Howard20181",
"name": "Howard Wu",
"avatar_url": "https://avatars.githubusercontent.com/u/40033067?v=4",
"profile": "https://github.com/Howard20181",
"contributions": [
"code"
]
},
{
"login": "arifpedia",
"name": "Arif Budiman",
"avatar_url": "https://avatars.githubusercontent.com/u/4081293?v=4",
"profile": "https://github.com/arifpedia",
"contributions": [
"translation"
]
},
{
"login": "Androidlate",
"name": "Raphael",
"avatar_url": "https://avatars.githubusercontent.com/u/194900061?v=4",
"profile": "https://github.com/Androidlate",
"contributions": [
"translation"
]
},
{
"login": "rezorrand",
"name": "Pate L",
"avatar_url": "https://avatars.githubusercontent.com/u/7170353?v=4",
"profile": "https://github.com/rezorrand",
"contributions": [
"translation"
]
} }
], ],
"contributorsPerLine": 7, "contributorsPerLine": 7,

View file

@ -2,30 +2,30 @@ name: build
on: on:
push: push:
paths: [ '.github/workflows/build.yml', 'Magpie.sln', '*.props', 'scripts/publish.py', 'src/**' ] paths: [ '.github/workflows/build.yml', 'Magpie.slnx', '*.props', 'scripts/publish.py', 'src/**' ]
pull_request: pull_request:
paths: [ '.github/workflows/build.yml', 'Magpie.sln', '*.props', 'scripts/publish.py', 'src/**' ] paths: [ '.github/workflows/build.yml', 'Magpie.slnx', '*.props', 'scripts/publish.py', 'src/**' ]
jobs: jobs:
build: build:
runs-on: windows-latest runs-on: windows-2025-vs2026
strategy: strategy:
matrix: matrix:
compiler: ["MSVC", "ClangCL"] compiler: ["MSVC", "ClangCL"]
platform: ["x64", "ARM64"] platform: ["x64", "ARM64"]
steps: steps:
- uses: actions/checkout@v5 - uses: actions/checkout@v6
- uses: actions/setup-python@v5 - uses: actions/setup-python@v6
with: with:
python-version: '3.11' python-version: '3.13'
- name: Setup Conan - name: Setup Conan
run: pip install conan run: pip install conan
- name: Load Conan cache - name: Load Conan cache
uses: actions/cache@v4 uses: actions/cache@v5
with: with:
path: ~/.conan2/p path: ~/.conan2/p
key: Conan-${{ hashFiles('src/**/conanfile.txt') }}-${{ matrix.compiler }}-${{ matrix.platform }} key: Conan-${{ hashFiles('src/**/conanfile.txt') }}-${{ matrix.compiler }}-${{ matrix.platform }}
@ -43,7 +43,7 @@ jobs:
run: echo "sha_short=$(git rev-parse --short HEAD)" >> $env:GITHUB_OUTPUT run: echo "sha_short=$(git rev-parse --short HEAD)" >> $env:GITHUB_OUTPUT
- name: Store build - name: Store build
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v7
with: with:
name: Magpie-dev-${{ steps.hash.outputs.sha_short }}-${{ matrix.compiler }}-${{ matrix.platform }} name: Magpie-dev-${{ steps.hash.outputs.sha_short }}-${{ matrix.compiler }}-${{ matrix.platform }}
path: ./publish/${{ matrix.platform }} path: ./publish/${{ matrix.platform }}

View file

@ -25,18 +25,18 @@ on:
type: boolean type: boolean
jobs: jobs:
build: build:
runs-on: windows-latest runs-on: windows-2025-vs2026
outputs: outputs:
tag: ${{ steps.tag.outputs.tag }} tag: ${{ steps.tag.outputs.tag }}
strategy: strategy:
matrix: matrix:
platform: ["x64", "ARM64"] platform: ["x64", "ARM64"]
steps: steps:
- uses: actions/checkout@v5 - uses: actions/checkout@v6
- uses: actions/setup-python@v5 - uses: actions/setup-python@v6
with: with:
python-version: '3.11' python-version: '3.13'
- name: Setup Conan - name: Setup Conan
run: pip install conan run: pip install conan
@ -48,10 +48,12 @@ jobs:
echo "tag=$tag" >> $env:GITHUB_OUTPUT echo "tag=$tag" >> $env:GITHUB_OUTPUT
- name: Build - name: Build
run: python scripts/publish.py --compiler=ClangCL --platform=${{ matrix.platform }} --version-major=${{ inputs.major }} --version-minor=${{ inputs.minor }} --version-patch=${{ inputs.patch }} --version-tag=${{ steps.tag.outputs.tag }} --pfx-path=certs\Magpie.pfx --pfx-password="${{ secrets.MAGPIE_PFX_PASSWORD }}" run: |
$versionString = "${{ steps.tag.outputs.tag }}" -replace "^v(?=\d)", ""
python scripts/publish.py --compiler=ClangCL --platform=${{ matrix.platform }} --version-major=${{ inputs.major }} --version-minor=${{ inputs.minor }} --version-patch=${{ inputs.patch }} --version-string=$versionString --pfx-path=certs\Magpie.pfx --pfx-password="${{ secrets.MAGPIE_PFX_PASSWORD }}"
- name: Store artifacts - name: Store artifacts
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v7
with: with:
name: Magpie-${{ steps.tag.outputs.tag }}-${{ matrix.platform }} name: Magpie-${{ steps.tag.outputs.tag }}-${{ matrix.platform }}
path: publish/${{ matrix.platform }} path: publish/${{ matrix.platform }}
@ -59,17 +61,17 @@ jobs:
runs-on: windows-latest runs-on: windows-latest
needs: build needs: build
steps: steps:
- uses: actions/checkout@v5 - uses: actions/checkout@v6
- uses: actions/setup-python@v5 - uses: actions/setup-python@v6
with: with:
python-version: '3.11' python-version: '3.13'
- name: Setup Requests - name: Setup Requests
run: pip install requests run: pip install requests
- name: Restore artifacts - name: Restore artifacts
uses: actions/download-artifact@v5 uses: actions/download-artifact@v8
with: with:
path: publish path: publish

View file

@ -10,11 +10,11 @@ jobs:
runs-on: windows-latest runs-on: windows-latest
steps: steps:
- uses: actions/checkout@v5 - uses: actions/checkout@v6
- uses: actions/setup-python@v5 - uses: actions/setup-python@v6
with: with:
python-version: '3.11' python-version: '3.13'
- name: Upload documentations to wiki - name: Upload documentations to wiki
run: python scripts/wiki.py ${{ secrets.CONTENTS_ACCESS_TOKEN }} run: python scripts/wiki.py ${{ secrets.CONTENTS_ACCESS_TOKEN }}

View file

@ -1,118 +0,0 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.1.32228.430
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Magpie", "src\Magpie\Magpie.vcxproj", "{1239537C-E5B8-427A-9E7F-EA443D1F3529}"
ProjectSection(ProjectDependencies) = postProject
{05B51BB8-08CB-4907-884F-8E2AD6BF6052} = {05B51BB8-08CB-4907-884F-8E2AD6BF6052}
{456CCAE4-2C51-4CF2-8D3A-1EFCE8C41A2D} = {456CCAE4-2C51-4CF2-8D3A-1EFCE8C41A2D}
{62503530-B84B-4CC2-80B6-3F89618172B7} = {62503530-B84B-4CC2-80B6-3F89618172B7}
{E82B7A20-0557-4DC1-B418-87977D7450A4} = {E82B7A20-0557-4DC1-B418-87977D7450A4}
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{00AB63C3-0CD3-4944-B8E6-58C86138618D}"
ProjectSection(SolutionItems) = preProject
src\BuildOptions.props = src\BuildOptions.props
src\Common.Post.props = src\Common.Post.props
src\Common.Pre.props = src\Common.Pre.props
Directory.Build.props = Directory.Build.props
src\HybridCRT.props = src\HybridCRT.props
src\WinUI.targets = src\WinUI.targets
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_ConanDeps", "src\_ConanDeps\_ConanDeps.vcxproj", "{456CCAE4-2C51-4CF2-8D3A-1EFCE8C41A2D}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Effects", "src\Effects\Effects.vcxproj", "{62503530-B84B-4CC2-80B6-3F89618172B7}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Magpie.Core", "src\Magpie.Core\Magpie.Core.vcxproj", "{0E5205AE-DFA9-4CB8-B662-E43CD6512E2A}"
ProjectSection(ProjectDependencies) = postProject
{456CCAE4-2C51-4CF2-8D3A-1EFCE8C41A2D} = {456CCAE4-2C51-4CF2-8D3A-1EFCE8C41A2D}
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Natvis", "Natvis", "{9808D34F-5715-4D02-B216-4CB80F46BBC0}"
ProjectSection(SolutionItems) = preProject
natvis\magpie.natvis = natvis\magpie.natvis
natvis\phmap.natvis = natvis\phmap.natvis
natvis\rapidjson.natvis = natvis\rapidjson.natvis
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Updater", "src\Updater\Updater.vcxproj", "{E82B7A20-0557-4DC1-B418-87977D7450A4}"
ProjectSection(ProjectDependencies) = postProject
{456CCAE4-2C51-4CF2-8D3A-1EFCE8C41A2D} = {456CCAE4-2C51-4CF2-8D3A-1EFCE8C41A2D}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TouchHelper", "src\TouchHelper\TouchHelper.vcxproj", "{05B51BB8-08CB-4907-884F-8E2AD6BF6052}"
ProjectSection(ProjectDependencies) = postProject
{456CCAE4-2C51-4CF2-8D3A-1EFCE8C41A2D} = {456CCAE4-2C51-4CF2-8D3A-1EFCE8C41A2D}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Shared", "src\Shared\Shared.vcxitems", "{AABDA3A3-7B23-4189-895B-F68A4C6B14C2}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|ARM64 = Debug|ARM64
Debug|x64 = Debug|x64
Release|ARM64 = Release|ARM64
Release|x64 = Release|x64
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{1239537C-E5B8-427A-9E7F-EA443D1F3529}.Debug|ARM64.ActiveCfg = Debug|ARM64
{1239537C-E5B8-427A-9E7F-EA443D1F3529}.Debug|ARM64.Build.0 = Debug|ARM64
{1239537C-E5B8-427A-9E7F-EA443D1F3529}.Debug|x64.ActiveCfg = Debug|x64
{1239537C-E5B8-427A-9E7F-EA443D1F3529}.Debug|x64.Build.0 = Debug|x64
{1239537C-E5B8-427A-9E7F-EA443D1F3529}.Release|ARM64.ActiveCfg = Release|ARM64
{1239537C-E5B8-427A-9E7F-EA443D1F3529}.Release|ARM64.Build.0 = Release|ARM64
{1239537C-E5B8-427A-9E7F-EA443D1F3529}.Release|x64.ActiveCfg = Release|x64
{1239537C-E5B8-427A-9E7F-EA443D1F3529}.Release|x64.Build.0 = Release|x64
{456CCAE4-2C51-4CF2-8D3A-1EFCE8C41A2D}.Debug|ARM64.ActiveCfg = Debug|ARM64
{456CCAE4-2C51-4CF2-8D3A-1EFCE8C41A2D}.Debug|ARM64.Build.0 = Debug|ARM64
{456CCAE4-2C51-4CF2-8D3A-1EFCE8C41A2D}.Debug|x64.ActiveCfg = Debug|x64
{456CCAE4-2C51-4CF2-8D3A-1EFCE8C41A2D}.Debug|x64.Build.0 = Debug|x64
{456CCAE4-2C51-4CF2-8D3A-1EFCE8C41A2D}.Release|ARM64.ActiveCfg = Release|ARM64
{456CCAE4-2C51-4CF2-8D3A-1EFCE8C41A2D}.Release|ARM64.Build.0 = Release|ARM64
{456CCAE4-2C51-4CF2-8D3A-1EFCE8C41A2D}.Release|x64.ActiveCfg = Release|x64
{456CCAE4-2C51-4CF2-8D3A-1EFCE8C41A2D}.Release|x64.Build.0 = Release|x64
{62503530-B84B-4CC2-80B6-3F89618172B7}.Debug|ARM64.ActiveCfg = Debug|ARM64
{62503530-B84B-4CC2-80B6-3F89618172B7}.Debug|ARM64.Build.0 = Debug|ARM64
{62503530-B84B-4CC2-80B6-3F89618172B7}.Debug|x64.ActiveCfg = Debug|x64
{62503530-B84B-4CC2-80B6-3F89618172B7}.Debug|x64.Build.0 = Debug|x64
{62503530-B84B-4CC2-80B6-3F89618172B7}.Release|ARM64.ActiveCfg = Release|ARM64
{62503530-B84B-4CC2-80B6-3F89618172B7}.Release|ARM64.Build.0 = Release|ARM64
{62503530-B84B-4CC2-80B6-3F89618172B7}.Release|x64.ActiveCfg = Release|x64
{62503530-B84B-4CC2-80B6-3F89618172B7}.Release|x64.Build.0 = Release|x64
{0E5205AE-DFA9-4CB8-B662-E43CD6512E2A}.Debug|ARM64.ActiveCfg = Debug|ARM64
{0E5205AE-DFA9-4CB8-B662-E43CD6512E2A}.Debug|ARM64.Build.0 = Debug|ARM64
{0E5205AE-DFA9-4CB8-B662-E43CD6512E2A}.Debug|x64.ActiveCfg = Debug|x64
{0E5205AE-DFA9-4CB8-B662-E43CD6512E2A}.Debug|x64.Build.0 = Debug|x64
{0E5205AE-DFA9-4CB8-B662-E43CD6512E2A}.Release|ARM64.ActiveCfg = Release|ARM64
{0E5205AE-DFA9-4CB8-B662-E43CD6512E2A}.Release|ARM64.Build.0 = Release|ARM64
{0E5205AE-DFA9-4CB8-B662-E43CD6512E2A}.Release|x64.ActiveCfg = Release|x64
{0E5205AE-DFA9-4CB8-B662-E43CD6512E2A}.Release|x64.Build.0 = Release|x64
{E82B7A20-0557-4DC1-B418-87977D7450A4}.Debug|ARM64.ActiveCfg = Debug|ARM64
{E82B7A20-0557-4DC1-B418-87977D7450A4}.Debug|ARM64.Build.0 = Debug|ARM64
{E82B7A20-0557-4DC1-B418-87977D7450A4}.Debug|x64.ActiveCfg = Debug|x64
{E82B7A20-0557-4DC1-B418-87977D7450A4}.Debug|x64.Build.0 = Debug|x64
{E82B7A20-0557-4DC1-B418-87977D7450A4}.Release|ARM64.ActiveCfg = Release|ARM64
{E82B7A20-0557-4DC1-B418-87977D7450A4}.Release|ARM64.Build.0 = Release|ARM64
{E82B7A20-0557-4DC1-B418-87977D7450A4}.Release|x64.ActiveCfg = Release|x64
{E82B7A20-0557-4DC1-B418-87977D7450A4}.Release|x64.Build.0 = Release|x64
{05B51BB8-08CB-4907-884F-8E2AD6BF6052}.Debug|ARM64.ActiveCfg = Debug|ARM64
{05B51BB8-08CB-4907-884F-8E2AD6BF6052}.Debug|ARM64.Build.0 = Debug|ARM64
{05B51BB8-08CB-4907-884F-8E2AD6BF6052}.Debug|x64.ActiveCfg = Debug|x64
{05B51BB8-08CB-4907-884F-8E2AD6BF6052}.Debug|x64.Build.0 = Debug|x64
{05B51BB8-08CB-4907-884F-8E2AD6BF6052}.Release|ARM64.ActiveCfg = Release|ARM64
{05B51BB8-08CB-4907-884F-8E2AD6BF6052}.Release|ARM64.Build.0 = Release|ARM64
{05B51BB8-08CB-4907-884F-8E2AD6BF6052}.Release|x64.ActiveCfg = Release|x64
{05B51BB8-08CB-4907-884F-8E2AD6BF6052}.Release|x64.Build.0 = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{9808D34F-5715-4D02-B216-4CB80F46BBC0} = {00AB63C3-0CD3-4944-B8E6-58C86138618D}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {0114F74A-3B0C-43A4-AA0E-AB36FD4935F8}
EndGlobalSection
EndGlobal

37
Magpie.slnx Normal file
View file

@ -0,0 +1,37 @@
<Solution>
<Configurations>
<Platform Name="ARM64" />
<Platform Name="x64" />
</Configurations>
<Folder Name="/Solution Items/">
<File Path="Directory.Build.props" />
<File Path="src/BuildOptions.props" />
<File Path="src/Common.Post.props" />
<File Path="src/Common.Pre.props" />
<File Path="src/HybridCRT.props" />
<File Path="src/WinUI.targets" />
</Folder>
<Folder Name="/Solution Items/Natvis/">
<File Path="natvis/magpie.natvis" />
<File Path="natvis/phmap.natvis" />
<File Path="natvis/rapidjson.natvis" />
</Folder>
<Project Path="src/Effects/Effects.vcxproj" Id="62503530-b84b-4cc2-80b6-3f89618172b7" />
<Project Path="src/Magpie.Core/Magpie.Core.vcxproj" Id="0e5205ae-dfa9-4cb8-b662-e43cd6512e2a">
<BuildDependency Project="src/_ConanDeps/_ConanDeps.vcxproj" />
</Project>
<Project Path="src/Magpie/Magpie.vcxproj" Id="1239537c-e5b8-427a-9e7f-ea443d1f3529" DefaultStartup="true">
<BuildDependency Project="src/Effects/Effects.vcxproj" />
<BuildDependency Project="src/TouchHelper/TouchHelper.vcxproj" />
<BuildDependency Project="src/Updater/Updater.vcxproj" />
<BuildDependency Project="src/_ConanDeps/_ConanDeps.vcxproj" />
</Project>
<Project Path="src/Shared/Shared.vcxitems" Id="aabda3a3-7b23-4189-895b-f68a4c6b14c2" />
<Project Path="src/TouchHelper/TouchHelper.vcxproj" Id="05b51bb8-08cb-4907-884f-8e2ad6bf6052">
<BuildDependency Project="src/_ConanDeps/_ConanDeps.vcxproj" />
</Project>
<Project Path="src/Updater/Updater.vcxproj" Id="e82b7a20-0557-4dc1-b418-87977d7450a4">
<BuildDependency Project="src/_ConanDeps/_ConanDeps.vcxproj" />
</Project>
<Project Path="src/_ConanDeps/_ConanDeps.vcxproj" Id="456ccae4-2c51-4cf2-8d3a-1efce8c41a2d" />
</Solution>

View file

@ -107,6 +107,12 @@ Thanks go to these wonderful people:
<td align="center" valign="top" width="14.28%"><a href="https://github.com/TamilNeram"><img src="https://avatars.githubusercontent.com/u/67970539?v=4?s=100" width="100px;" alt="தமிழ் நேரம்"/><br /><sub><b>தமிழ் நேரம்</b></sub></a><br /><a href="#translation-TamilNeram" title="Translation">🌍</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/TamilNeram"><img src="https://avatars.githubusercontent.com/u/67970539?v=4?s=100" width="100px;" alt="தமிழ் நேரம்"/><br /><sub><b>தமிழ் நேரம்</b></sub></a><br /><a href="#translation-TamilNeram" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mhtvsSFrpHdE"><img src="https://avatars.githubusercontent.com/u/10773245?v=4?s=100" width="100px;" alt="mhtvsSFrpHdE"/><br /><sub><b>mhtvsSFrpHdE</b></sub></a><br /><a href="https://github.com/Blinue/Magpie/commits?author=mhtvsSFrpHdE" title="Documentation">📖</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/mhtvsSFrpHdE"><img src="https://avatars.githubusercontent.com/u/10773245?v=4?s=100" width="100px;" alt="mhtvsSFrpHdE"/><br /><sub><b>mhtvsSFrpHdE</b></sub></a><br /><a href="https://github.com/Blinue/Magpie/commits?author=mhtvsSFrpHdE" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kangurek-kao"><img src="https://avatars.githubusercontent.com/u/116571935?v=4?s=100" width="100px;" alt="Krzysztof"/><br /><sub><b>Krzysztof</b></sub></a><br /><a href="#translation-kangurek-kao" title="Translation">🌍</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/kangurek-kao"><img src="https://avatars.githubusercontent.com/u/116571935?v=4?s=100" width="100px;" alt="Krzysztof"/><br /><sub><b>Krzysztof</b></sub></a><br /><a href="#translation-kangurek-kao" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Howard20181"><img src="https://avatars.githubusercontent.com/u/40033067?v=4?s=100" width="100px;" alt="Howard Wu"/><br /><sub><b>Howard Wu</b></sub></a><br /><a href="https://github.com/Blinue/Magpie/commits?author=Howard20181" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/arifpedia"><img src="https://avatars.githubusercontent.com/u/4081293?v=4?s=100" width="100px;" alt="Arif Budiman"/><br /><sub><b>Arif Budiman</b></sub></a><br /><a href="#translation-arifpedia" title="Translation">🌍</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Androidlate"><img src="https://avatars.githubusercontent.com/u/194900061?v=4?s=100" width="100px;" alt="Raphael"/><br /><sub><b>Raphael</b></sub></a><br /><a href="#translation-Androidlate" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/rezorrand"><img src="https://avatars.githubusercontent.com/u/7170353?v=4?s=100" width="100px;" alt="Pate L"/><br /><sub><b>Pate L</b></sub></a><br /><a href="#translation-rezorrand" title="Translation">🌍</a></td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
@ -117,3 +123,7 @@ Thanks go to these wonderful people:
<!-- ALL-CONTRIBUTORS-LIST:END --> <!-- ALL-CONTRIBUTORS-LIST:END -->
This project follows the [all-contributors](https://allcontributors.org/) specification. Contributions of any kind are welcome! This project follows the [all-contributors](https://allcontributors.org/) specification. Contributions of any kind are welcome!
## License
This project is licensed under GPLv3.

View file

@ -106,6 +106,12 @@ Magpie 是一个轻量级的窗口超分辨率工具,内置众多高效的算
<td align="center" valign="top" width="14.28%"><a href="https://github.com/TamilNeram"><img src="https://avatars.githubusercontent.com/u/67970539?v=4?s=100" width="100px;" alt="தமிழ் நேரம்"/><br /><sub><b>தமிழ் நேரம்</b></sub></a><br /><a href="#translation-TamilNeram" title="Translation">🌍</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/TamilNeram"><img src="https://avatars.githubusercontent.com/u/67970539?v=4?s=100" width="100px;" alt="தமிழ் நேரம்"/><br /><sub><b>தமிழ் நேரம்</b></sub></a><br /><a href="#translation-TamilNeram" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mhtvsSFrpHdE"><img src="https://avatars.githubusercontent.com/u/10773245?v=4?s=100" width="100px;" alt="mhtvsSFrpHdE"/><br /><sub><b>mhtvsSFrpHdE</b></sub></a><br /><a href="https://github.com/Blinue/Magpie/commits?author=mhtvsSFrpHdE" title="Documentation">📖</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/mhtvsSFrpHdE"><img src="https://avatars.githubusercontent.com/u/10773245?v=4?s=100" width="100px;" alt="mhtvsSFrpHdE"/><br /><sub><b>mhtvsSFrpHdE</b></sub></a><br /><a href="https://github.com/Blinue/Magpie/commits?author=mhtvsSFrpHdE" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kangurek-kao"><img src="https://avatars.githubusercontent.com/u/116571935?v=4?s=100" width="100px;" alt="Krzysztof"/><br /><sub><b>Krzysztof</b></sub></a><br /><a href="#translation-kangurek-kao" title="Translation">🌍</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/kangurek-kao"><img src="https://avatars.githubusercontent.com/u/116571935?v=4?s=100" width="100px;" alt="Krzysztof"/><br /><sub><b>Krzysztof</b></sub></a><br /><a href="#translation-kangurek-kao" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Howard20181"><img src="https://avatars.githubusercontent.com/u/40033067?v=4?s=100" width="100px;" alt="Howard Wu"/><br /><sub><b>Howard Wu</b></sub></a><br /><a href="https://github.com/Blinue/Magpie/commits?author=Howard20181" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/arifpedia"><img src="https://avatars.githubusercontent.com/u/4081293?v=4?s=100" width="100px;" alt="Arif Budiman"/><br /><sub><b>Arif Budiman</b></sub></a><br /><a href="#translation-arifpedia" title="Translation">🌍</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Androidlate"><img src="https://avatars.githubusercontent.com/u/194900061?v=4?s=100" width="100px;" alt="Raphael"/><br /><sub><b>Raphael</b></sub></a><br /><a href="#translation-Androidlate" title="Translation">🌍</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/rezorrand"><img src="https://avatars.githubusercontent.com/u/7170353?v=4?s=100" width="100px;" alt="Pate L"/><br /><sub><b>Pate L</b></sub></a><br /><a href="#translation-rezorrand" title="Translation">🌍</a></td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
@ -116,3 +122,7 @@ Magpie 是一个轻量级的窗口超分辨率工具,内置众多高效的算
<!-- ALL-CONTRIBUTORS-LIST:END --> <!-- ALL-CONTRIBUTORS-LIST:END -->
本项目遵循 [all-contributors](https://allcontributors.org/) 规范,欢迎任何形式的贡献! 本项目遵循 [all-contributors](https://allcontributors.org/) 规范,欢迎任何形式的贡献!
## 许可协议
本项目采用 GPLv3 许可协议。

View file

@ -196,6 +196,9 @@ Magpie ships with a handful of effects that can be used in combinations. Most of
* Sinc Param: The larger the value is the sharper the images become. Must be greater than 0. Default value: 0.825 * Sinc Param: The larger the value is the sharper the images become. Must be greater than 0. Default value: 0.825
* Anti-ringing Strength: The greater the value is the better the effect becomes, but the images will be more blurry. * Anti-ringing Strength: The greater the value is the better the effect becomes, but the images will be more blurry.
* k7_modernAnime: anime-targeted super-resolution algorithm
* Output size: twice that of the input
* Lanczos: Scaling with the Lanczos algorithm. * Lanczos: Scaling with the Lanczos algorithm.
* Output size: determined by scale configuration * Output size: determined by scale configuration
* Parameters * Parameters

View file

@ -2,7 +2,7 @@
In order to compile Magpie, you need to first install: In order to compile Magpie, you need to first install:
1. The latest version of Visual Studio 2022. You need to install both "Desktop development with C++" and "Universal Windows Platform development" workloads and Windows SDK build 26100 or newer. 1. The latest version of Visual Studio 2022 or 2026. You need to install both "Desktop development with C++" and "Universal Windows Platform development" workloads and Windows SDK build 26100 or newer.
2. [CMake](https://cmake.org/) 2. [CMake](https://cmake.org/)
You can also use the built-in CMake of Visual Studio, which is located at `%ProgramFiles%\Microsoft Visual Studio\2022\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin`. You can also use the built-in CMake of Visual Studio, which is located at `%ProgramFiles%\Microsoft Visual Studio\2022\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin`.
@ -28,7 +28,7 @@ In order to compile Magpie, you need to first install:
git clone https://github.com/Blinue/Magpie git clone https://github.com/Blinue/Magpie
``` ```
2. Open the Magpie.sln in the root directory and build the solution. 2. Open the Magpie.slnx in the root directory and build the solution.
### Enabling Touch Support ### Enabling Touch Support

View file

@ -196,6 +196,9 @@ Magpie 内置了大量效果供组合使用,大部分提供了参数选项以
* Sinc Param值越大图像越锐利 * Sinc Param值越大图像越锐利
* Anti-ringing Strength抗振铃强度 * Anti-ringing Strength抗振铃强度
* k7_modernAnime适合动漫类风格的超分算法
* 输出尺寸:输入的两倍
* Lanczos使用 Lanczos 算法缩放输入。 * Lanczos使用 Lanczos 算法缩放输入。
* 输出尺寸:取决于缩放选项 * 输出尺寸:取决于缩放选项
* 参数 * 参数

View file

@ -2,7 +2,7 @@
为了编译 Magpie你首先需要安装 为了编译 Magpie你首先需要安装
1. Visual Studio 2022 的最新版本,需要安装“使用 C++ 的桌面开发”和“通用 Windows 平台开发”两个工作负荷以及 Windows SDK build 26100 或更高版本。 1. Visual Studio 2022 或 2026 的最新版本,需要安装“使用 C++ 的桌面开发”和“通用 Windows 平台开发”两个工作负荷以及 Windows SDK build 26100 或更高版本。
2. [CMake](https://cmake.org/) 2. [CMake](https://cmake.org/)
你也可以使用 Visual Studio 内置的 CMake它位于 `%ProgramFiles%\Microsoft Visual Studio\2022\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin` 你也可以使用 Visual Studio 内置的 CMake它位于 `%ProgramFiles%\Microsoft Visual Studio\2022\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin`
@ -28,7 +28,7 @@
git clone https://github.com/Blinue/Magpie git clone https://github.com/Blinue/Magpie
``` ```
2. 打开根目录的 Magpie.sln 然后生成解决方案。 2. 打开根目录的 Magpie.slnx 然后生成解决方案。
## 启用触控支持 ## 启用触控支持

View file

@ -2,7 +2,6 @@ import sys
import os import os
import subprocess import subprocess
import glob import glob
import re
import argparse import argparse
try: try:
@ -21,7 +20,7 @@ argParser.add_argument("--use-native-march", action="store_true")
argParser.add_argument("--version-major", type=int, default=0) argParser.add_argument("--version-major", type=int, default=0)
argParser.add_argument("--version-minor", type=int, default=0) argParser.add_argument("--version-minor", type=int, default=0)
argParser.add_argument("--version-patch", type=int, default=0) argParser.add_argument("--version-patch", type=int, default=0)
argParser.add_argument("--version-tag", default="") argParser.add_argument("--version-string", default="")
argParser.add_argument("--pfx-path", default="") argParser.add_argument("--pfx-path", default="")
argParser.add_argument("--pfx-password", default="") argParser.add_argument("--pfx-password", default="")
args = argParser.parse_args() args = argParser.parse_args()
@ -57,44 +56,11 @@ os.chdir(os.path.dirname(__file__) + "\\..")
p = subprocess.run("git rev-parse --short HEAD", capture_output=True) p = subprocess.run("git rev-parse --short HEAD", capture_output=True)
commitId = str(p.stdout, encoding="utf-8")[0:-1] commitId = str(p.stdout, encoding="utf-8")[0:-1]
versionNumProps = "" versionNumProps = f";MajorVersion={args.version_major};MinorVersion={args.version_minor};PatchVersion={args.version_patch}"
if args.version_major != 0 or args.version_minor != 0 or args.version_patch != 0: versionStrProp = "" if args.version_string == "" else f";VersionString={args.version_string}"
versionNumProps = f";MajorVersion={args.version_major};MinorVersion={args.version_minor};PatchVersion={args.version_patch}"
# 更新 RC 文件中的版本号
version = f"{args.version_major}.{args.version_minor}.{args.version_patch}.0"
version_comma = version.replace(".", ",")
for project in os.listdir("src"):
rcPath = f"src\\{project}\\{project}.rc"
if not os.access(rcPath, os.R_OK | os.W_OK):
continue
with open(rcPath, mode="r+", encoding="utf-8") as f:
src = f.read()
src = re.sub(
r"FILEVERSION .*?\n", "FILEVERSION " + version_comma + "\n", src
)
src = re.sub(
r"PRODUCTVERSION .*?\n", "PRODUCTVERSION " + version_comma + "\n", src
)
src = re.sub(
r'"FileVersion", *?".*?"\n', '"FileVersion", "' + version + '"\n', src
)
src = re.sub(
r'"ProductVersion", *?".*?"\n',
'"ProductVersion", "' + version + '"\n',
src,
)
f.seek(0)
f.truncate()
f.write(src)
versionTagProp = "" if args.version_tag == "" else f";VersionTag={args.version_tag}"
p = subprocess.run( p = subprocess.run(
f'"{msbuildPath}" Magpie.sln -m -t:Rebuild -restore -p:RestorePackagesConfig=true;Configuration=Release;Platform={args.platform};UseClangCL={args.compiler == "ClangCL"};UseNativeMicroArch={args.use_native_march};OutDir={os.getcwd()}\\publish\\{args.platform}\\;CommitId={commitId}{versionNumProps}{versionTagProp}' f'"{msbuildPath}" Magpie.slnx -m -t:Rebuild -restore -p:RestorePackagesConfig=true;Configuration=Release;Platform={args.platform};DisablePDB=true;UseClangCL={args.compiler == "ClangCL"};UseNativeMicroArch={args.use_native_march};OutDir={os.getcwd()}\\publish\\{args.platform}\\;CommitId={commitId}{versionNumProps}{versionStrProp}'
) )
if p.returncode != 0: if p.returncode != 0:
raise Exception("编译失败") raise Exception("编译失败")
@ -116,9 +82,8 @@ def remove_file(file):
pass pass
for pattern in ["*.pdb", "*.lib", "*.exp"]: for file in glob.glob("*.lib"):
for file in glob.glob(pattern): remove_file(file)
remove_file(file)
print("清理完毕", flush=True) print("清理完毕", flush=True)

View file

@ -14,12 +14,12 @@
<DebugInfoOnOverlay>false</DebugInfoOnOverlay> <DebugInfoOnOverlay>false</DebugInfoOnOverlay>
<!-- 使用 composition swapchain 呈现 --> <!-- 使用 composition swapchain 呈现 -->
<UseCompSwapchain>false</UseCompSwapchain> <UseCompSwapchain>false</UseCompSwapchain>
<CommitId></CommitId>
<MajorVersion></MajorVersion> <MajorVersion></MajorVersion>
<MinorVersion></MinorVersion> <MinorVersion></MinorVersion>
<PatchVersion></PatchVersion> <PatchVersion></PatchVersion>
<VersionTag></VersionTag> <VersionString></VersionString>
<CommitId></CommitId>
</PropertyGroup> </PropertyGroup>
<!-- 用户自定义编译选项 --> <!-- 用户自定义编译选项 -->

View file

@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!-- Microsoft.Cpp.props 之后导入 -->
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemDefinitionGroup> <ItemDefinitionGroup>
<ClCompile> <ClCompile>
@ -6,12 +7,13 @@
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile> <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<PrecompiledHeaderOutputFile>$(IntDir)pch.pch</PrecompiledHeaderOutputFile> <PrecompiledHeaderOutputFile>$(IntDir)pch.pch</PrecompiledHeaderOutputFile>
<PreprocessorDefinitions>_WINDOWS;WIN32_LEAN_AND_MEAN;WINRT_LEAN_AND_MEAN;WINRT_NO_MODULE_LOCK;WIL_SUPPRESS_EXCEPTIONS;WIL_USE_STL=1;NOGDICAPMASKS;NOICONS;NOATOM;NOCLIPBOARD;NODRAWTEXT;NOMEMMGR;NOMETAFILE;NOMINMAX;NOOPENFILE;NOSCROLL;NOSERVICE;NOSOUND;NOTEXTMETRIC;NOCOMM;NOKANJI;NOHELP;NOPROFILER;NOMCX;NO_SHLWAPI_PATH;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>_WINDOWS;WIN32_LEAN_AND_MEAN;WINRT_LEAN_AND_MEAN;WINRT_NO_MODULE_LOCK;WIL_SUPPRESS_EXCEPTIONS;WIL_USE_STL=1;NOGDICAPMASKS;NOICONS;NOATOM;NOCLIPBOARD;NODRAWTEXT;NOMEMMGR;NOMETAFILE;NOMINMAX;NOOPENFILE;NOSCROLL;NOSERVICE;NOSOUND;NOTEXTMETRIC;NOCOMM;NOKANJI;NOHELP;NOPROFILER;NOMCX;NO_SHLWAPI_PATH;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>MP_MAJOR_VERSION=$(MajorVersion);MP_MINOR_VERSION=$(MinorVersion);MP_PATCH_VERSION=$(PatchVersion);%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions Condition="'$(VersionString)' != ''">MP_VERSION_STRING=$(VersionString);%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions Condition="'$(CommitId)' != ''">MP_COMMIT_ID=$(CommitId);%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions Condition="'$(CommitId)' != ''">MP_COMMIT_ID=$(CommitId);%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions Condition="'$(MajorVersion)' != '' And '$(MinorVersion)' != '' And '$(PatchVersion)' != ''">MP_MAJOR_VERSION=$(MajorVersion);MP_MINOR_VERSION=$(MinorVersion);MP_PATCH_VERSION=$(PatchVersion);%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions Condition="'$(VersionTag)' != ''">MP_VERSION_TAG=$(VersionTag);%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions Condition="$(DebugBorder)">MP_DEBUG_BORDER;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions Condition="$(DebugBorder)">MP_DEBUG_BORDER;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions Condition="$(DebugInfoOnOverlay)">MP_DEBUG_INFO_ON_OVERLAY;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions Condition="$(DebugInfoOnOverlay)">MP_DEBUG_INFO_ON_OVERLAY;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions Condition="$(UseCompSwapchain)">MP_USE_COMPSWAPCHAIN;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions Condition="$(UseCompSwapchain)">MP_USE_COMPSWAPCHAIN;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<DebugInformationFormat Condition="'$(DisablePDB)' == 'true'">None</DebugInformationFormat>
<AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions> <AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions>
<!-- /await:strict: 禁用协程的非标准语言扩展 --> <!-- /await:strict: 禁用协程的非标准语言扩展 -->
<AdditionalOptions Condition="!$(UseClangCL)">/await:strict %(AdditionalOptions)</AdditionalOptions> <AdditionalOptions Condition="!$(UseClangCL)">/await:strict %(AdditionalOptions)</AdditionalOptions>
@ -23,20 +25,42 @@
<AdditionalOptions Condition="$(UseClangCL) And '$(Platform)' == 'x64'">/clang:-mcx16 %(AdditionalOptions)</AdditionalOptions> <AdditionalOptions Condition="$(UseClangCL) And '$(Platform)' == 'x64'">/clang:-mcx16 %(AdditionalOptions)</AdditionalOptions>
<!-- -march=native: 针对当前硬件生成优化代码 --> <!-- -march=native: 针对当前硬件生成优化代码 -->
<AdditionalOptions Condition="$(UseClangCL) And $(UseNativeMicroArch)">/clang:-march=native %(AdditionalOptions)</AdditionalOptions> <AdditionalOptions Condition="$(UseClangCL) And $(UseNativeMicroArch)">/clang:-march=native %(AdditionalOptions)</AdditionalOptions>
<!-- 使用 clang-cl 编译时禁用 cppwinrt 头文件中的编译警告 -->
<AdditionalOptions Condition="$(UseClangCL) And '$(GeneratedFilesDir)' != ''">/clang:-isystem /clang:"$(GeneratedFilesDir)\" %(AdditionalOptions)</AdditionalOptions>
<!-- 修复编译 Shared 中源文件找不到 pch.h 的问题 --> <!-- 修复编译 Shared 中源文件找不到 pch.h 的问题 -->
<AdditionalIncludeDirectories Condition="$(UseClangCL)">.;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <AdditionalIncludeDirectories Condition="$(UseClangCL)">.;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile> </ClCompile>
<ResourceCompile>
<PreprocessorDefinitions>MP_MAJOR_VERSION=$(MajorVersion);MP_MINOR_VERSION=$(MinorVersion);MP_PATCH_VERSION=$(PatchVersion);%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions Condition="'$(VersionString)' != ''">MP_VERSION_STRING=$(VersionString);%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions Condition="'$(CommitId)' != ''">MP_COMMIT_ID=$(CommitId);%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>$(MSBuildThisFileDirectory)\Shared;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
<GenerateDebugInformation Condition="'$(DisablePDB)' == 'true'">false</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)' == 'Debug'"> <ItemDefinitionGroup Condition="'$(Configuration)' == 'Debug'">
<ClCompile> <ClCompile>
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile> </ClCompile>
<ResourceCompile>
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ResourceCompile>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)' == 'Release'"> <ItemDefinitionGroup Condition="'$(Configuration)' == 'Release'">
<ClCompile> <ClCompile>
<!-- Release 下不允许编译警告 --> <!-- Release 下不允许编译警告 -->
<TreatWarningAsError>true</TreatWarningAsError> <TreatWarningAsError>true</TreatWarningAsError>
<!-- 存在同名全局属性,但表现很奇怪。首先,在导入 Microsoft.Cpp.Default.props 之前和之后定义 -->
<!-- 效果不同,似乎在导入前定义才能起作用;其次,全局 WholeProgramOptimization 属性起作用时由 -->
<!-- Microsoft.Cpp.targets 而不是 Microsoft.Cpp.props 更改编译选项,将用户设置覆盖;最后,该 -->
<!-- 属性起作用时会将 LinkTimeCodeGeneration 改为 UseFastLinkTimeCodeGeneration而我们想要 -->
<!-- UseLinkTimeCodeGeneration。为了精确控制编译参数我们不使用全局 -->
<!-- WholeProgramOptimization而是自己定义编译选项。全局 WholeProgramOptimization 影响的属 -->
<!-- 性见 $(VCTargetsPath)\Microsoft.Cpp.WholeProgramOptimization.props。 -->
<WholeProgramOptimization>true</WholeProgramOptimization>
<FunctionLevelLinking>true</FunctionLevelLinking> <FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions> <IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@ -52,6 +76,9 @@
<EnableCOMDATFolding>true</EnableCOMDATFolding> <EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences> <OptimizeReferences>true</OptimizeReferences>
</Link> </Link>
<Lib>
<LinkTimeCodeGeneration>true</LinkTimeCodeGeneration>
</Lib>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<!-- 所有项目共享的头文件 --> <!-- 所有项目共享的头文件 -->

View file

@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!-- Microsoft.Cpp.Default.props 之后导入 -->
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations"> <ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|x64"> <ProjectConfiguration Include="Debug|x64">
@ -22,14 +23,23 @@
<!-- 编译选项 --> <!-- 编译选项 -->
<Import Project="$(MSBuildThisFileDirectory)\BuildOptions.props" /> <Import Project="$(MSBuildThisFileDirectory)\BuildOptions.props" />
<PropertyGroup> <PropertyGroup Label="Globals">
<VS17 Condition="$([System.String]::new('$(MSBuildVersion)').StartsWith('17'))">true</VS17>
<VS17 Condition="'$(VS17)' != 'true'">false</VS17>
<VCProjectVersion Condition="$(VS17)">17.0</VCProjectVersion>
<VCProjectVersion Condition="!$(VS17)">18.0</VCProjectVersion>
<DefaultLanguage>en-US</DefaultLanguage> <DefaultLanguage>en-US</DefaultLanguage>
<MajorVersion Condition="'$(MajorVersion)' == ''">0</MajorVersion>
<MinorVersion Condition="'$(MinorVersion)' == ''">0</MinorVersion>
<PatchVersion Condition="'$(PatchVersion)' == ''">0</PatchVersion>
<!-- 可通过 VersionString 区分开发版本和发布版本 -->
<VersionString Condition="'$(VersionString)' == '' And ('$(MajorVersion)' != '0' Or '$(MinorVersion)' != '0' Or '$(PatchVersion)' != '0')">$(MajorVersion).$(MinorVersion).$(PatchVersion)</VersionString>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Label="Configuration"> <PropertyGroup Label="Configuration">
<PlatformToolset Condition="$(UseClangCL)">ClangCL</PlatformToolset> <PlatformToolset Condition="$(UseClangCL)">ClangCL</PlatformToolset>
<PlatformToolset Condition="!$(UseClangCL)">v143</PlatformToolset> <PlatformToolset Condition="!$(UseClangCL) And $(VS17)">v143</PlatformToolset>
<PlatformToolset Condition="!$(UseClangCL) And !$(VS17)">v145</PlatformToolset>
<UseDebugLibraries Condition="'$(Configuration)' == 'Debug'">true</UseDebugLibraries> <UseDebugLibraries Condition="'$(Configuration)' == 'Debug'">true</UseDebugLibraries>
<WholeProgramOptimization Condition="'$(Configuration)' == 'Release'">true</WholeProgramOptimization>
</PropertyGroup> </PropertyGroup>
</Project> </Project>

View file

@ -106,6 +106,9 @@ float4 Pass1(float2 pos)
// Sample the source pixel // Sample the source pixel
float3 col = INPUT.SampleLevel(sam1, pos, 0).rgb; float3 col = INPUT.SampleLevel(sam1, pos, 0).rgb;
#ifdef MP_INLINE_PARAMS
[unroll]
#endif
for (int i = 1; i <= iterations; i++) { for (int i = 1; i <= iterations; i++) {
// Use the average instead if the difference is below the threshold // Use the average instead if the difference is below the threshold
float3 avg = average(pos, i*range, h); float3 avg = average(pos, i*range, h);

View file

@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Label="Globals"> <PropertyGroup Label="Globals">
<VCProjectVersion>17.0</VCProjectVersion>
<Keyword>Win32Proj</Keyword> <Keyword>Win32Proj</Keyword>
<ProjectGuid>{62503530-b84b-4cc2-80b6-3f89618172b7}</ProjectGuid> <ProjectGuid>{62503530-b84b-4cc2-80b6-3f89618172b7}</ProjectGuid>
<WindowsTargetPlatformVersion>10.0.26100.0</WindowsTargetPlatformVersion> <WindowsTargetPlatformVersion>10.0.26100.0</WindowsTargetPlatformVersion>
@ -428,14 +427,10 @@
<CopyFileToFolders Include="CuNNy\CuNNy-16x16C-NVL-DN.hlsl"> <CopyFileToFolders Include="CuNNy\CuNNy-16x16C-NVL-DN.hlsl">
<FileType>Document</FileType> <FileType>Document</FileType>
</CopyFileToFolders> </CopyFileToFolders>
</ItemGroup>
<ItemGroup>
<CopyFileToFolders Include="NIS\NIS_Scaler.hlsli"> <CopyFileToFolders Include="NIS\NIS_Scaler.hlsli">
<FileType>Document</FileType> <FileType>Document</FileType>
</CopyFileToFolders> </CopyFileToFolders>
<None Include="StubDefs.hlsli" /> <None Include="StubDefs.hlsli" />
</ItemGroup>
<ItemGroup>
<CopyFileToFolders Include="CuNNy2\CuNNy-3x12-NVL.hlsl"> <CopyFileToFolders Include="CuNNy2\CuNNy-3x12-NVL.hlsl">
<FileType>Document</FileType> <FileType>Document</FileType>
</CopyFileToFolders> </CopyFileToFolders>
@ -463,6 +458,12 @@
<CopyFileToFolders Include="CuNNy2\CuNNy-veryfast-NVL.hlsl"> <CopyFileToFolders Include="CuNNy2\CuNNy-veryfast-NVL.hlsl">
<FileType>Document</FileType> <FileType>Document</FileType>
</CopyFileToFolders> </CopyFileToFolders>
<CopyFileToFolders Include="SGSR.hlsl">
<FileType>Document</FileType>
</CopyFileToFolders>
<CopyFileToFolders Include="k7_modernAnime_FHD_x2.hlsl">
<FileType>Document</FileType>
</CopyFileToFolders>
</ItemGroup> </ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
</Project> </Project>

View file

@ -451,6 +451,8 @@
<CopyFileToFolders Include="CuNNy2\CuNNy-veryfast-NVL.hlsl"> <CopyFileToFolders Include="CuNNy2\CuNNy-veryfast-NVL.hlsl">
<Filter>CuNNy2</Filter> <Filter>CuNNy2</Filter>
</CopyFileToFolders> </CopyFileToFolders>
<CopyFileToFolders Include="SGSR.hlsl" />
<CopyFileToFolders Include="k7_modernAnime_FHD_x2.hlsl" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Filter Include="Anime4K"> <Filter Include="Anime4K">

File diff suppressed because it is too large Load diff

View file

@ -130,12 +130,14 @@ bool AdaptivePresenter::BeginFrame(
return true; return true;
} }
void AdaptivePresenter::EndFrame(bool waitForRenderComplete) noexcept { void AdaptivePresenter::EndFrame(bool waitForGpu) noexcept {
if (_isDCompPresenting) { if (_isDCompPresenting) {
_dcompSurface->EndDraw(); _dcompSurface->EndDraw();
} }
if (waitForRenderComplete || _isResized) { if (waitForGpu || _isResized) {
_isResized = false;
// 下面两个调用用于减少调整窗口尺寸时的边缘闪烁。 // 下面两个调用用于减少调整窗口尺寸时的边缘闪烁。
// //
// 我们希望 DWM 绘制新的窗口框架时刚好合成新帧,但这不是我们能控制的,尤其是混合架构 // 我们希望 DWM 绘制新的窗口框架时刚好合成新帧,但这不是我们能控制的,尤其是混合架构
@ -152,10 +154,10 @@ void AdaptivePresenter::EndFrame(bool waitForRenderComplete) noexcept {
// 实用价值。 // 实用价值。
// 等待渲染完成 // 等待渲染完成
_WaitForRenderComplete(); _WaitForGpu();
// 等待 DWM 开始合成新一帧 // 等待 DWM 开始合成新一帧
_WaitForDwmComposition(); Win32Helper::WaitForDwmComposition();
} }
if (_isDCompPresenting) { if (_isDCompPresenting) {
@ -172,21 +174,14 @@ void AdaptivePresenter::EndFrame(bool waitForRenderComplete) noexcept {
_isSwitchingToSwapChain = false; _isSwitchingToSwapChain = false;
// 等待交换链呈现新帧 // 等待交换链呈现新帧
_WaitForRenderComplete(); _WaitForGpu();
_WaitForDwmComposition(); Win32Helper::WaitForDwmComposition();
// 清除 DirectCompostion 内容 // 清除 DirectCompostion 内容
_dcompVisual->SetContent(nullptr); _dcompVisual->SetContent(nullptr);
_dcompDevice->Commit(); _dcompDevice->Commit();
} }
} }
if (_isResized) {
_isResized = false;
} else {
// 确保前一帧渲染完成再渲染下一帧,既降低了 GPU 负载,也能降低延迟
_WaitForRenderComplete();
}
} }
bool AdaptivePresenter::OnResize() noexcept { bool AdaptivePresenter::OnResize() noexcept {

View file

@ -18,7 +18,7 @@ public:
POINT& drawOffset POINT& drawOffset
) noexcept override; ) noexcept override;
void EndFrame(bool waitForRenderComplete = false) noexcept override; void EndFrame(bool waitForGpu = false) noexcept override;
bool OnResize() noexcept override; bool OnResize() noexcept override;

View file

@ -31,9 +31,7 @@ bool CompSwapchainPresenter::_Initialize(HWND hwndAttach) noexcept {
return false; return false;
} }
ID3D11Device5* d3dDevice = _deviceResources->GetD3DDevice(); HRESULT hr = DCompositionCreateDevice3(nullptr, IID_PPV_ARGS(&_dcompDevice));
HRESULT hr = DCompositionCreateDevice3(d3dDevice, IID_PPV_ARGS(&_dcompDevice));
if (FAILED(hr)) { if (FAILED(hr)) {
Logger::Get().ComError("DCompositionCreateDevice3 失败", hr); Logger::Get().ComError("DCompositionCreateDevice3 失败", hr);
return false; return false;
@ -58,7 +56,7 @@ bool CompSwapchainPresenter::_Initialize(HWND hwndAttach) noexcept {
} }
winrt::com_ptr<IPresentationFactory> presentationFactory = winrt::com_ptr<IPresentationFactory> presentationFactory =
CreatePresentationFactory(d3dDevice); CreatePresentationFactory(_deviceResources->GetD3DDevice());
if (!presentationFactory) { if (!presentationFactory) {
Logger::Get().Error("CreatePresentationFactory 失败"); Logger::Get().Error("CreatePresentationFactory 失败");
return false; return false;
@ -228,15 +226,15 @@ bool CompSwapchainPresenter::BeginFrame(
return true; return true;
} }
void CompSwapchainPresenter::EndFrame(bool waitForRenderComplete) noexcept { void CompSwapchainPresenter::EndFrame(bool waitForGpu) noexcept {
if (waitForRenderComplete || _isResized) { if (waitForGpu || _isResized) {
// 下面两个调用用于减少调整窗口尺寸时的边缘闪烁,参见 AdaptivePresenter::EndFrame // 下面两个调用用于减少调整窗口尺寸时的边缘闪烁,参见 AdaptivePresenter::EndFrame
// 等待渲染完成 // 等待渲染完成
_WaitForRenderComplete(); _WaitForGpu();
// 等待 DWM 开始合成新一帧 // 等待 DWM 开始合成新一帧
_WaitForDwmComposition(); Win32Helper::WaitForDwmComposition();
} }
_presentationManager->Present(); _presentationManager->Present();
@ -245,7 +243,7 @@ void CompSwapchainPresenter::EndFrame(bool waitForRenderComplete) noexcept {
_isResized = false; _isResized = false;
} else { } else {
// 确保前一帧渲染完成再渲染下一帧,既降低了 GPU 负载,也能降低延迟 // 确保前一帧渲染完成再渲染下一帧,既降低了 GPU 负载,也能降低延迟
_WaitForRenderComplete(); _WaitForGpu();
} }
} }

View file

@ -16,7 +16,7 @@ public:
POINT& drawOffset POINT& drawOffset
) noexcept override; ) noexcept override;
void EndFrame(bool waitForRenderComplete = false) noexcept override; void EndFrame(bool waitForGpu = false) noexcept override;
bool OnResize() noexcept override; bool OnResize() noexcept override;

View file

@ -39,9 +39,8 @@ struct VertexPositionTexture {
XMFLOAT2 position; XMFLOAT2 position;
XMFLOAT2 textureCoordinate; XMFLOAT2 textureCoordinate;
static constexpr D3D11_INPUT_ELEMENT_DESC InputElements[] = static constexpr D3D11_INPUT_ELEMENT_DESC InputElements[] = {
{ { "POSITION", 0, DXGI_FORMAT_R32G32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "SV_POSITION", 0, DXGI_FORMAT_R32G32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 },
}; };
}; };

View file

@ -90,6 +90,15 @@ FrameSourceState GraphicsCaptureFrameSource::_Update() noexcept {
return FrameSourceState::Waiting; return FrameSourceState::Waiting;
} }
// 取最新帧,帧率较低时可以有效降低延迟
while (true) {
if (winrt::Direct3D11CaptureFrame nextFrame = _captureFramePool.TryGetNextFrame()) {
frame = std::move(nextFrame);
} else {
break;
}
}
// 从帧获取 IDXGISurface // 从帧获取 IDXGISurface
winrt::IDirect3DSurface d3dSurface = frame.Surface(); winrt::IDirect3DSurface d3dSurface = frame.Surface();
@ -314,7 +323,7 @@ bool GraphicsCaptureFrameSource::_StartCapture() noexcept {
_captureFramePool = winrt::Direct3D11CaptureFramePool::Create( _captureFramePool = winrt::Direct3D11CaptureFramePool::Create(
_wrappedD3DDevice, _wrappedD3DDevice,
winrt::DirectXPixelFormat::B8G8R8A8UIntNormalized, winrt::DirectXPixelFormat::B8G8R8A8UIntNormalized,
1, // 帧的缓存数量 4, // 帧的缓存数量,更大的值有利于在低帧率下降低延迟
{ (int)_frameBox.right, (int)_frameBox.bottom } // 帧的尺寸为包含源窗口的最小尺寸 { (int)_frameBox.right, (int)_frameBox.bottom } // 帧的尺寸为包含源窗口的最小尺寸
); );

View file

@ -226,7 +226,7 @@ bool ImGuiBackend::_CreateDeviceObjects() noexcept {
} }
static constexpr D3D11_INPUT_ELEMENT_DESC LOCAL_LAYOUT[] = { static constexpr D3D11_INPUT_ELEMENT_DESC LOCAL_LAYOUT[] = {
{ "SV_POSITION", 0, DXGI_FORMAT_R32G32_FLOAT, 0, (UINT)IM_OFFSETOF(ImDrawVert, pos), D3D11_INPUT_PER_VERTEX_DATA, 0 }, { "POSITION", 0, DXGI_FORMAT_R32G32_FLOAT, 0, (UINT)IM_OFFSETOF(ImDrawVert, pos), D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, (UINT)IM_OFFSETOF(ImDrawVert, uv), D3D11_INPUT_PER_VERTEX_DATA, 0 }, { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, (UINT)IM_OFFSETOF(ImDrawVert, uv), D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "COLOR", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, (UINT)IM_OFFSETOF(ImDrawVert, col), D3D11_INPUT_PER_VERTEX_DATA, 0 }, { "COLOR", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, (UINT)IM_OFFSETOF(ImDrawVert, col), D3D11_INPUT_PER_VERTEX_DATA, 0 },
}; };

View file

@ -139,7 +139,7 @@ struct serializer<
namespace Magpie { namespace Magpie {
// 缓存版本号。当缓存文件结构有更改时更新它,使旧缓存失效 // 缓存版本号。当缓存文件结构有更改时更新它,使旧缓存失效
static constexpr uint32_t FONTS_CACHE_VERSION = 6; static constexpr uint32_t FONTS_CACHE_VERSION = 7;
static std::wstring GetCacheFileName(const std::wstring_view& language, uint32_t dpi) noexcept { static std::wstring GetCacheFileName(const std::wstring_view& language, uint32_t dpi) noexcept {
return fmt::format(L"{}\\fonts_{}_{}", CommonSharedConstants::CACHE_DIR, language, dpi); return fmt::format(L"{}\\fonts_{}_{}", CommonSharedConstants::CACHE_DIR, language, dpi);

View file

@ -48,11 +48,6 @@ private:
ImGuiBackend _backend; ImGuiBackend _backend;
phmap::flat_hash_map<std::string, ImVec4> _windowRects; phmap::flat_hash_map<std::string, ImVec4> _windowRects;
uint32_t _handlerId = 0;
HANDLE _hHookThread = NULL;
DWORD _hookThreadId = 0;
}; };
} }

View file

@ -7,7 +7,6 @@
<CppWinRTRootNamespaceAutoMerge>true</CppWinRTRootNamespaceAutoMerge> <CppWinRTRootNamespaceAutoMerge>true</CppWinRTRootNamespaceAutoMerge>
<CppWinRTGenerateWindowsMetadata>false</CppWinRTGenerateWindowsMetadata> <CppWinRTGenerateWindowsMetadata>false</CppWinRTGenerateWindowsMetadata>
<CppWinRTVerbosity>low</CppWinRTVerbosity> <CppWinRTVerbosity>low</CppWinRTVerbosity>
<VCProjectVersion>17.0</VCProjectVersion>
<Keyword>Win32Proj</Keyword> <Keyword>Win32Proj</Keyword>
<ProjectGuid>{0e5205ae-dfa9-4cb8-b662-e43cd6512e2a}</ProjectGuid> <ProjectGuid>{0e5205ae-dfa9-4cb8-b662-e43cd6512e2a}</ProjectGuid>
<WindowsTargetPlatformVersion>10.0.26100.0</WindowsTargetPlatformVersion> <WindowsTargetPlatformVersion>10.0.26100.0</WindowsTargetPlatformVersion>
@ -154,15 +153,15 @@
</ItemGroup> </ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets"> <ImportGroup Label="ExtensionTargets">
<Import Project="..\..\packages\Microsoft.Windows.ImplementationLibrary.1.0.250325.1\build\native\Microsoft.Windows.ImplementationLibrary.targets" Condition="Exists('..\..\packages\Microsoft.Windows.ImplementationLibrary.1.0.250325.1\build\native\Microsoft.Windows.ImplementationLibrary.targets')" />
<Import Project="..\..\packages\Microsoft.Windows.CppWinRT.2.0.250303.1\build\native\Microsoft.Windows.CppWinRT.targets" Condition="Exists('..\..\packages\Microsoft.Windows.CppWinRT.2.0.250303.1\build\native\Microsoft.Windows.CppWinRT.targets')" /> <Import Project="..\..\packages\Microsoft.Windows.CppWinRT.2.0.250303.1\build\native\Microsoft.Windows.CppWinRT.targets" Condition="Exists('..\..\packages\Microsoft.Windows.CppWinRT.2.0.250303.1\build\native\Microsoft.Windows.CppWinRT.targets')" />
<Import Project="..\..\packages\Microsoft.Windows.ImplementationLibrary.1.0.260126.7\build\native\Microsoft.Windows.ImplementationLibrary.targets" Condition="Exists('..\..\packages\Microsoft.Windows.ImplementationLibrary.1.0.260126.7\build\native\Microsoft.Windows.ImplementationLibrary.targets')" />
</ImportGroup> </ImportGroup>
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild"> <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup> <PropertyGroup>
<ErrorText>这台计算机上缺少此项目引用的 NuGet 程序包。使用“NuGet 程序包还原”可下载这些程序包。有关更多信息,请参见 http://go.microsoft.com/fwlink/?LinkID=322105。缺少的文件是 {0}。</ErrorText> <ErrorText>这台计算机上缺少此项目引用的 NuGet 程序包。使用“NuGet 程序包还原”可下载这些程序包。有关更多信息,请参见 http://go.microsoft.com/fwlink/?LinkID=322105。缺少的文件是 {0}。</ErrorText>
</PropertyGroup> </PropertyGroup>
<Error Condition="!Exists('..\..\packages\Microsoft.Windows.ImplementationLibrary.1.0.250325.1\build\native\Microsoft.Windows.ImplementationLibrary.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.Windows.ImplementationLibrary.1.0.250325.1\build\native\Microsoft.Windows.ImplementationLibrary.targets'))" />
<Error Condition="!Exists('..\..\packages\Microsoft.Windows.CppWinRT.2.0.250303.1\build\native\Microsoft.Windows.CppWinRT.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.Windows.CppWinRT.2.0.250303.1\build\native\Microsoft.Windows.CppWinRT.props'))" /> <Error Condition="!Exists('..\..\packages\Microsoft.Windows.CppWinRT.2.0.250303.1\build\native\Microsoft.Windows.CppWinRT.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.Windows.CppWinRT.2.0.250303.1\build\native\Microsoft.Windows.CppWinRT.props'))" />
<Error Condition="!Exists('..\..\packages\Microsoft.Windows.CppWinRT.2.0.250303.1\build\native\Microsoft.Windows.CppWinRT.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.Windows.CppWinRT.2.0.250303.1\build\native\Microsoft.Windows.CppWinRT.targets'))" /> <Error Condition="!Exists('..\..\packages\Microsoft.Windows.CppWinRT.2.0.250303.1\build\native\Microsoft.Windows.CppWinRT.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.Windows.CppWinRT.2.0.250303.1\build\native\Microsoft.Windows.CppWinRT.targets'))" />
<Error Condition="!Exists('..\..\packages\Microsoft.Windows.ImplementationLibrary.1.0.260126.7\build\native\Microsoft.Windows.ImplementationLibrary.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.Windows.ImplementationLibrary.1.0.260126.7\build\native\Microsoft.Windows.ImplementationLibrary.targets'))" />
</Target> </Target>
</Project> </Project>

View file

@ -340,10 +340,12 @@ SmallVector<ImWchar> OverlayDrawer::_BuildFontUI(
SetGlyphRanges(ranges, OverlayHelper::BASIC_LATIN_RANGES); SetGlyphRanges(ranges, OverlayHelper::BASIC_LATIN_RANGES);
} else if (language == L"ru" || language == L"uk") { } else if (language == L"ru" || language == L"uk") {
SetGlyphRanges(ranges, fontAtlas.GetGlyphRangesCyrillic()); SetGlyphRanges(ranges, fontAtlas.GetGlyphRangesCyrillic());
} else if (language == L"tr" || language == L"pl") { } else if (language == L"tr" || language == L"pl" || language == L"fi") {
SetGlyphRanges(ranges, OverlayHelper::EXTENDED_LATIN_RANGES); SetGlyphRanges(ranges, OverlayHelper::EXTENDED_LATIN_RANGES);
} else if (language == L"vi") { } else if (language == L"vi") {
SetGlyphRanges(ranges, fontAtlas.GetGlyphRangesVietnamese()); SetGlyphRanges(ranges, fontAtlas.GetGlyphRangesVietnamese());
} else if (language == L"fr") {
SetGlyphRanges(ranges, OverlayHelper::FRENCH_RANGES);
} else { } else {
// Basic Latin 使用默认字体 // Basic Latin 使用默认字体
SetGlyphRanges(ranges, OverlayHelper::BASIC_LATIN_RANGES); SetGlyphRanges(ranges, OverlayHelper::BASIC_LATIN_RANGES);

View file

@ -18,6 +18,8 @@ struct OverlayHelper {
// Basic Latin + Latin-1 Supplement + Latin Extended-A用于土耳其语、波兰语等。 // Basic Latin + Latin-1 Supplement + Latin Extended-A用于土耳其语、波兰语等。
// 参见 https://en.wikipedia.org/wiki/Latin_Extended-A // 参见 https://en.wikipedia.org/wiki/Latin_Extended-A
static constexpr ImWchar EXTENDED_LATIN_RANGES[] = { 0x20, 0x17F }; static constexpr ImWchar EXTENDED_LATIN_RANGES[] = { 0x20, 0x17F };
// 法语字符,包含 EXTENDED_LATIN_RANGES + General Punctuation
static constexpr ImWchar FRENCH_RANGES[] = { 0x20, 0x17F, 0x2000, 0x206F };
///////////////////////////////////////////////////// /////////////////////////////////////////////////////
// //

View file

@ -3,9 +3,6 @@
#include "DeviceResources.h" #include "DeviceResources.h"
#include "Logger.h" #include "Logger.h"
#include "ScalingWindow.h" #include "ScalingWindow.h"
#include "Win32Helper.h"
#include <dcomp.h>
#include <dwmapi.h>
namespace Magpie { namespace Magpie {
@ -30,64 +27,12 @@ bool PresenterBase::Initialize(HWND hwndAttach, const DeviceResources& deviceRes
return _Initialize(hwndAttach); return _Initialize(hwndAttach);
} }
void PresenterBase::_WaitForDwmComposition() noexcept {
// Win11 可以使用准确的 DCompositionWaitForCompositorClock
if (Win32Helper::GetOSVersion().IsWin11()) {
static const auto dCompositionWaitForCompositorClock =
Win32Helper::LoadSystemFunction<decltype(DCompositionWaitForCompositorClock)>(
L"dcomp.dll", "DCompositionWaitForCompositorClock");
if (dCompositionWaitForCompositorClock) {
dCompositionWaitForCompositorClock(0, nullptr, INFINITE);
return;
}
}
LARGE_INTEGER qpf;
QueryPerformanceFrequency(&qpf);
qpf.QuadPart /= 10000000;
DWM_TIMING_INFO info{};
info.cbSize = sizeof(info);
DwmGetCompositionTimingInfo(NULL, &info);
LARGE_INTEGER time;
QueryPerformanceCounter(&time);
if (time.QuadPart >= (LONGLONG)info.qpcCompose) {
return;
}
// 提前 1ms 结束然后忙等待
time.QuadPart += 10000;
if (time.QuadPart < (LONGLONG)info.qpcCompose) {
LARGE_INTEGER liDueTime{
.QuadPart = -((LONGLONG)info.qpcCompose - time.QuadPart) / qpf.QuadPart
};
static HANDLE timer = CreateWaitableTimerEx(nullptr, nullptr,
CREATE_WAITABLE_TIMER_HIGH_RESOLUTION, TIMER_ALL_ACCESS);
SetWaitableTimerEx(timer, &liDueTime, 0, NULL, NULL, 0, 0);
WaitForSingleObject(timer, INFINITE);
} else {
Sleep(0);
}
while (true) {
QueryPerformanceCounter(&time);
if (time.QuadPart >= (LONGLONG)info.qpcCompose) {
return;
}
Sleep(0);
}
}
uint32_t PresenterBase::_CalcBufferCount() noexcept { uint32_t PresenterBase::_CalcBufferCount() noexcept {
// 缓冲区数量取决于 ScalingRuntime::_ScalingThreadProc 中检查光标移动的频率 // 缓冲区数量取决于 ScalingRuntime::_ScalingThreadProc 中检查光标移动的频率
return ScalingWindow::Get().Options().Is3DGameMode() ? 4 : 8; return ScalingWindow::Get().Options().Is3DGameMode() ? 4 : 8;
} }
void PresenterBase::_WaitForRenderComplete() noexcept { void PresenterBase::_WaitForGpu() noexcept {
ID3D11DeviceContext4* d3dDC = _deviceResources->GetD3DDC(); ID3D11DeviceContext4* d3dDC = _deviceResources->GetD3DDC();
// 等待渲染完成 // 等待渲染完成

View file

@ -16,7 +16,7 @@ public:
POINT& drawOffset POINT& drawOffset
) noexcept = 0; ) noexcept = 0;
virtual void EndFrame(bool waitForRenderComplete = false) noexcept = 0; virtual void EndFrame(bool waitForGpu = false) noexcept = 0;
virtual bool OnResize() noexcept = 0; virtual bool OnResize() noexcept = 0;
@ -27,10 +27,7 @@ public:
protected: protected:
virtual bool _Initialize(HWND hwndAttach) noexcept = 0; virtual bool _Initialize(HWND hwndAttach) noexcept = 0;
void _WaitForRenderComplete() noexcept; void _WaitForGpu() noexcept;
// 和 DwmFlush 效果相同但更准确
static void _WaitForDwmComposition() noexcept;
static uint32_t _CalcBufferCount() noexcept; static uint32_t _CalcBufferCount() noexcept;

View file

@ -199,7 +199,7 @@ winrt::fire_and_forget Renderer::TakeScreenshot(
} }
} }
void Renderer::_FrontendRender(bool waitForRenderComplete) noexcept { void Renderer::_FrontendRender(bool waitForGpu) noexcept {
winrt::com_ptr<ID3D11Texture2D> frameTex; winrt::com_ptr<ID3D11Texture2D> frameTex;
winrt::com_ptr<ID3D11RenderTargetView> frameRtv; winrt::com_ptr<ID3D11RenderTargetView> frameRtv;
POINT drawOffset; POINT drawOffset;
@ -267,10 +267,10 @@ void Renderer::_FrontendRender(bool waitForRenderComplete) noexcept {
// 绘制光标 // 绘制光标
_cursorDrawer.Draw(frameTex.get(), drawOffset); _cursorDrawer.Draw(frameTex.get(), drawOffset);
_presenter->EndFrame(waitForRenderComplete); _presenter->EndFrame(waitForGpu);
} }
bool Renderer::Render(bool force, bool waitForRenderComplete) noexcept { bool Renderer::Render(bool force, bool waitForGpu) noexcept {
if (!force && _lastAccessMutexKey == _sharedTextureMutexKey.load(std::memory_order_relaxed)) { if (!force && _lastAccessMutexKey == _sharedTextureMutexKey.load(std::memory_order_relaxed)) {
if (_lastAccessMutexKey == 0) { if (_lastAccessMutexKey == 0) {
// 第一帧尚未完成 // 第一帧尚未完成
@ -282,7 +282,7 @@ bool Renderer::Render(bool force, bool waitForRenderComplete) noexcept {
} }
} }
_FrontendRender(waitForRenderComplete); _FrontendRender(waitForGpu);
return true; return true;
} }
@ -699,14 +699,43 @@ ID3D11Texture2D* Renderer::_ResizeEffects() noexcept {
void Renderer::_UpdateDestRect() noexcept { void Renderer::_UpdateDestRect() noexcept {
const RECT& rendererRect = ScalingWindow::Get().RendererRect(); const RECT& rendererRect = ScalingWindow::Get().RendererRect();
DestAlignment alignment = ScalingWindow::Get().Options().destAlignment;
D3D11_TEXTURE2D_DESC desc; LONG destWidth;
_frontendSharedTexture->GetDesc(&desc); LONG destHeight;
{
D3D11_TEXTURE2D_DESC desc;
_frontendSharedTexture->GetDesc(&desc);
destWidth = (LONG)desc.Width;
destHeight = (LONG)desc.Height;
}
_destRect.left = (rendererRect.left + rendererRect.right - (LONG)desc.Width) / 2; using enum DestAlignment;
_destRect.top = (rendererRect.top + rendererRect.bottom - (LONG)desc.Height) / 2;
_destRect.right = _destRect.left + (LONG)desc.Width; if (alignment == LeftTop || alignment == Left || alignment == LeftBottom) {
_destRect.bottom = _destRect.top + (LONG)desc.Height; _destRect.left = 0;
_destRect.right = destWidth;
} else if (alignment == Top || alignment == Center || alignment == Bottom) {
_destRect.left = (rendererRect.left + rendererRect.right - destWidth) / 2;
_destRect.right = _destRect.left + destWidth;
} else {
_destRect.left = rendererRect.right - destWidth;
_destRect.right = rendererRect.right;
}
if (alignment == LeftTop || alignment == Top || alignment == RightTop) {
_destRect.top = 0;
_destRect.bottom = destHeight;
} else if (alignment == Left || alignment == Center || alignment == Right) {
_destRect.top = (rendererRect.top + rendererRect.bottom - destHeight) / 2;
_destRect.bottom = _destRect.top + destHeight;
} else {
_destRect.top = rendererRect.bottom - destHeight;
_destRect.bottom = rendererRect.bottom;
}
assert(_destRect.left + destWidth == _destRect.right);
assert(_destRect.top + destHeight == _destRect.bottom);
} }
HANDLE Renderer::_CreateSharedTexture(ID3D11Texture2D* effectsOutput) noexcept { HANDLE Renderer::_CreateSharedTexture(ID3D11Texture2D* effectsOutput) noexcept {

View file

@ -22,7 +22,7 @@ public:
ScalingError Initialize(HWND hwndAttach, OverlayOptions& overlayOptions) noexcept; ScalingError Initialize(HWND hwndAttach, OverlayOptions& overlayOptions) noexcept;
bool Render(bool force = false, bool waitForRenderComplete = false) noexcept; bool Render(bool force = false, bool waitForGpu = false) noexcept;
bool OnResize() noexcept; bool OnResize() noexcept;
@ -66,7 +66,7 @@ public:
) noexcept; ) noexcept;
private: private:
void _FrontendRender(bool waitForRenderComplete = false) noexcept; void _FrontendRender(bool waitForGpu = false) noexcept;
void _BackendThreadProc() noexcept; void _BackendThreadProc() noexcept;

View file

@ -41,6 +41,7 @@ void ScalingOptions::Log() const noexcept {
IsWindowedMode: {} IsWindowedMode: {}
IsDebugMode: {} IsDebugMode: {}
IsBenchmarkMode: {} IsBenchmarkMode: {}
IsTopmostDisabled: {}
IsFP16Disabled: {} IsFP16Disabled: {}
IsEffectCacheDisabled: {} IsEffectCacheDisabled: {}
IsFontCacheDisabled: {} IsFontCacheDisabled: {}
@ -74,6 +75,7 @@ void ScalingOptions::Log() const noexcept {
IsWindowedMode(), IsWindowedMode(),
IsDebugMode(), IsDebugMode(),
IsBenchmarkMode(), IsBenchmarkMode(),
IsTopmostDisabled(),
IsFP16Disabled(), IsFP16Disabled(),
IsEffectCacheDisabled(), IsEffectCacheDisabled(),
IsFontCacheDisabled(), IsFontCacheDisabled(),

View file

@ -52,8 +52,10 @@ static void LogRects(const RECT& srcRect, const RECT& rendererRect, const RECT&
ScalingError ScalingWindow::_StartImpl(HWND hwndSrc) noexcept { ScalingError ScalingWindow::_StartImpl(HWND hwndSrc) noexcept {
Logger::Get().Info(fmt::format("缩放开始\n\t程序版本: {}\n\tOS 版本: {}\n\t管理员: {}", Logger::Get().Info(fmt::format("缩放开始\n\t程序版本: {}\n\tOS 版本: {}\n\t管理员: {}",
#ifdef MP_VERSION_TAG #ifdef MP_VERSION_STRING
STRING(MP_VERSION_TAG), STRINGIFY(MP_VERSION_STRING),
#elif defined(MP_COMMIT_ID)
"dev (" STRINGIFY(MP_COMMIT_ID) ")",
#else #else
"dev", "dev",
#endif #endif
@ -391,8 +393,8 @@ void ScalingWindow::Render() noexcept {
} }
if (srcFocusedChanged) { if (srcFocusedChanged) {
_UpdateFocusState(); _UpdateFocusStateAsync();
} }
// 虽然可以在第一帧渲染完成后再隐藏系统光标,但某些设备上显示窗口时光标状态会变成忙, // 虽然可以在第一帧渲染完成后再隐藏系统光标,但某些设备上显示窗口时光标状态会变成忙,
// 提前隐藏光标可以提高观感。缩放窗口显示后再隐藏光标还可能造成光标闪烁两次,第一次是 // 提前隐藏光标可以提高观感。缩放窗口显示后再隐藏光标还可能造成光标闪烁两次,第一次是
@ -482,6 +484,20 @@ LRESULT ScalingWindow::_MessageHandler(UINT msg, WPARAM wParam, LPARAM lParam) n
{ {
// 调整窗口大小时会进入 OS 的内部循环,我们的消息循环没有机会调用 Render。幸运的是 // 调整窗口大小时会进入 OS 的内部循环,我们的消息循环没有机会调用 Render。幸运的是
// 内部循环会正常分发消息,因此有必要在窗口过程中执行渲染以避免调整大小时渲染暂停。 // 内部循环会正常分发消息,因此有必要在窗口过程中执行渲染以避免调整大小时渲染暂停。
if (!_renderer) {
return 0;
}
// 删除消息队列中的其他 WM_FRONTEND_RENDER 以避免重复渲染
{
MSG msg1;
while (PeekMessage(&msg1, Handle(), CommonSharedConstants::WM_FRONTEND_RENDER,
CommonSharedConstants::WM_FRONTEND_RENDER, PM_REMOVE)
) {
// 不做处理
}
}
Render(); Render();
return 0; return 0;
} }
@ -712,7 +728,7 @@ LRESULT ScalingWindow::_MessageHandler(UINT msg, WPARAM wParam, LPARAM lParam) n
// 阻止 OS 修改置顶状态。当源窗口中途置顶/取消置顶时OS 会试图修改缩放窗口的置顶 // 阻止 OS 修改置顶状态。当源窗口中途置顶/取消置顶时OS 会试图修改缩放窗口的置顶
// 状态,这不是我们想要的。 // 状态,这不是我们想要的。
if (!(windowPos.flags & SWP_NOZORDER) && !_options.IsDebugMode()) { if (!(windowPos.flags & SWP_NOZORDER) && !_options.IsDebugMode()) {
if (_srcTracker.IsFocused() || IsTopmostWindow(_srcTracker.Handle())) { if (_CalcTopmostState()) {
if (windowPos.hwndInsertAfter != HWND_TOP) { if (windowPos.hwndInsertAfter != HWND_TOP) {
windowPos.hwndInsertAfter = HWND_TOPMOST; windowPos.hwndInsertAfter = HWND_TOPMOST;
} }
@ -1109,24 +1125,15 @@ ScalingError ScalingWindow::_CalcFullscreenRendererRect(uint32_t& monitorCount)
} }
} }
// 全屏模式缩放无需保持比例,但要限制最小和最大尺寸 // 全屏模式缩放无需保持比例,但要限制最大尺寸
SIZE ScalingWindow::_AdjustFullscreenWindowSize(SIZE size, uint32_t dpi) const noexcept { SIZE ScalingWindow::_AdjustFullscreenWindowSize(SIZE size, uint32_t dpi) const noexcept {
if (dpi == 0) { if (dpi == 0) {
dpi = _currentDpi; dpi = _currentDpi;
} }
const RECT& srcFrameRect = _srcTracker.WindowFrameRect();
const LONG spaceAround = lroundf(WINDOWED_MODE_MIN_SPACE_AROUND *
dpi / float(USER_DEFAULT_SCREEN_DPI));
const LONG minWidth = srcFrameRect.right - srcFrameRect.left + spaceAround;
const LONG minHeight = srcFrameRect.bottom - srcFrameRect.top + spaceAround;
const LONG maxWidth = GetSystemMetricsForDpi(SM_CXMAXTRACK, dpi); const LONG maxWidth = GetSystemMetricsForDpi(SM_CXMAXTRACK, dpi);
const LONG maxHeight = GetSystemMetricsForDpi(SM_CYMAXTRACK, dpi); const LONG maxHeight = GetSystemMetricsForDpi(SM_CYMAXTRACK, dpi);
return SIZE{ std::clamp(size.cx, 1l, maxWidth), std::clamp(size.cy, 1l, maxHeight) };
return SIZE{
std::clamp(size.cx, minWidth, maxWidth),
std::clamp(size.cy, minHeight, maxHeight)
};
} }
ScalingError ScalingWindow::_InitialMoveSrcWindowInFullscreen() noexcept { ScalingError ScalingWindow::_InitialMoveSrcWindowInFullscreen() noexcept {
@ -1208,7 +1215,7 @@ void ScalingWindow::_Show() noexcept {
Handle(), Handle(),
NULL, NULL,
0, 0, 0, 0, 0, 0, 0, 0,
SWP_SHOWWINDOW | SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE SWP_SHOWWINDOW | SWP_NO_ACTIVATE_MOVE_SIZE
); );
// 广播开始缩放 // 广播开始缩放
@ -1222,7 +1229,7 @@ void ScalingWindow::_Show() noexcept {
// 如果源窗口位于前台则将缩放窗口置顶 // 如果源窗口位于前台则将缩放窗口置顶
if (_srcTracker.IsFocused()) { if (_srcTracker.IsFocused()) {
_UpdateFocusState(); _UpdateFocusStateAsync();
} }
if (_options.IsTouchSupportEnabled()) { if (_options.IsTouchSupportEnabled()) {
@ -1863,7 +1870,7 @@ void ScalingWindow::_UpdateFrameMargins() const noexcept {
DwmExtendFrameIntoClientArea(Handle(), &margins); DwmExtendFrameIntoClientArea(Handle(), &margins);
} }
void ScalingWindow::_UpdateFocusState() const noexcept { winrt::fire_and_forget ScalingWindow::_UpdateFocusStateAsync() const noexcept {
if (_options.IsWindowedMode()) { if (_options.IsWindowedMode()) {
// 根据源窗口状态绘制非客户区,我们必须自己控制非客户区是绘制成焦点状态还是非焦点 // 根据源窗口状态绘制非客户区,我们必须自己控制非客户区是绘制成焦点状态还是非焦点
// 状态,因为缩放窗口实际上永远不会得到焦点。 // 状态,因为缩放窗口实际上永远不会得到焦点。
@ -1874,85 +1881,102 @@ void ScalingWindow::_UpdateFocusState() const noexcept {
if (Win32Helper::IsWindowHung(_srcTracker.Handle())) { if (Win32Helper::IsWindowHung(_srcTracker.Handle())) {
Logger::Get().Error("源窗口已挂起"); Logger::Get().Error("源窗口已挂起");
_DelayedStop(); _DelayedStop();
return; co_return;
} }
// 源窗口位于前台时应将缩放窗口置顶,这是为了防止有些窗口突破 OS 维护的所有者关系顺 // 这里搞得很复杂,是我反复实验得到的,若要修改应测试下列情形:
// 序,如 GH#1232如果源窗口不在前台则取消置顶除非源窗口是置顶的并确保缩放窗 // 1. 缩放 WindowCase 中的 TopmostWindow 和 PopupHostWindow
// 口刚好在源窗口前以防遮挡其他窗口。 // 2. 缩放常规窗口然后切换到管理员身份的窗口。测试这一条时应直接运行,不要调试,因
// // 为调试状态下 SetWindowPos 的行为有变化
// 这里确实搞得很复杂,是我反复实验得到的,可以确保可靠性。切换前台窗口并非原子操作, // 3. 缩放时将任意窗口最小化然后还原
// 成为前台窗口和被放到 Z 轴顶部有一点间隔,这就导致了同步问题。 // 4. 缩放时拖动任意窗口
if (_srcTracker.IsFocused()) {
// 将缩放窗口置顶,由于同步问题可能需要尝试多次
for (int i = 0; i < 10; ++i) {
SetWindowPos(Handle(), HWND_TOPMOST, 0, 0, 0, 0,
SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE | SWP_NOOWNERZORDER);
if (IsTopmostWindow(Handle())) { const bool oldTopmost = IsTopmostWindow(Handle());
break; const bool newTopmost = _CalcTopmostState();
if (oldTopmost != newTopmost) {
if (newTopmost) {
for (int i = 0; i < 10; ++i) {
SetWindowPos(Handle(), HWND_TOPMOST, 0, 0, 0, 0, SWP_NO_ACTIVATE_MOVE_SIZE);
if (IsTopmostWindow(Handle()) == newTopmost) {
break;
}
} }
}
if (_options.IsWindowedMode()) {
// 确保源窗口在最前。这一步是有必要的OS 有几率失败
SetWindowPos(_srcTracker.Handle(), HWND_TOP, 0, 0, 0, 0,
SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);
} else {
// 全屏模式缩放时确保缩放窗口在所有置顶窗口之上,这使不支持 MPO 的显卡更容易激 // 全屏模式缩放时确保缩放窗口在所有置顶窗口之上,这使不支持 MPO 的显卡更容易激
// 活 DirectFlip。 // 活 DirectFlip。
HDWP hDwp = BeginDeferWindowPos(2); if (!_options.IsWindowedMode()) {
if (hDwp) { SetWindowPos(Handle(), HWND_TOP, 0, 0, 0, 0, SWP_NO_ACTIVATE_MOVE_SIZE);
hDwp = DeferWindowPos(hDwp, _srcTracker.Handle(), HWND_TOP, 0, 0, 0, 0,
SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);
hDwp = DeferWindowPos(hDwp, Handle(), HWND_TOP, 0, 0, 0, 0,
SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE | SWP_NOOWNERZORDER);
EndDeferWindowPos(hDwp);
} }
} } else {
} else { const uint32_t runId = ScalingWindow::RunId();
// 将缩放窗口置于源窗口之前,由于同步问题可能需要尝试多次 bool isInBackground = false;
const bool isSrcTopmost = IsTopmostWindow(_srcTracker.Handle());
for (int i = 0; i < 10; ++i) {
HDWP hDwp = BeginDeferWindowPos(2);
if (hDwp) {
// 先修改缩放窗口的置顶状态,下一个操作才符合预期。如果源窗口是置顶的,缩放窗口
// 也应置顶。
hDwp = DeferWindowPos(hDwp, Handle(), isSrcTopmost ? HWND_TOPMOST : HWND_NOTOPMOST,
0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE | SWP_NOOWNERZORDER);
// 这里把缩放窗口放到源窗口**之前**,虽然字面上是之后,因为 OS 会自动维护所有者 HWND hwndFore = GetForegroundWindow();
// 关系顺序。 if (!hwndFore) {
// // 切换窗口时有一个瞬间无前台窗口,这里等待切换完成
// 我们希望把缩放窗口刚好放在源窗口之前以避免遮挡其他窗口,但不存在 API 能把一个 co_await winrt::resume_after(1ms);
// 窗口放到另一个窗口之前。hWndInsertAfter 传入 isInBackground = true;
// ``` hwndFore = GetForegroundWindow();
// GetWindow(_srcTracker.Handle(), GW_HWNDPREV) }
// ```
// 不可靠,还需要检查可见性和是否置顶。反过来将源窗口放到缩放窗口之后也不是好办法, bool isForeMovable = true;
// 我们应避免改变源窗口的 Z 顺序。最后我想到了这个很巧妙的方法,即 hWndInsertAfter if (hwndFore) {
// 传入源窗口句柄,由于存在所有者/被所有者关系OS 将自动调整顺序。 DWORD windowIL;
hDwp = DeferWindowPos(hDwp, Handle(), _srcTracker.Handle(), isForeMovable = Win32Helper::GetWindowIntegrityLevel(hwndFore, windowIL) &&
0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE); windowIL <= Win32Helper::GetCurrentProcessIntegrityLevel();
}
if (!isForeMovable) {
if (!isInBackground) {
co_await winrt::resume_background();
isInBackground = true;
}
// 等待 DWM 开始合成新帧以避免显示中间状态
Win32Helper::WaitForDwmComposition();
}
if (isInBackground) {
co_await ScalingWindow::Get().Dispatcher();
// 等待时源窗口重新回到前台了应放弃后续操作
if (runId != ScalingWindow::RunId() || _srcTracker.IsFocused()) {
co_return;
}
}
for (int i = 0; i < 10; ++i) {
HDWP hDwp = BeginDeferWindowPos(isForeMovable ? 2 : 3);
// 改变置顶状态
hDwp = DeferWindowPos(hDwp, Handle(), HWND_NOTOPMOST,
0, 0, 0, 0, SWP_NO_ACTIVATE_MOVE_SIZE);
// 将缩放窗口恰好置于源窗口前
if (isForeMovable) {
// 这个方式没有中间状态,但会导致源窗口遮挡前台窗口,之后会手动将前台窗口移到顶部
hDwp = DeferWindowPos(hDwp, Handle(), _srcTracker.Handle(),
0, 0, 0, 0, SWP_NO_ACTIVATE_MOVE_SIZE);
} else {
// 这个方式不会移动源窗口,但有中间状态。如果前台窗口 IL 更高,这是唯一的办法
hDwp = DeferWindowPos(hDwp, Handle(), _srcTracker.Handle(),
0, 0, 0, 0, SWP_NO_ACTIVATE_MOVE_SIZE | SWP_NOOWNERZORDER);
hDwp = DeferWindowPos(hDwp, _srcTracker.Handle(), Handle(),
0, 0, 0, 0, SWP_NO_ACTIVATE_MOVE_SIZE | SWP_NOOWNERZORDER);
}
EndDeferWindowPos(hDwp); EndDeferWindowPos(hDwp);
// 确保缩放窗口刚好在源窗口前
if (IsTopmostWindow(Handle()) == newTopmost &&
GetWindow(_srcTracker.Handle(), GW_HWNDPREV) == Handle()) {
break;
}
} }
// 如果缩放窗口不是刚好位于源窗口之前则重试 if (isForeMovable && hwndFore && GetForegroundWindow() == hwndFore) {
if (GetWindow(_srcTracker.Handle(), GW_HWNDPREV) == Handle() && SetWindowPos(hwndFore, HWND_TOP, 0, 0, 0, 0, SWP_NO_ACTIVATE_MOVE_SIZE);
isSrcTopmost == IsTopmostWindow(Handle())) {
break;
}
}
// 确保前台窗口在最前
if (const HWND hwndFore = GetForegroundWindow()) {
if (!SetWindowPos(hwndFore, HWND_TOP, 0, 0, 0, 0,
SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE)) {
// 可能由于权限不足而失败,这种情况比较棘手。切换两次前台窗口几乎是完美的解决方案,
// 但我想知道有没有更好的。
SetForegroundWindow(GetDesktopWindow());
SetForegroundWindow(hwndFore);
} }
} }
} }
@ -1966,6 +1990,21 @@ void ScalingWindow::_UpdateFocusState() const noexcept {
} }
} }
bool ScalingWindow::_CalcTopmostState() const noexcept {
// 源窗口置顶时缩放窗口必须置顶
if (IsTopmostWindow(_srcTracker.Handle())) {
return true;
}
// 源窗口位于前台时一般将缩放窗口置顶,这是为了防止有些窗口突破 OS 维护的所有者关系
// 顺序,如 GH#1232。一个例外是源窗口有弹窗时缩放窗口应在弹窗下方除了常规弹窗
// 应检查模拟模态弹窗(见 ScalingService.cpp 的 IsPopupWindow
return !_options.IsTopmostDisabled() &&
_srcTracker.IsFocused() &&
!GetWindow(_srcTracker.Handle(), GW_ENABLEDPOPUP) &&
IsWindowEnabled(_srcTracker.Handle());
}
bool ScalingWindow::_IsBorderless() const noexcept { bool ScalingWindow::_IsBorderless() const noexcept {
assert(_options.IsWindowedMode()); assert(_options.IsWindowedMode());
@ -1992,7 +2031,8 @@ void ScalingWindow::_UpdateRendererRect() noexcept {
const bool resized = Win32Helper::GetSizeOfRect(_rendererRect) != const bool resized = Win32Helper::GetSizeOfRect(_rendererRect) !=
Win32Helper::GetSizeOfRect(oldRendererRect); Win32Helper::GetSizeOfRect(oldRendererRect);
if (!_isMovingDueToSrcMoved && !_srcTracker.IsMoving()) { // 全屏模式缩放时不移动源窗口,因为我们不限制最小尺寸,而且源窗口可能处于最大化或全屏状态
if (_options.IsWindowedMode() && !_isMovingDueToSrcMoved && !_srcTracker.IsMoving()) {
// 确保源窗口中心点和缩放窗口中心点相同。应先移动源窗口,因为之后需要调整光标位置 // 确保源窗口中心点和缩放窗口中心点相同。应先移动源窗口,因为之后需要调整光标位置
const RECT& srcRect = _srcTracker.WindowRect(); const RECT& srcRect = _srcTracker.WindowRect();
const int offsetX = (_windowRect.left + _windowRect.right - srcRect.left - srcRect.right) / 2; const int offsetX = (_windowRect.left + _windowRect.right - srcRect.left - srcRect.right) / 2;
@ -2103,10 +2143,10 @@ void ScalingWindow::_UpdateWindowRectFromWindowPos(const WINDOWPOS& windowPos) n
void ScalingWindow::_DelayedStop(bool onSrcHung, bool onSrcRepositioning) const noexcept { void ScalingWindow::_DelayedStop(bool onSrcHung, bool onSrcRepositioning) const noexcept {
if (!onSrcHung) { if (!onSrcHung) {
const HWND hwndSrc = _srcTracker.Handle(); const HWND hwndSrc = _srcTracker.Handle();
if (!(IsWindow(hwndSrc) && Win32Helper::IsWindowHung(hwndSrc))) { if (IsTopmostWindow(Handle()) && !(IsWindow(hwndSrc) && Win32Helper::IsWindowHung(hwndSrc))) {
// 提前取消置顶,这样销毁时出现问题不会影响和桌面环境交互 // 提前取消置顶,这样销毁时出现问题不会影响和桌面环境交互
SetWindowPos(Handle(), HWND_NOTOPMOST, 0, 0, 0, 0, SetWindowPos(Handle(), HWND_NOTOPMOST, 0, 0, 0, 0,
SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE | SWP_NOOWNERZORDER); SWP_NO_ACTIVATE_MOVE_SIZE | SWP_NOOWNERZORDER);
} }
} }

View file

@ -151,7 +151,9 @@ private:
void _UpdateFrameMargins() const noexcept; void _UpdateFrameMargins() const noexcept;
void _UpdateFocusState() const noexcept; winrt::fire_and_forget _UpdateFocusStateAsync() const noexcept;
bool _CalcTopmostState() const noexcept;
bool _IsBorderless() const noexcept; bool _IsBorderless() const noexcept;

View file

@ -11,32 +11,6 @@
namespace Magpie { namespace Magpie {
static bool GetWindowIntegrityLevel(HWND hWnd, DWORD& integrityLevel) noexcept {
wil::unique_process_handle hProc = Win32Helper::GetWindowProcessHandle(hWnd);
if (!hProc) {
Logger::Get().Error("GetWindowProcessHandle 失败");
return false;
}
wil::unique_handle hQueryToken;
if (!OpenProcessToken(hProc.get(), TOKEN_QUERY, hQueryToken.put())) {
Logger::Get().Win32Error("OpenProcessToken 失败");
return false;
}
return Win32Helper::GetProcessIntegrityLevel(hQueryToken.get(), integrityLevel);
}
static bool CheckIL(HWND hwndSrc) noexcept {
static DWORD thisIL = []() -> DWORD {
DWORD il;
return Win32Helper::GetProcessIntegrityLevel(NULL, il) ? il : 0;
}();
DWORD windowIL;
return GetWindowIntegrityLevel(hwndSrc, windowIL) && windowIL <= thisIL;
}
static bool IsWindowMoving(HWND hWnd) noexcept { static bool IsWindowMoving(HWND hWnd) noexcept {
GUITHREADINFO guiThreadInfo{ .cbSize = sizeof(GUITHREADINFO) }; GUITHREADINFO guiThreadInfo{ .cbSize = sizeof(GUITHREADINFO) };
if (GetGUIThreadInfo(GetWindowThreadProcessId(hWnd, nullptr), &guiThreadInfo)) { if (GetGUIThreadInfo(GetWindowThreadProcessId(hWnd, nullptr), &guiThreadInfo)) {
@ -79,9 +53,14 @@ ScalingError SrcTracker::Set(HWND hWnd, const ScalingOptions& options, bool& isI
return ScalingError::InvalidSourceWindow; return ScalingError::InvalidSourceWindow;
} }
if (!CheckIL(hWnd)) { // 检查 integrity level
Logger::Get().Error("不支持缩放 IL 更高的窗口"); {
return ScalingError::LowIntegrityLevel; DWORD windowIL;
if (!Win32Helper::GetWindowIntegrityLevel(hWnd, windowIL) ||
windowIL > Win32Helper::GetCurrentProcessIntegrityLevel()) {
Logger::Get().Error("不支持缩放 IL 更高的窗口");
return ScalingError::LowIntegrityLevel;
}
} }
// 已在 ScalingService 中阻止 // 已在 ScalingService 中阻止
@ -234,6 +213,14 @@ bool SrcTracker::UpdateState(
RECT curWindowRect; RECT curWindowRect;
if (wp.showCmd == SW_SHOWMINIMIZED) { if (wp.showCmd == SW_SHOWMINIMIZED) {
// 窗口最小化有两步:先将窗口状态设为最小化,然后将窗口移出屏幕 (左上角坐标
// (-32000,-32000))。如果我们刚好在两步之间停止缩放,第二步将无法执行,这和缩
// 放窗口被源窗口所有有关,不确定是否是 OS 的 bug。这个检查确保第二步完成后再
// 停止缩放。
if (wp.rcNormalPosition.left == wp.ptMinPosition.x) {
return true;
}
isInvisibleOrMinimized = true; isInvisibleOrMinimized = true;
// rcNormalPosition 使用工作区坐标,应转换为屏幕坐标 // rcNormalPosition 使用工作区坐标,应转换为屏幕坐标

View file

@ -1,6 +1,7 @@
#include "pch.h" #include "pch.h"
#include "Win32Helper.h" #include "Win32Helper.h"
#include "StrHelper.h" #include "StrHelper.h"
#include <dcomp.h>
#include <dwmapi.h> #include <dwmapi.h>
#include <io.h> #include <io.h>
#pragma push_macro("ShellExecute") #pragma push_macro("ShellExecute")
@ -697,6 +698,30 @@ bool Win32Helper::GetProcessIntegrityLevel(HANDLE hQueryToken, DWORD& integrityL
return true; return true;
} }
DWORD Win32Helper::GetCurrentProcessIntegrityLevel() noexcept {
static DWORD result = []() -> DWORD {
DWORD il;
return Win32Helper::GetProcessIntegrityLevel(NULL, il) ? il : 0;
}();
return result;
}
bool Win32Helper::GetWindowIntegrityLevel(HWND hWnd, DWORD& integrityLevel) noexcept {
wil::unique_process_handle hProc = GetWindowProcessHandle(hWnd);
if (!hProc) {
Logger::Get().Error("GetWindowProcessHandle 失败");
return false;
}
wil::unique_handle hQueryToken;
if (!OpenProcessToken(hProc.get(), TOKEN_QUERY, hQueryToken.put())) {
Logger::Get().Win32Error("OpenProcessToken 失败");
return false;
}
return GetProcessIntegrityLevel(hQueryToken.get(), integrityLevel);
}
static winrt::com_ptr<IShellView> FindDesktopFolderView() noexcept { static winrt::com_ptr<IShellView> FindDesktopFolderView() noexcept {
winrt::com_ptr<IShellWindows> shellWindows = winrt::com_ptr<IShellWindows> shellWindows =
winrt::try_create_instance<IShellWindows>(CLSID_ShellWindows, CLSCTX_LOCAL_SERVER); winrt::try_create_instance<IShellWindows>(CLSID_ShellWindows, CLSCTX_LOCAL_SERVER);
@ -856,4 +881,56 @@ const std::filesystem::path& Win32Helper::GetExePath() noexcept {
return result; return result;
} }
void Win32Helper::WaitForDwmComposition() noexcept {
// Win11 可以使用准确的 DCompositionWaitForCompositorClock
if (Win32Helper::GetOSVersion().IsWin11()) {
static const auto dCompositionWaitForCompositorClock =
Win32Helper::LoadSystemFunction<decltype(DCompositionWaitForCompositorClock)>(
L"dcomp.dll", "DCompositionWaitForCompositorClock");
if (dCompositionWaitForCompositorClock) {
dCompositionWaitForCompositorClock(0, nullptr, INFINITE);
return;
}
}
LARGE_INTEGER qpf;
QueryPerformanceFrequency(&qpf);
qpf.QuadPart /= 10000000;
DWM_TIMING_INFO info{};
info.cbSize = sizeof(info);
DwmGetCompositionTimingInfo(NULL, &info);
LARGE_INTEGER time;
QueryPerformanceCounter(&time);
if (time.QuadPart >= (LONGLONG)info.qpcCompose) {
return;
}
// 提前 1ms 结束然后忙等待
time.QuadPart += 10000;
if (time.QuadPart < (LONGLONG)info.qpcCompose) {
LARGE_INTEGER liDueTime{
.QuadPart = -((LONGLONG)info.qpcCompose - time.QuadPart) / qpf.QuadPart
};
static HANDLE timer = CreateWaitableTimerEx(nullptr, nullptr,
CREATE_WAITABLE_TIMER_HIGH_RESOLUTION, TIMER_ALL_ACCESS);
SetWaitableTimerEx(timer, &liDueTime, 0, NULL, NULL, 0, 0);
WaitForSingleObject(timer, INFINITE);
} else {
Sleep(0);
}
while (true) {
QueryPerformanceCounter(&time);
if (time.QuadPart >= (LONGLONG)info.qpcCompose) {
return;
}
Sleep(0);
}
}
} }

View file

@ -21,6 +21,7 @@ enum class MultiMonitorUsage {
enum class CursorInterpolationMode { enum class CursorInterpolationMode {
NearestNeighbor, NearestNeighbor,
Bilinear, Bilinear,
COUNT
}; };
struct Cropping { struct Cropping {
@ -41,26 +42,17 @@ struct GraphicsCardId {
uint32_t deviceId = 0; uint32_t deviceId = 0;
}; };
struct ScalingFlags { enum class DestAlignment {
static constexpr uint32_t WindowedMode = 1; LeftTop,
static constexpr uint32_t DebugMode = 1 << 1; Top,
static constexpr uint32_t DisableEffectCache = 1 << 2; RightTop,
static constexpr uint32_t SaveEffectSources = 1 << 3; Left,
static constexpr uint32_t WarningsAreErrors = 1 << 4; Center,
static constexpr uint32_t SimulateExclusiveFullscreen = 1 << 5; Right,
static constexpr uint32_t Is3DGameMode = 1 << 6; LeftBottom,
static constexpr uint32_t CaptureTitleBar = 1 << 10; Bottom,
static constexpr uint32_t AdjustCursorSpeed = 1 << 11; RightBottom,
static constexpr uint32_t DisableDirectFlip = 1 << 13; COUNT
static constexpr uint32_t DisableFontCache = 1 << 14;
static constexpr uint32_t AllowScalingMaximized = 1 << 15;
static constexpr uint32_t EnableStatisticsForDynamicDetection = 1 << 16;
// 只影响缩放行为Magpie.Core 不负责启动 TouchHelper.exe
static constexpr uint32_t TouchSupportEnabled = 1 << 17;
static constexpr uint32_t InlineParams = 1 << 18;
static constexpr uint32_t FP16Disabled = 1 << 19;
static constexpr uint32_t BenchmarkMode = 1 << 20;
static constexpr uint32_t DeveloperMode = 1 << 21;
}; };
enum class ScalingType { enum class ScalingType {
@ -154,12 +146,36 @@ enum class ScalingError {
CreateFenceFailed CreateFenceFailed
}; };
struct ScalingFlags {
static constexpr uint32_t WindowedMode = 1;
static constexpr uint32_t DebugMode = 1 << 1;
static constexpr uint32_t DisableEffectCache = 1 << 2;
static constexpr uint32_t SaveEffectSources = 1 << 3;
static constexpr uint32_t WarningsAreErrors = 1 << 4;
static constexpr uint32_t SimulateExclusiveFullscreen = 1 << 5;
static constexpr uint32_t Is3DGameMode = 1 << 6;
static constexpr uint32_t CaptureTitleBar = 1 << 10;
static constexpr uint32_t AdjustCursorSpeed = 1 << 11;
static constexpr uint32_t DisableDirectFlip = 1 << 13;
static constexpr uint32_t DisableFontCache = 1 << 14;
static constexpr uint32_t AllowScalingMaximized = 1 << 15;
static constexpr uint32_t EnableStatisticsForDynamicDetection = 1 << 16;
// 只影响缩放行为Magpie.Core 不负责启动 TouchHelper.exe
static constexpr uint32_t TouchSupportEnabled = 1 << 17;
static constexpr uint32_t InlineParams = 1 << 18;
static constexpr uint32_t DisableFP16 = 1 << 19;
static constexpr uint32_t BenchmarkMode = 1 << 20;
static constexpr uint32_t DeveloperMode = 1 << 21;
static constexpr uint32_t DisableTopmost = 1 << 22;
};
struct ScalingOptions { struct ScalingOptions {
DEFINE_FLAG_ACCESSOR(IsWindowedMode, ScalingFlags::WindowedMode, flags) DEFINE_FLAG_ACCESSOR(IsWindowedMode, ScalingFlags::WindowedMode, flags)
DEFINE_FLAG_ACCESSOR(IsDeveloperMode, ScalingFlags::DeveloperMode, flags) DEFINE_FLAG_ACCESSOR(IsDeveloperMode, ScalingFlags::DeveloperMode, flags)
DEFINE_FLAG_ACCESSOR(IsDebugMode, ScalingFlags::DebugMode, flags) DEFINE_FLAG_ACCESSOR(IsDebugMode, ScalingFlags::DebugMode, flags)
DEFINE_FLAG_ACCESSOR(IsBenchmarkMode, ScalingFlags::BenchmarkMode, flags) DEFINE_FLAG_ACCESSOR(IsBenchmarkMode, ScalingFlags::BenchmarkMode, flags)
DEFINE_FLAG_ACCESSOR(IsFP16Disabled, ScalingFlags::FP16Disabled, flags) DEFINE_FLAG_ACCESSOR(IsTopmostDisabled, ScalingFlags::DisableTopmost, flags)
DEFINE_FLAG_ACCESSOR(IsFP16Disabled, ScalingFlags::DisableFP16, flags)
DEFINE_FLAG_ACCESSOR(IsEffectCacheDisabled, ScalingFlags::DisableEffectCache, flags) DEFINE_FLAG_ACCESSOR(IsEffectCacheDisabled, ScalingFlags::DisableEffectCache, flags)
DEFINE_FLAG_ACCESSOR(IsFontCacheDisabled, ScalingFlags::DisableFontCache, flags) DEFINE_FLAG_ACCESSOR(IsFontCacheDisabled, ScalingFlags::DisableFontCache, flags)
DEFINE_FLAG_ACCESSOR(IsSaveEffectSources, ScalingFlags::SaveEffectSources, flags) DEFINE_FLAG_ACCESSOR(IsSaveEffectSources, ScalingFlags::SaveEffectSources, flags)
@ -183,6 +199,7 @@ struct ScalingOptions {
float cursorScaling = 1.0f; float cursorScaling = 1.0f;
CaptureMethod captureMethod = CaptureMethod::GraphicsCapture; CaptureMethod captureMethod = CaptureMethod::GraphicsCapture;
MultiMonitorUsage multiMonitorUsage = MultiMonitorUsage::Closest; MultiMonitorUsage multiMonitorUsage = MultiMonitorUsage::Closest;
DestAlignment destAlignment = DestAlignment::Center;
CursorInterpolationMode cursorInterpolationMode = CursorInterpolationMode::NearestNeighbor; CursorInterpolationMode cursorInterpolationMode = CursorInterpolationMode::NearestNeighbor;
std::optional<float> autoHideCursorDelay; std::optional<float> autoHideCursorDelay;
DuplicateFrameDetectionMode duplicateFrameDetectionMode = DuplicateFrameDetectionMode::Dynamic; DuplicateFrameDetectionMode duplicateFrameDetectionMode = DuplicateFrameDetectionMode::Dynamic;

View file

@ -117,6 +117,10 @@ struct Win32Helper {
static bool GetProcessIntegrityLevel(HANDLE hQueryToken, DWORD& integrityLevel) noexcept; static bool GetProcessIntegrityLevel(HANDLE hQueryToken, DWORD& integrityLevel) noexcept;
static DWORD GetCurrentProcessIntegrityLevel() noexcept;
static bool GetWindowIntegrityLevel(HWND hWnd, DWORD& integrityLevel) noexcept;
// VARIANT 封装,自动管理生命周期,比 WIL 提供更多功能 // VARIANT 封装,自动管理生命周期,比 WIL 提供更多功能
struct Variant : public VARIANT { struct Variant : public VARIANT {
Variant() noexcept { Variant() noexcept {
@ -133,7 +137,7 @@ struct Win32Helper {
} }
Variant(VARIANT&& varSrc) noexcept { Variant(VARIANT&& varSrc) noexcept {
std::memcpy(this, &varSrc, sizeof(varSrc)); std::memcpy((VARIANT*)this, &varSrc, sizeof(varSrc));
varSrc.vt = VT_EMPTY; varSrc.vt = VT_EMPTY;
} }
@ -166,7 +170,7 @@ struct Win32Helper {
} }
Variant& operator=(VARIANT&& other) noexcept { Variant& operator=(VARIANT&& other) noexcept {
std::memcpy(this, &other, sizeof(other)); std::memcpy((VARIANT*)this, &other, sizeof(other));
other.vt = VT_EMPTY; other.vt = VT_EMPTY;
return *this; return *this;
} }
@ -210,6 +214,9 @@ struct Win32Helper {
// 先转成 void* 以避免警告 // 先转成 void* 以避免警告
return reinterpret_cast<T*>(reinterpret_cast<void*>(address)); return reinterpret_cast<T*>(reinterpret_cast<void*>(address));
} }
// 和 DwmFlush 效果相同但更准确
static void WaitForDwmComposition() noexcept;
}; };
} }

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<packages> <packages>
<package id="Microsoft.Windows.CppWinRT" version="2.0.250303.1" targetFramework="native" /> <package id="Microsoft.Windows.CppWinRT" version="2.0.250303.1" targetFramework="native" />
<package id="Microsoft.Windows.ImplementationLibrary" version="1.0.250325.1" targetFramework="native" /> <package id="Microsoft.Windows.ImplementationLibrary" version="1.0.260126.7" targetFramework="native" />
</packages> </packages>

View file

@ -1,6 +1,6 @@
SamplerState sam : register(s0); SamplerState sam : register(s0);
Texture2D tex : register(t0); Texture2D tex : register(t0);
float4 main(float2 coord : TEXCOORD, float4 color : COLOR) : SV_Target { float4 main(noperspective float2 coord : TEXCOORD, noperspective float4 color : COLOR) : SV_Target {
return color * float4(1, 1, 1, tex.Sample(sam, coord).r); return color * float4(1, 1, 1, tex.Sample(sam, coord).r);
} }

View file

@ -3,14 +3,14 @@ cbuffer vertexBuffer : register(b0) {
}; };
void main( void main(
float4 pos : SV_POSITION, float2 pos : POSITION,
float2 coord : TEXCOORD, float2 coord : TEXCOORD,
float4 color : COLOR, float4 color : COLOR,
out float2 outCoord : TEXCOORD, out noperspective float2 outCoord : TEXCOORD,
out float4 outColor : COLOR, out noperspective float4 outColor : COLOR,
out float4 outPos : SV_POSITION out noperspective float4 outPos : SV_POSITION
) { ) {
outPos = mul(projectionMatrix, float4(pos.xy, 0.f, 1.f)); outPos = mul(projectionMatrix, float4(pos, 0, 1));
outCoord = coord; outCoord = coord;
outColor = color; outColor = color;
} }

View file

@ -3,7 +3,7 @@ Texture2D cursorTex : register(t1);
SamplerState pointSampler : register(s0); SamplerState pointSampler : register(s0);
float4 main(float2 coord : TEXCOORD) : SV_TARGET { float4 main(noperspective float2 coord : TEXCOORD) : SV_TARGET {
float4 mask = cursorTex.Sample(pointSampler, coord); float4 mask = cursorTex.Sample(pointSampler, coord);
if (mask.a < 0.5f) { if (mask.a < 0.5f) {

View file

@ -3,7 +3,7 @@ Texture2D<float2> cursorTex : register(t1);
SamplerState pointSampler : register(s0); SamplerState pointSampler : register(s0);
float4 main(float2 coord : TEXCOORD) : SV_TARGET { float4 main(noperspective float2 coord : TEXCOORD) : SV_TARGET {
float2 mask = cursorTex.Sample(pointSampler, coord); float2 mask = cursorTex.Sample(pointSampler, coord);
if (mask.x > 0.5f) { if (mask.x > 0.5f) {

View file

@ -1,6 +1,6 @@
Texture2D tex : register(t0); Texture2D tex : register(t0);
SamplerState sam : register(s0); SamplerState sam : register(s0);
float4 main(float2 coord : TEXCOORD) : SV_Target { float4 main(noperspective float2 coord : TEXCOORD) : SV_Target {
return tex.Sample(sam, coord); return tex.Sample(sam, coord);
} }

View file

@ -1,9 +1,9 @@
void main( void main(
float4 pos : SV_POSITION, float2 pos : POSITION,
float2 coord : TEXCOORD, float2 coord : TEXCOORD,
out float2 outCoord : TEXCOORD, out noperspective float2 outCoord : TEXCOORD,
out float4 outPos : SV_POSITION out noperspective float4 outPos : SV_POSITION
) { ) {
outPos = pos; outPos = float4(pos, 0, 1);
outCoord = coord; outCoord = coord;
} }

View file

@ -58,16 +58,15 @@ hstring AboutViewModel::Version() const noexcept {
ResourceLoader::GetForCurrentView(CommonSharedConstants::APP_RESOURCE_MAP_ID); ResourceLoader::GetForCurrentView(CommonSharedConstants::APP_RESOURCE_MAP_ID);
return hstring(StrHelper::Concat( return hstring(StrHelper::Concat(
resourceLoader.GetString(L"About_Version_Version"), resourceLoader.GetString(L"About_Version_Version"),
#ifdef MP_VERSION_TAG #ifdef MP_VERSION_STRING
L" ", L" " WIDEN_STRINGIFY(MP_VERSION_STRING),
&WIDEN(STRING(MP_VERSION_TAG))[1],
#else #else
L" dev", L" dev",
#endif #endif
#ifdef MP_COMMIT_ID #ifdef MP_COMMIT_ID
L" | ", L" | ",
resourceLoader.GetString(L"About_Version_CommitId"), resourceLoader.GetString(L"About_Version_CommitId"),
L" " WIDEN(STRING(MP_COMMIT_ID)), L" " WIDEN_STRINGIFY(MP_COMMIT_ID),
#endif #endif
L" | " L" | "
#ifdef _M_X64 #ifdef _M_X64
@ -103,7 +102,7 @@ void AboutViewModel::IsCheckForPreviewUpdates(bool value) {
bool AboutViewModel::IsCheckForUpdatesButtonEnabled() const noexcept { bool AboutViewModel::IsCheckForUpdatesButtonEnabled() const noexcept {
// 只有发布版本能检查更新 // 只有发布版本能检查更新
#ifdef MP_VERSION_TAG #ifdef MP_VERSION_STRING
return !IsCheckingForUpdates() && !IsDownloadingOrLater(); return !IsCheckingForUpdates() && !IsDownloadingOrLater();
#else #else
return false; return false;

View file

@ -127,7 +127,7 @@ bool AdaptersService::_GatherAdapterInfos(
return info.idx == std::numeric_limits<uint32_t>::max(); return info.idx == std::numeric_limits<uint32_t>::max();
}); });
App::Get().Dispatcher().RunAsync(CoreDispatcherPriority::Normal, [this, adapterInfos(std::move(adapterInfos))]() { App::Get().Dispatcher().TryEnqueue([this, adapterInfos(std::move(adapterInfos))]() {
_adapterInfos = std::move(adapterInfos); _adapterInfos = std::move(adapterInfos);
_UpdateProfiles(); _UpdateProfiles();
AdaptersChanged.Invoke(); AdaptersChanged.Invoke();

View file

@ -127,15 +127,17 @@ bool App::Initialize(const wchar_t* arguments) {
// 初始化 XAML 框架。退出时也不要关闭,如果正在播放动画会崩溃。文档中的清空消息队列的做法无用。 // 初始化 XAML 框架。退出时也不要关闭,如果正在播放动画会崩溃。文档中的清空消息队列的做法无用。
_windowsXamlManager = Hosting::WindowsXamlManager::InitializeForCurrentThread(); _windowsXamlManager = Hosting::WindowsXamlManager::InitializeForCurrentThread();
if (CoreWindow coreWindow = CoreWindow::GetForCurrentThread()) { // Win10 中 CoreDispatcher.RunAsync 存在内存泄露,因此我们始终使用 DispatcherQueue。
// Win10 中隐藏 DesktopWindowXamlSource 窗口 // 初始化 WindowsXamlManager 时已经创建 DispatcherQueue。
if (Win32Helper::GetOSVersion().IsWin10()) { _dispatcher = winrt::DispatcherQueue::GetForCurrentThread();
// Win10 中隐藏 DesktopWindowXamlSource 窗口
if (Win32Helper::GetOSVersion().IsWin10()) {
if (CoreWindow coreWindow = CoreWindow::GetForCurrentThread()) {
HWND hwndDWXS; HWND hwndDWXS;
coreWindow.try_as<ICoreWindowInterop>()->get_WindowHandle(&hwndDWXS); coreWindow.try_as<ICoreWindowInterop>()->get_WindowHandle(&hwndDWXS);
ShowWindow(hwndDWXS, SW_HIDE); ShowWindow(hwndDWXS, SW_HIDE);
} }
_dispatcher = coreWindow.Dispatcher();
} }
LocalizationService::Get().EarlyInitialize(); LocalizationService::Get().EarlyInitialize();
@ -193,7 +195,7 @@ bool App::Initialize(const wchar_t* arguments) {
// 再检查显卡的功能级别。 // 再检查显卡的功能级别。
_mainWindow->Content()->Loaded([](const auto&, const auto&) { _mainWindow->Content()->Loaded([](const auto&, const auto&) {
// 低优先级回调确保在初始化完毕后执行 // 低优先级回调确保在初始化完毕后执行
App::Get().Dispatcher().RunAsync(CoreDispatcherPriority::Low, []() { App::Get().Dispatcher().TryEnqueue(DispatcherQueuePriority::Low, []() {
AdaptersService::Get().StartMonitor(); AdaptersService::Get().StartMonitor();
}); });
}); });
@ -355,9 +357,7 @@ void App::_UpdateColorValuesChangedRevoker() {
_colorValuesChangedRevoker = _uiSettings.ColorValuesChanged( _colorValuesChangedRevoker = _uiSettings.ColorValuesChanged(
auto_revoke, auto_revoke,
[this](const auto&, const auto&) { [this](const auto&, const auto&) {
_dispatcher.RunAsync(CoreDispatcherPriority::Normal, [this] { _dispatcher.TryEnqueue([this] { _UpdateTheme(); });
_UpdateTheme();
});
} }
); );
} else { } else {

View file

@ -25,7 +25,7 @@ public:
int Run(); int Run();
const CoreDispatcher& Dispatcher() const noexcept { const DispatcherQueue& Dispatcher() const noexcept {
return _dispatcher; return _dispatcher;
} }
@ -74,7 +74,7 @@ private:
std::unique_ptr<::Magpie::MainWindow> _mainWindow; std::unique_ptr<::Magpie::MainWindow> _mainWindow;
CoreDispatcher _dispatcher{ nullptr }; DispatcherQueue _dispatcher{ nullptr };
::Magpie::Event<::Magpie::AppTheme>::EventRevoker _themeChangedRevoker; ::Magpie::Event<::Magpie::AppTheme>::EventRevoker _themeChangedRevoker;
Windows::UI::ViewManagement::UISettings _uiSettings; Windows::UI::ViewManagement::UISettings _uiSettings;

View file

@ -140,6 +140,9 @@ static void WriteProfile(rapidjson::PrettyWriter<rapidjson::StringBuffer>& write
writer.Double(profile.cropping.Bottom); writer.Double(profile.cropping.Bottom);
writer.EndObject(); writer.EndObject();
writer.Key("destAlignment");
writer.Uint((uint32_t)profile.destAlignment);
writer.EndObject(); writer.EndObject();
} }
@ -590,6 +593,8 @@ bool AppSettings::_Save(const _AppSettingsData& data) noexcept {
writer.Bool(data._isDebugMode); writer.Bool(data._isDebugMode);
writer.Key("benchmarkMode"); writer.Key("benchmarkMode");
writer.Bool(data._isBenchmarkMode); writer.Bool(data._isBenchmarkMode);
writer.Key("disableTopmost");
writer.Bool(data._isTopmostDisabled);
writer.Key("disableEffectCache"); writer.Key("disableEffectCache");
writer.Bool(data._isEffectCacheDisabled); writer.Bool(data._isEffectCacheDisabled);
writer.Key("disableFontCache"); writer.Key("disableFontCache");
@ -787,6 +792,7 @@ void AppSettings::_LoadSettings(const rapidjson::GenericObject<true, rapidjson::
JsonHelper::ReadBool(root, "developerMode", _isDeveloperMode); JsonHelper::ReadBool(root, "developerMode", _isDeveloperMode);
JsonHelper::ReadBool(root, "debugMode", _isDebugMode); JsonHelper::ReadBool(root, "debugMode", _isDebugMode);
JsonHelper::ReadBool(root, "benchmarkMode", _isBenchmarkMode); JsonHelper::ReadBool(root, "benchmarkMode", _isBenchmarkMode);
JsonHelper::ReadBool(root, "disableTopmost", _isTopmostDisabled);
JsonHelper::ReadBool(root, "disableEffectCache", _isEffectCacheDisabled); JsonHelper::ReadBool(root, "disableEffectCache", _isEffectCacheDisabled);
JsonHelper::ReadBool(root, "disableFontCache", _isFontCacheDisabled); JsonHelper::ReadBool(root, "disableFontCache", _isFontCacheDisabled);
JsonHelper::ReadBool(root, "saveEffectSources", _isSaveEffectSources); JsonHelper::ReadBool(root, "saveEffectSources", _isSaveEffectSources);
@ -1095,7 +1101,7 @@ bool AppSettings::_LoadProfile(
{ {
uint32_t cursorInterpolationMode = (uint32_t)CursorInterpolationMode::NearestNeighbor; uint32_t cursorInterpolationMode = (uint32_t)CursorInterpolationMode::NearestNeighbor;
JsonHelper::ReadUInt(profileObj, "cursorInterpolationMode", cursorInterpolationMode); JsonHelper::ReadUInt(profileObj, "cursorInterpolationMode", cursorInterpolationMode);
if (cursorInterpolationMode > 1) { if (cursorInterpolationMode >= (uint32_t)CursorInterpolationMode::COUNT) {
cursorInterpolationMode = (uint32_t)CursorInterpolationMode::NearestNeighbor; cursorInterpolationMode = (uint32_t)CursorInterpolationMode::NearestNeighbor;
} }
profile.cursorInterpolationMode = (CursorInterpolationMode)cursorInterpolationMode; profile.cursorInterpolationMode = (CursorInterpolationMode)cursorInterpolationMode;
@ -1128,6 +1134,15 @@ bool AppSettings::_LoadProfile(
} }
} }
{
uint32_t destAlignment = (uint32_t)DestAlignment::Center;
JsonHelper::ReadUInt(profileObj, "destAlignment", destAlignment);
if (destAlignment >= (uint32_t)DestAlignment::COUNT) {
destAlignment = (uint32_t)DestAlignment::Center;
}
profile.destAlignment = (DestAlignment)destAlignment;
}
return true; return true;
} }

View file

@ -62,6 +62,7 @@ struct _AppSettingsData {
bool _isDeveloperMode = false; bool _isDeveloperMode = false;
bool _isDebugMode = false; bool _isDebugMode = false;
bool _isBenchmarkMode = false; bool _isBenchmarkMode = false;
bool _isTopmostDisabled = false;
bool _isEffectCacheDisabled = false; bool _isEffectCacheDisabled = false;
bool _isFontCacheDisabled = false; bool _isFontCacheDisabled = false;
bool _isSaveEffectSources = false; bool _isSaveEffectSources = false;
@ -161,6 +162,15 @@ public:
SaveAsync(); SaveAsync();
} }
bool IsTopmostDisabled() const noexcept {
return _isTopmostDisabled;
}
void IsTopmostDisabled(bool value) noexcept {
_isTopmostDisabled = value;
SaveAsync();
}
bool IsEffectCacheDisabled() const noexcept { bool IsEffectCacheDisabled() const noexcept {
return _isEffectCacheDisabled; return _isEffectCacheDisabled;
} }

View file

@ -113,8 +113,7 @@ fire_and_forget CandidateWindowItem::_ResolveWindow(bool resolveIcon, bool resol
co_return; co_return;
} }
App::Get().Dispatcher().RunAsync( App::Get().Dispatcher().TryEnqueue(
CoreDispatcherPriority::Normal,
[this, defaultProfileName(std::move(defaultProfileName)), aumid(reader.AUMID())]() { [this, defaultProfileName(std::move(defaultProfileName)), aumid(reader.AUMID())]() {
if (!defaultProfileName.empty()) { if (!defaultProfileName.empty()) {
_defaultProfileName = defaultProfileName; _defaultProfileName = defaultProfileName;

View file

@ -296,6 +296,10 @@
<CheckBox x:Uid="Home_Advanced_DeveloperOptions_BenchmarkMode" <CheckBox x:Uid="Home_Advanced_DeveloperOptions_BenchmarkMode"
IsChecked="{x:Bind ViewModel.IsBenchmarkMode, Mode=TwoWay}" /> IsChecked="{x:Bind ViewModel.IsBenchmarkMode, Mode=TwoWay}" />
</local:SettingsCard> </local:SettingsCard>
<local:SettingsCard ContentAlignment="Left">
<CheckBox x:Uid="Home_Advanced_DeveloperOptions_DisableTopmost"
IsChecked="{x:Bind ViewModel.IsTopmostDisabled, Mode=TwoWay}" />
</local:SettingsCard>
<local:SettingsCard ContentAlignment="Left"> <local:SettingsCard ContentAlignment="Left">
<CheckBox x:Uid="Home_Advanced_DeveloperOptions_DisableEffectCache" <CheckBox x:Uid="Home_Advanced_DeveloperOptions_DisableEffectCache"
IsChecked="{x:Bind ViewModel.IsEffectCacheDisabled, Mode=TwoWay}" /> IsChecked="{x:Bind ViewModel.IsEffectCacheDisabled, Mode=TwoWay}" />

View file

@ -454,6 +454,21 @@ void HomeViewModel::LocateUpdaterLogs() noexcept {
LocateTempLogs(CommonSharedConstants::UPDATER_LOG_NAME); LocateTempLogs(CommonSharedConstants::UPDATER_LOG_NAME);
} }
bool HomeViewModel::IsDebugMode() const noexcept {
return AppSettings::Get().IsDebugMode();
}
void HomeViewModel::IsDebugMode(bool value) {
AppSettings& settings = AppSettings::Get();
if (settings.IsDebugMode() == value) {
return;
}
settings.IsDebugMode(value);
RaisePropertyChanged(L"IsDebugMode");
}
bool HomeViewModel::IsBenchmarkMode() const noexcept { bool HomeViewModel::IsBenchmarkMode() const noexcept {
return AppSettings::Get().IsBenchmarkMode(); return AppSettings::Get().IsBenchmarkMode();
} }
@ -469,19 +484,19 @@ void HomeViewModel::IsBenchmarkMode(bool value) {
RaisePropertyChanged(L"IsBenchmarkMode"); RaisePropertyChanged(L"IsBenchmarkMode");
} }
bool HomeViewModel::IsDebugMode() const noexcept { bool HomeViewModel::IsTopmostDisabled() const noexcept {
return AppSettings::Get().IsDebugMode(); return AppSettings::Get().IsTopmostDisabled();
} }
void HomeViewModel::IsDebugMode(bool value) { void HomeViewModel::IsTopmostDisabled(bool value) {
AppSettings& settings = AppSettings::Get(); AppSettings& settings = AppSettings::Get();
if (settings.IsDebugMode() == value) { if (settings.IsTopmostDisabled() == value) {
return; return;
} }
settings.IsDebugMode(value); settings.IsTopmostDisabled(value);
RaisePropertyChanged(L"IsDebugMode"); RaisePropertyChanged(L"IsTopmostDisabled");
} }
bool HomeViewModel::IsEffectCacheDisabled() const noexcept { bool HomeViewModel::IsEffectCacheDisabled() const noexcept {

View file

@ -87,11 +87,14 @@ struct HomeViewModel : HomeViewModelT<HomeViewModel>, wil::notify_property_chang
void LocateTouchHelperLogs() noexcept; void LocateTouchHelperLogs() noexcept;
void LocateUpdaterLogs() noexcept; void LocateUpdaterLogs() noexcept;
bool IsDebugMode() const noexcept;
void IsDebugMode(bool value);
bool IsBenchmarkMode() const noexcept; bool IsBenchmarkMode() const noexcept;
void IsBenchmarkMode(bool value); void IsBenchmarkMode(bool value);
bool IsDebugMode() const noexcept; bool IsTopmostDisabled() const noexcept;
void IsDebugMode(bool value); void IsTopmostDisabled(bool value);
bool IsEffectCacheDisabled() const noexcept; bool IsEffectCacheDisabled() const noexcept;
void IsEffectCacheDisabled(bool value); void IsEffectCacheDisabled(bool value);

View file

@ -42,6 +42,7 @@ namespace Magpie {
void LocateUpdaterLogs(); void LocateUpdaterLogs();
Boolean IsDebugMode; Boolean IsDebugMode;
Boolean IsBenchmarkMode; Boolean IsBenchmarkMode;
Boolean IsTopmostDisabled;
Boolean IsEffectCacheDisabled; Boolean IsEffectCacheDisabled;
Boolean IsFontCacheDisabled; Boolean IsFontCacheDisabled;
Boolean IsSaveEffectSources; Boolean IsSaveEffectSources;

View file

@ -13,6 +13,7 @@ static std::array SUPPORTED_LANGUAGES{
L"de", L"de",
L"en-us", L"en-us",
L"es", L"es",
L"fi",
L"fr", L"fr",
L"id", L"id",
L"it", L"it",

View file

@ -1,24 +1,11 @@
// Microsoft Visual C++ generated resource script.
//
#pragma code_page(65001) #pragma code_page(65001)
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "winres.h" #include "winres.h"
#include "resource.h"
#include "StrMacros.h"
///////////////////////////////////////////////////////////////////////////// // en-US
#undef APSTUDIO_READONLY_SYMBOLS LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
/////////////////////////////////////////////////////////////////////////////
// 非特定语言 resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU)
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// //
@ -29,54 +16,46 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
// remains consistent on all systems. // remains consistent on all systems.
IDI_APP ICON "Magpie.ico" IDI_APP ICON "Magpie.ico"
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// //
// Version // Version
// //
VS_VERSION_INFO VERSIONINFO VS_VERSION_INFO VERSIONINFO
FILEVERSION 0,0,0,0 FILEVERSION MP_MAJOR_VERSION, MP_MINOR_VERSION, MP_PATCH_VERSION, 0
PRODUCTVERSION 0,0,0,0 PRODUCTVERSION MP_MAJOR_VERSION, MP_MINOR_VERSION, MP_PATCH_VERSION, 0
FILEFLAGSMASK 0x3fL FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
#ifdef _DEBUG #ifdef _DEBUG
FILEFLAGS 0x1L FILEFLAGS VS_FF_DEBUG
#else #else
FILEFLAGS 0x0L FILEFLAGS 0x0L
#endif #endif
FILEOS 0x40004L FILEOS VOS_NT_WINDOWS32
FILETYPE 0x1L FILETYPE VFT_APP
FILESUBTYPE 0x0L FILESUBTYPE VFT2_UNKNOWN
BEGIN BEGIN
BLOCK "StringFileInfo" BLOCK "StringFileInfo"
BEGIN BEGIN
BLOCK "000004b0" BLOCK "040904b0"
BEGIN BEGIN
VALUE "FileVersion", "0.0.0.0" #ifdef MP_VERSION_STRING
VALUE "FileVersion", STRINGIFY(MP_VERSION_STRING)
VALUE "ProductVersion", STRINGIFY(MP_VERSION_STRING)
#elif defined(MP_COMMIT_ID)
VALUE "FileVersion", "dev (" STRINGIFY(MP_COMMIT_ID) ")"
VALUE "ProductVersion", "dev (" STRINGIFY(MP_COMMIT_ID) ")"
#else
VALUE "FileVersion", "dev"
VALUE "ProductVersion", "dev"
#endif
VALUE "InternalName", "Magpie.exe" VALUE "InternalName", "Magpie.exe"
VALUE "LegalCopyright", "Copyright (C) 2023 Liu Xu" VALUE "LegalCopyright", "Copyright © 2021-2025 Xu"
VALUE "OriginalFilename", "Magpie.exe" VALUE "OriginalFilename", "Magpie.exe"
VALUE "ProductName", "Magpie" VALUE "ProductName", "Magpie"
VALUE "ProductVersion", "0.0.0.0"
END END
END END
BLOCK "VarFileInfo" BLOCK "VarFileInfo"
BEGIN BEGIN
VALUE "Translation", 0x0, 1200 VALUE "Translation", 0x409, 1200
END END
END END
#endif // 非特定语言 resources
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED

View file

@ -11,7 +11,6 @@
<MinimalCoreWin>true</MinimalCoreWin> <MinimalCoreWin>true</MinimalCoreWin>
<ProjectGuid>{1239537c-e5b8-427a-9e7f-ea443d1f3529}</ProjectGuid> <ProjectGuid>{1239537c-e5b8-427a-9e7f-ea443d1f3529}</ProjectGuid>
<RootNamespace>$(MSBuildProjectName)</RootNamespace> <RootNamespace>$(MSBuildProjectName)</RootNamespace>
<MinimumVisualStudioVersion>17.0</MinimumVisualStudioVersion>
<!-- 为了编译为 exeAppContainerApplication 必须为 false否则虽然可以编译但无法在 VS 中调试。 --> <!-- 为了编译为 exeAppContainerApplication 必须为 false否则虽然可以编译但无法在 VS 中调试。 -->
<!-- 这会导致不会自动生成 pri稍后我们手动导入 Microsoft.AppXPackage.Targets 来解决这个问题。 --> <!-- 这会导致不会自动生成 pri稍后我们手动导入 Microsoft.AppXPackage.Targets 来解决这个问题。 -->
<AppContainerApplication>false</AppContainerApplication> <AppContainerApplication>false</AppContainerApplication>
@ -39,7 +38,8 @@
<Import Project="..\Common.Pre.props" /> <Import Project="..\Common.Pre.props" />
<PropertyGroup Label="Configuration"> <PropertyGroup Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v143</PlatformToolset> <PlatformToolset Condition="$(VS17)">v143</PlatformToolset>
<PlatformToolset Condition="!$(VS17)">v145</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
@ -84,11 +84,10 @@
<AdditionalIncludeDirectories>..\Magpie.Core\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>..\Magpie.Core\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile> </ClCompile>
<ClCompile Condition="$(UseClangCL)"> <ClCompile Condition="$(UseClangCL)">
<!-- 禁用 cppwinrt 生成的头文件中的编译警告 --> <AdditionalOptions>$(LlvmArchitectureSwitch) %(AdditionalOptions)</AdditionalOptions>
<AdditionalOptions>/clang:-isystem /clang:"$(GeneratedFilesDir)\" $(LlvmArchitectureSwitch) %(AdditionalOptions)</AdditionalOptions>
<!-- clang-cl 不支持 /ZI而且 /Zi 和 /Z7 效果相同。 --> <!-- clang-cl 不支持 /ZI而且 /Zi 和 /Z7 效果相同。 -->
<!-- Microsoft.Cpp.ClangCl.Common.target 始终使用 OldStyle (/Z7),我们和它保持一致。 --> <!-- Microsoft.Cpp.ClangCl.Common.target 始终使用 OldStyle (/Z7),我们和它保持一致。 -->
<DebugInformationFormat>OldStyle</DebugInformationFormat> <DebugInformationFormat Condition="'$(DisablePDB)' != 'true'">OldStyle</DebugInformationFormat>
<!-- clang-cl 使用 MultiProcCL 属性实现并行编译 --> <!-- clang-cl 使用 MultiProcCL 属性实现并行编译 -->
<MultiProcessorCompilation>false</MultiProcessorCompilation> <MultiProcessorCompilation>false</MultiProcessorCompilation>
</ClCompile> </ClCompile>
@ -685,6 +684,7 @@
<PRIResource Include="Resources.language-de.resw" /> <PRIResource Include="Resources.language-de.resw" />
<PRIResource Include="Resources.language-en-US.resw" /> <PRIResource Include="Resources.language-en-US.resw" />
<PRIResource Include="Resources.language-es.resw" /> <PRIResource Include="Resources.language-es.resw" />
<PRIResource Include="Resources.language-fi.resw" />
<PRIResource Include="Resources.language-fr.resw" /> <PRIResource Include="Resources.language-fr.resw" />
<None Include="Resources.language-hu.resw"> <None Include="Resources.language-hu.resw">
<FileType>Document</FileType> <FileType>Document</FileType>
@ -807,9 +807,9 @@
</Target> </Target>
<ImportGroup Label="ExtensionTargets"> <ImportGroup Label="ExtensionTargets">
<Import Project="..\..\packages\Microsoft.UI.Xaml.2.8.7\build\native\Microsoft.UI.Xaml.targets" Condition="Exists('..\..\packages\Microsoft.UI.Xaml.2.8.7\build\native\Microsoft.UI.Xaml.targets')" /> <Import Project="..\..\packages\Microsoft.UI.Xaml.2.8.7\build\native\Microsoft.UI.Xaml.targets" Condition="Exists('..\..\packages\Microsoft.UI.Xaml.2.8.7\build\native\Microsoft.UI.Xaml.targets')" />
<Import Project="..\..\packages\Microsoft.Windows.ImplementationLibrary.1.0.250325.1\build\native\Microsoft.Windows.ImplementationLibrary.targets" Condition="Exists('..\..\packages\Microsoft.Windows.ImplementationLibrary.1.0.250325.1\build\native\Microsoft.Windows.ImplementationLibrary.targets')" />
<Import Project="..\..\packages\Microsoft.Windows.CppWinRT.2.0.250303.1\build\native\Microsoft.Windows.CppWinRT.targets" Condition="Exists('..\..\packages\Microsoft.Windows.CppWinRT.2.0.250303.1\build\native\Microsoft.Windows.CppWinRT.targets')" /> <Import Project="..\..\packages\Microsoft.Windows.CppWinRT.2.0.250303.1\build\native\Microsoft.Windows.CppWinRT.targets" Condition="Exists('..\..\packages\Microsoft.Windows.CppWinRT.2.0.250303.1\build\native\Microsoft.Windows.CppWinRT.targets')" />
<Import Project="..\..\packages\Microsoft.Web.WebView2.1.0.3351.48\build\native\Microsoft.Web.WebView2.targets" Condition="Exists('..\..\packages\Microsoft.Web.WebView2.1.0.3351.48\build\native\Microsoft.Web.WebView2.targets')" /> <Import Project="..\..\packages\Microsoft.Web.WebView2.1.0.3719.77\build\native\Microsoft.Web.WebView2.targets" Condition="Exists('..\..\packages\Microsoft.Web.WebView2.1.0.3719.77\build\native\Microsoft.Web.WebView2.targets')" />
<Import Project="..\..\packages\Microsoft.Windows.ImplementationLibrary.1.0.260126.7\build\native\Microsoft.Windows.ImplementationLibrary.targets" Condition="Exists('..\..\packages\Microsoft.Windows.ImplementationLibrary.1.0.260126.7\build\native\Microsoft.Windows.ImplementationLibrary.targets')" />
</ImportGroup> </ImportGroup>
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild"> <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup> <PropertyGroup>
@ -817,10 +817,10 @@
</PropertyGroup> </PropertyGroup>
<Error Condition="!Exists('..\..\packages\Microsoft.UI.Xaml.2.8.7\build\native\Microsoft.UI.Xaml.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.UI.Xaml.2.8.7\build\native\Microsoft.UI.Xaml.props'))" /> <Error Condition="!Exists('..\..\packages\Microsoft.UI.Xaml.2.8.7\build\native\Microsoft.UI.Xaml.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.UI.Xaml.2.8.7\build\native\Microsoft.UI.Xaml.props'))" />
<Error Condition="!Exists('..\..\packages\Microsoft.UI.Xaml.2.8.7\build\native\Microsoft.UI.Xaml.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.UI.Xaml.2.8.7\build\native\Microsoft.UI.Xaml.targets'))" /> <Error Condition="!Exists('..\..\packages\Microsoft.UI.Xaml.2.8.7\build\native\Microsoft.UI.Xaml.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.UI.Xaml.2.8.7\build\native\Microsoft.UI.Xaml.targets'))" />
<Error Condition="!Exists('..\..\packages\Microsoft.Windows.ImplementationLibrary.1.0.250325.1\build\native\Microsoft.Windows.ImplementationLibrary.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.Windows.ImplementationLibrary.1.0.250325.1\build\native\Microsoft.Windows.ImplementationLibrary.targets'))" />
<Error Condition="!Exists('..\..\packages\Microsoft.Windows.CppWinRT.2.0.250303.1\build\native\Microsoft.Windows.CppWinRT.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.Windows.CppWinRT.2.0.250303.1\build\native\Microsoft.Windows.CppWinRT.props'))" /> <Error Condition="!Exists('..\..\packages\Microsoft.Windows.CppWinRT.2.0.250303.1\build\native\Microsoft.Windows.CppWinRT.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.Windows.CppWinRT.2.0.250303.1\build\native\Microsoft.Windows.CppWinRT.props'))" />
<Error Condition="!Exists('..\..\packages\Microsoft.Windows.CppWinRT.2.0.250303.1\build\native\Microsoft.Windows.CppWinRT.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.Windows.CppWinRT.2.0.250303.1\build\native\Microsoft.Windows.CppWinRT.targets'))" /> <Error Condition="!Exists('..\..\packages\Microsoft.Windows.CppWinRT.2.0.250303.1\build\native\Microsoft.Windows.CppWinRT.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.Windows.CppWinRT.2.0.250303.1\build\native\Microsoft.Windows.CppWinRT.targets'))" />
<Error Condition="!Exists('..\..\packages\Microsoft.Web.WebView2.1.0.3351.48\build\native\Microsoft.Web.WebView2.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.Web.WebView2.1.0.3351.48\build\native\Microsoft.Web.WebView2.targets'))" /> <Error Condition="!Exists('..\..\packages\Microsoft.Web.WebView2.1.0.3719.77\build\native\Microsoft.Web.WebView2.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.Web.WebView2.1.0.3719.77\build\native\Microsoft.Web.WebView2.targets'))" />
<Error Condition="!Exists('..\..\packages\Microsoft.Windows.ImplementationLibrary.1.0.260126.7\build\native\Microsoft.Windows.ImplementationLibrary.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.Windows.ImplementationLibrary.1.0.260126.7\build\native\Microsoft.Windows.ImplementationLibrary.targets'))" />
</Target> </Target>
<!-- 防止生成的 winmd 被复制到输出文件夹 --> <!-- 防止生成的 winmd 被复制到输出文件夹 -->
<PropertyGroup Condition="!$(IsPackaged)"> <PropertyGroup Condition="!$(IsPackaged)">

View file

@ -397,6 +397,9 @@
<PRIResource Include="Resources.language-ta.resw"> <PRIResource Include="Resources.language-ta.resw">
<Filter>Strings</Filter> <Filter>Strings</Filter>
</PRIResource> </PRIResource>
<PRIResource Include="Resources.language-fi.resw">
<Filter>Strings</Filter>
</PRIResource>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Text Include="conanfile.txt" /> <Text Include="conanfile.txt" />

View file

@ -41,6 +41,7 @@ struct Profile {
customInitialWindowedScaleFactor = other.customInitialWindowedScaleFactor; customInitialWindowedScaleFactor = other.customInitialWindowedScaleFactor;
cursorScaling = other.cursorScaling; cursorScaling = other.cursorScaling;
customCursorScaling = other.customCursorScaling; customCursorScaling = other.customCursorScaling;
autoHideCursorDelay = other.autoHideCursorDelay;
cropping = other.cropping; cropping = other.cropping;
captureMethod = other.captureMethod; captureMethod = other.captureMethod;
graphicsCardId = other.graphicsCardId; graphicsCardId = other.graphicsCardId;
@ -48,10 +49,12 @@ struct Profile {
multiMonitorUsage = other.multiMonitorUsage; multiMonitorUsage = other.multiMonitorUsage;
cursorInterpolationMode = other.cursorInterpolationMode; cursorInterpolationMode = other.cursorInterpolationMode;
launchParameters = other.launchParameters; launchParameters = other.launchParameters;
destAlignment = other.destAlignment;
scalingFlags = other.scalingFlags; scalingFlags = other.scalingFlags;
isCroppingEnabled = other.isCroppingEnabled; isCroppingEnabled = other.isCroppingEnabled;
isFrameRateLimiterEnabled = other.isFrameRateLimiterEnabled; isFrameRateLimiterEnabled = other.isFrameRateLimiterEnabled;
isAutoHideCursorEnabled = other.isAutoHideCursorEnabled;
} }
DEFINE_FLAG_ACCESSOR(Is3DGameMode, ScalingFlags::Is3DGameMode, scalingFlags) DEFINE_FLAG_ACCESSOR(Is3DGameMode, ScalingFlags::Is3DGameMode, scalingFlags)
@ -92,6 +95,7 @@ struct Profile {
float maxFrameRate = 60.0f; float maxFrameRate = 60.0f;
std::wstring launchParameters; std::wstring launchParameters;
DestAlignment destAlignment = DestAlignment::Center;
uint32_t scalingFlags = ScalingFlags::AdjustCursorSpeed; uint32_t scalingFlags = ScalingFlags::AdjustCursorSpeed;

View file

@ -518,6 +518,23 @@
</TextBox.ContextFlyout> </TextBox.ContextFlyout>
</TextBox> </TextBox>
</local:SettingsCard> </local:SettingsCard>
<local:SettingsCard x:Uid="Profile_Advanced_DestAlignment">
<local:SettingsCard.HeaderIcon>
<FontIcon Glyph="&#xE799;" />
</local:SettingsCard.HeaderIcon>
<ComboBox DropDownOpened="ComboBox_DropDownOpened"
SelectedIndex="{x:Bind ViewModel.DestAlignment, Mode=TwoWay}">
<ComboBoxItem x:Uid="Profile_Advanced_DestAlignment_TopLeft" />
<ComboBoxItem x:Uid="Profile_Advanced_DestAlignment_TopCenter" />
<ComboBoxItem x:Uid="Profile_Advanced_DestAlignment_TopRight" />
<ComboBoxItem x:Uid="Profile_Advanced_DestAlignment_Left" />
<ComboBoxItem x:Uid="Profile_Advanced_DestAlignment_Center" />
<ComboBoxItem x:Uid="Profile_Advanced_DestAlignment_Right" />
<ComboBoxItem x:Uid="Profile_Advanced_DestAlignment_BottomLeft" />
<ComboBoxItem x:Uid="Profile_Advanced_DestAlignment_BottomCenter" />
<ComboBoxItem x:Uid="Profile_Advanced_DestAlignment_BottomRight" />
</ComboBox>
</local:SettingsCard>
<local:SettingsCard x:Uid="Profile_Advanced_DisableDirectFlip"> <local:SettingsCard x:Uid="Profile_Advanced_DisableDirectFlip">
<local:SettingsCard.HeaderIcon> <local:SettingsCard.HeaderIcon>
<FontIcon Glyph="&#xF259;" /> <FontIcon Glyph="&#xF259;" />

View file

@ -794,6 +794,26 @@ void ProfileViewModel::LaunchParameters(const hstring& value) {
RaisePropertyChanged(L"LaunchParameters"); RaisePropertyChanged(L"LaunchParameters");
} }
int ProfileViewModel::DestAlignment() const noexcept {
return (int)_data->destAlignment;
}
void ProfileViewModel::DestAlignment(int value) {
if (value < 0) {
return;
}
::Magpie::DestAlignment alignment = (::Magpie::DestAlignment)value;
if (_data->destAlignment == alignment) {
return;
}
_data->destAlignment = alignment;
AppSettings::Get().SaveAsync();
RaisePropertyChanged(L"DestAlignment");
}
bool ProfileViewModel::IsDirectFlipDisabled() const noexcept { bool ProfileViewModel::IsDirectFlipDisabled() const noexcept {
return _data->IsDirectFlipDisabled(); return _data->IsDirectFlipDisabled();
} }

View file

@ -142,6 +142,9 @@ struct ProfileViewModel : ProfileViewModelT<ProfileViewModel>,
hstring LaunchParameters() const noexcept; hstring LaunchParameters() const noexcept;
void LaunchParameters(const hstring& value); void LaunchParameters(const hstring& value);
int DestAlignment() const noexcept;
void DestAlignment(int value);
bool IsDirectFlipDisabled() const noexcept; bool IsDirectFlipDisabled() const noexcept;
void IsDirectFlipDisabled(bool value); void IsDirectFlipDisabled(bool value);

View file

@ -65,6 +65,7 @@ namespace Magpie {
String AutoHideCursorDelayText { get; }; String AutoHideCursorDelayText { get; };
String LaunchParameters; String LaunchParameters;
Int32 DestAlignment;
Boolean IsDirectFlipDisabled; Boolean IsDirectFlipDisabled;
} }
} }

View file

@ -307,7 +307,7 @@
<value>Bilinear</value> <value>Bilinear</value>
</data> </data>
<data name="Profile_Cursor_DrawCursor_Interpolation_NearestNeighbor.Content" xml:space="preserve"> <data name="Profile_Cursor_DrawCursor_Interpolation_NearestNeighbor.Content" xml:space="preserve">
<value>Nearest-neighbor</value> <value>Nächster Nachbar</value>
</data> </data>
<data name="Profile_Cursor_DrawCursor_ScaleFactor_NoScaling.Content" xml:space="preserve"> <data name="Profile_Cursor_DrawCursor_ScaleFactor_NoScaling.Content" xml:space="preserve">
<value>Keine Skalierung</value> <value>Keine Skalierung</value>
@ -484,7 +484,7 @@
<value>Eine Funktion vorschlagen</value> <value>Eine Funktion vorschlagen</value>
</data> </data>
<data name="About_Version_UpdateSettings_CheckForPreviewUpdates.Header" xml:space="preserve"> <data name="About_Version_UpdateSettings_CheckForPreviewUpdates.Header" xml:space="preserve">
<value>Prüfen Sie auf Aktualisierungen der Vorabversion</value> <value>Prüfen auf Aktualisierungen der Vorabversion</value>
</data> </data>
<data name="About_Version_UpdateSettings_AutoCheckForUpdates.Header" xml:space="preserve"> <data name="About_Version_UpdateSettings_AutoCheckForUpdates.Header" xml:space="preserve">
<value>Automatisch nach Updates suchen</value> <value>Automatisch nach Updates suchen</value>
@ -511,10 +511,10 @@
<value>Magpie ist auf dem neuesten Stand</value> <value>Magpie ist auf dem neuesten Stand</value>
</data> </data>
<data name="About_Version_UpdateToDate_Downloading.Text" xml:space="preserve"> <data name="About_Version_UpdateToDate_Downloading.Text" xml:space="preserve">
<value>Downloading</value> <value>Lädt herunter</value>
</data> </data>
<data name="About_Version_UpdateToDate_Installing.Text" xml:space="preserve"> <data name="About_Version_UpdateToDate_Installing.Text" xml:space="preserve">
<value>Installieren</value> <value>Wird installiert</value>
</data> </data>
<data name="Profile_Advanced.Header" xml:space="preserve"> <data name="Profile_Advanced.Header" xml:space="preserve">
<value>Erweitert</value> <value>Erweitert</value>
@ -607,7 +607,7 @@
<value>Startparameter</value> <value>Startparameter</value>
</data> </data>
<data name="Overlay_Profiler" xml:space="preserve"> <data name="Overlay_Profiler" xml:space="preserve">
<value>Profiler</value> <value>Profilerstellung</value>
</data> </data>
<data name="Overlay_Profiler_CaptureMethod" xml:space="preserve"> <data name="Overlay_Profiler_CaptureMethod" xml:space="preserve">
<value>Aufnahmemethode</value> <value>Aufnahmemethode</value>
@ -622,7 +622,7 @@
<value>Zu Effekten wechseln</value> <value>Zu Effekten wechseln</value>
</data> </data>
<data name="Overlay_Profiler_Timings_SwitchToPasses" xml:space="preserve"> <data name="Overlay_Profiler_Timings_SwitchToPasses" xml:space="preserve">
<value>Zu passes wechseln</value> <value>Zu Durchläufen wechseln</value>
</data> </data>
<data name="Overlay_Profiler_Timings_Total" xml:space="preserve"> <data name="Overlay_Profiler_Timings_Total" xml:space="preserve">
<value>Gesamt</value> <value>Gesamt</value>
@ -716,7 +716,7 @@
<value>Freischalten</value> <value>Freischalten</value>
</data> </data>
<data name="Overlay_Profiler_Timings" xml:space="preserve"> <data name="Overlay_Profiler_Timings" xml:space="preserve">
<value>Timings</value> <value>Zeitabstände</value>
</data> </data>
<data name="About_Version_CommitId" xml:space="preserve"> <data name="About_Version_CommitId" xml:space="preserve">
<value>Commit</value> <value>Commit</value>
@ -781,4 +781,277 @@
<data name="Home_Advanced_MinFrameRate.Header" xml:space="preserve"> <data name="Home_Advanced_MinFrameRate.Header" xml:space="preserve">
<value>Minimale Bildwiederholrate</value> <value>Minimale Bildwiederholrate</value>
</data> </data>
<data name="Message_Maximized" xml:space="preserve">
<value>Die Skalierung von maximierten oder Vollbildfenstern ist deaktiviert. Du kannst diese Einstellung auf der Startseite ändern.</value>
</data>
<data name="Message_LowIntegrityLevel" xml:space="preserve">
<value>Magpie muss als Administrator gestartet werden, um dieses Fenster zu skalieren.</value>
</data>
<data name="Message_ScalingFailedGeneral" xml:space="preserve">
<value>Bitte sieh dir die Logs für mehr Details an.</value>
</data>
<data name="Message_CreateFenceFailed" xml:space="preserve">
<value>Die aktuelle Grafikkarte unterstützt ID3D11Device5::CreateFence nicht. Bitte versuche, die Grafikkarte zu wechseln oder die Treiber zu aktualisieren.</value>
</data>
<data name="Profile_Performance_NoGraphicsCard.Title" xml:space="preserve">
<value>Es wurde keine kompatible Grafikkarte gefunden. Stattdessen wird CPURendering verwendet. Die Leistung entspricht möglicherweise nicht den Erwartungen.</value>
</data>
<data name="Message_CaptureFailed" xml:space="preserve">
<value>Ein Fehler ist bei dem Erfassen des Fensters ist aufgetreten. Bitte verwende eine andere Erfassungsmethode.</value>
</data>
<data name="Home_Advanced_MinFrameRate.Description" xml:space="preserve">
<value>Stabilisiert die GPUFrequenz, um Ruckeln zu reduzieren. Dies kann jedoch den Stromverbrauch erhöhen</value>
</data>
<data name="Home_Advanced_DeveloperOptions_DisableFP16.Content" xml:space="preserve">
<value>Deaktiviert die Nutzung von FP16 in Shadern</value>
</data>
<data name="Home_Advanced_DeveloperOptions_BenchmarkMode.Content" xml:space="preserve">
<value>BenchmarkModus</value>
</data>
<data name="Root_NewProfileFlyout_NameContextFlyout_AppName" xml:space="preserve">
<value>Mit Anwendungsname füllen</value>
</data>
<data name="Root_NewProfileFlyout_NameContextFlyout_ProcessName" xml:space="preserve">
<value>Mit Prozessname füllen</value>
</data>
<data name="Root_NewProfileFlyout_NameContextFlyout_WindowTitle" xml:space="preserve">
<value>Mit Fenstername füllen</value>
</data>
<data name="TextMenuFlyout_Copy" xml:space="preserve">
<value>Kopieren</value>
</data>
<data name="TextMenuFlyout_Cut" xml:space="preserve">
<value>Ausschneiden</value>
</data>
<data name="TextMenuFlyout_Paste" xml:space="preserve">
<value>Einfügen</value>
</data>
<data name="TextMenuFlyout_Redo" xml:space="preserve">
<value>Wiederholen</value>
</data>
<data name="TextMenuFlyout_SelectAll" xml:space="preserve">
<value>Alle auswählen</value>
</data>
<data name="TextMenuFlyout_Undo" xml:space="preserve">
<value>Rückgängig machen</value>
</data>
<data name="Message_BannedInWindowedMode" xml:space="preserve">
<value>Die Fensterskalierung wird für dieses Fenster nicht unterstützt.</value>
</data>
<data name="Message_InvalidCropping" xml:space="preserve">
<value>Benutzerdefinierter Zuschnitt konnte nicht angewendet werden.</value>
</data>
<data name="Home_TouchSupport.Description" xml:space="preserve">
<value>Aufgrund von Sicherheitsbeschränkungen des Systems benötigt Magpie das UIAccessPrivileg, um TouchEingaben zu unterstützen.</value>
</data>
<data name="Home_Activation.Description" xml:space="preserve">
<value>Drücke die Tastenkombination, um das Vordergrundfenster zu skalieren oder die Skalierung zu stoppen.</value>
</data>
<data name="Home_Activation_FullscreenScaling.Header" xml:space="preserve">
<value>Tastenkombination für VollbildSkalierung</value>
</data>
<data name="Home_Activation_FullscreenScaling_ShortcutControl.Title" xml:space="preserve">
<value>Tastenkombination für VollbildSkalierung</value>
</data>
<data name="Home_Activation_WindowedScaling.Header" xml:space="preserve">
<value>Tastenkombination für FensterSkalierung</value>
</data>
<data name="Home_Activation_WindowedScaling_ShortcutControl.Title" xml:space="preserve">
<value>Tastenkombination für FensterSkalierung</value>
</data>
<data name="Home_Advanced_AllowScalingMaximized.Description" xml:space="preserve">
<value>Dies gilt nur für die Vollbildskalierung</value>
</data>
<data name="Home_Toolbar.Description" xml:space="preserve">
<value>Die Symbolleiste erscheint oben im skalierten Fenster und bietet Funktionen wie FPSAnzeige und ScreenshotAufnahme. Im Fenstermodus ermöglicht sie außerdem das Verschieben des skalierten Fensters.</value>
</data>
<data name="Home_Toolbar.Header" xml:space="preserve">
<value>Symbolleiste</value>
</data>
<data name="Home_Toolbar_InitialState.Header" xml:space="preserve">
<value>Anfangszustand der Symbolleiste</value>
</data>
<data name="Home_Toolbar_InitialState_AlwaysShow.Content" xml:space="preserve">
<value>Immer anzeigen</value>
</data>
<data name="Home_Toolbar_InitialState_AutoHide.Content" xml:space="preserve">
<value>Automatisch ausblenden</value>
</data>
<data name="Home_Toolbar_InitialState_Off.Content" xml:space="preserve">
<value>Aus</value>
</data>
<data name="Home_Toolbar_StateToggle.Header" xml:space="preserve">
<value>Tastenkombination zum Umschalten der Symbolleiste</value>
</data>
<data name="Home_Toolbar_StateToggle_ShortcutControl.Title" xml:space="preserve">
<value>Tastenkombination zum Umschalten der Symbolleiste</value>
</data>
<data name="Message_ScreenshotFailed" xml:space="preserve">
<value>Screenshot fehlgeschlagen.</value>
</data>
<data name="Message_ScreenshotSaved" xml:space="preserve">
<value>Screenshot gespeichert als {}</value>
</data>
<data name="Message_ExportScalingModesFailed" xml:space="preserve">
<value>Exportieren der Skalierungsmodi fehlgeschlagen.</value>
</data>
<data name="Home_TouchSupport_Warn.Title" xml:space="preserve">
<value>Die Symbolleiste ist nicht mit TouchEingaben kompatibel.</value>
</data>
<data name="NotifyIcon_Timer_Fullscreen" xml:space="preserve">
<value>Skaliere nach {}s (Vollbild)</value>
</data>
<data name="Message_ToolbarIn3DGameMode" xml:space="preserve">
<value>Die Symbolleiste wird im 3DSpielmodus nicht unterstützt.</value>
</data>
<data name="Message_ImportScalingModesFailed" xml:space="preserve">
<value>Importieren der Skalierungsmodi fehlgeschlagen.</value>
</data>
<data name="Home_Advanced_DeveloperOptions_DisableTopmost.Content" xml:space="preserve">
<value>ImmerimVordergrund deaktivieren</value>
</data>
<data name="Overlay_Toolbar_SwitchToFullscreen" xml:space="preserve">
<value>Zur Vollbildskalierung wechseln</value>
</data>
<data name="Overlay_Toolbar_Close" xml:space="preserve">
<value>Skalierung stoppen</value>
</data>
<data name="Overlay_Toolbar_Close_Description" xml:space="preserve">
<value>Rechtsklick zum Schließen der Symbolleiste</value>
</data>
<data name="Overlay_Toolbar_Demo" xml:space="preserve">
<value>ImGuiDemoFenster</value>
</data>
<data name="Overlay_Toolbar_Minimize" xml:space="preserve">
<value>Minimieren</value>
</data>
<data name="Message_WindowedDesktopDuplication" xml:space="preserve">
<value>Die Fensterskalierung wird nicht mit DesktopDuplizierungsaufnahme unterstützt.</value>
</data>
<data name="Profile_General_3DGameMode.Description" xml:space="preserve">
<value>Aktiviert Optimierungen für 3DSpiele, ist aber nicht mit Symbolleiste und Fensterskalierung kompatibel</value>
</data>
<data name="Home_Toolbar_InitialState_Fullscreen.Header" xml:space="preserve">
<value>Vollbildskalierung</value>
</data>
<data name="Home_Toolbar_InitialState_Windowed.Header" xml:space="preserve">
<value>Fensterskalierung</value>
</data>
<data name="Message_ToolbarNewState" xml:space="preserve">
<value>Symbolleiste: {}</value>
</data>
<data name="NotifyIcon_Timer_Windowed" xml:space="preserve">
<value>Skaliere nach {}s (Fenster)</value>
</data>
<data name="Overlay_Toolbar_Pin" xml:space="preserve">
<value>Symbolleiste anheften</value>
</data>
<data name="Overlay_Toolbar_Profiler" xml:space="preserve">
<value>ProfilerFenster</value>
</data>
<data name="Message_Windowed3DGameMode" xml:space="preserve">
<value>Fensterskalierung wird im 3DSpielmodus nicht unterstützt.</value>
</data>
<data name="Profile_Advanced_DestAlignment_Right.Content" xml:space="preserve">
<value>Rechts</value>
</data>
<data name="Overlay_Toolbar_TakeScreenshot" xml:space="preserve">
<value>Screenshot aufnehmen</value>
</data>
<data name="Overlay_Toolbar_SwitchToWindowed" xml:space="preserve">
<value>Zur Fensterskalierung wechseln</value>
</data>
<data name="Overlay_Toolbar_TakeScreenshot_Description" xml:space="preserve">
<value>Rechtsklick zum Exportieren des Zwischenergebnisses</value>
</data>
<data name="Overlay_Toolbar_TakeScreenshot_PopupTitle" xml:space="preserve">
<value>Zwischenergebnis exportieren</value>
</data>
<data name="Profile_WindowedScaling.Header" xml:space="preserve">
<value>Fensterskalierung</value>
</data>
<data name="Profile_WindowedScaling_InitialScaleFactor_Auto.Content" xml:space="preserve">
<value>Automatisch</value>
</data>
<data name="Profile_WindowedScaling_InitialScaleFactor_Custom.Content" xml:space="preserve">
<value>Benutzerdefiniert</value>
</data>
<data name="Profile_Advanced_DisableDirectFlip.Description" xml:space="preserve">
<value>Hilft, bestimmte Kompatibilitätsprobleme zu vermeiden, kann jedoch die Latenz deutlich erhöhen</value>
</data>
<data name="Profile_General_AutoScale_Disabled.Content" xml:space="preserve">
<value>Deaktiviert</value>
</data>
<data name="Profile_General_AutoScale_Fullscreen.Content" xml:space="preserve">
<value>Vollbildskalierung</value>
</data>
<data name="Profile_General_AutoScale_Windowed.Content" xml:space="preserve">
<value>Fensterskalierung</value>
</data>
<data name="Profile_General_Multimonitor.Description" xml:space="preserve">
<value>Gilt nur für die Vollbildskalierung</value>
</data>
<data name="Home_Toolbar_ScreenshotSaveDirectory_Change.Content" xml:space="preserve">
<value>Ändern</value>
</data>
<data name="Settings_Launch_RunAtStartup.Description" xml:space="preserve">
<value>Das Hauptfenster wird nicht angezeigt, wenn "App im Infobereich anzeigen" aktiviert ist</value>
</data>
<data name="Home_Activation_Timer_Description" xml:space="preserve">
<value>Vordergrundfenster skalieren nach {}s</value>
</data>
<data name="Dialog_SetlectScreenshotSaveDirectory_Title" xml:space="preserve">
<value>Ordner zum Speichern von Screenshots auswählen</value>
</data>
<data name="Profile_Advanced_DestAlignment_BottomCenter.Content" xml:space="preserve">
<value>Unten mitte</value>
</data>
<data name="Profile_Advanced_DestAlignment_BottomLeft.Content" xml:space="preserve">
<value>Unten links</value>
</data>
<data name="Profile_Advanced_DestAlignment_BottomRight.Content" xml:space="preserve">
<value>Unten rechts</value>
</data>
<data name="Profile_Advanced_DestAlignment_Center.Content" xml:space="preserve">
<value>Mitte</value>
</data>
<data name="Profile_Advanced_DestAlignment_Left.Content" xml:space="preserve">
<value>Links</value>
</data>
<data name="Profile_Advanced_DestAlignment_TopCenter.Content" xml:space="preserve">
<value>Oben mitte</value>
</data>
<data name="Profile_Advanced_DestAlignment_TopLeft.Content" xml:space="preserve">
<value>Oben links</value>
</data>
<data name="Profile_Advanced_DestAlignment_TopRight.Content" xml:space="preserve">
<value>Oben rechts</value>
</data>
<data name="Home_Toolbar_ScreenshotSaveDirectory.Header" xml:space="preserve">
<value>ScreenshotSpeicherort</value>
</data>
<data name="Profile_WindowedScaling_InitialScaleFactor.Header" xml:space="preserve">
<value>Anfänglicher Skalierungsfaktor</value>
</data>
<data name="Home_Advanced_DeveloperOptions_LocateLogs.Header" xml:space="preserve">
<value>LogOrdner öffnen</value>
</data>
<data name="Profile_General_DesktopDuplicationWarning.Title" xml:space="preserve">
<value>Diese Erfassungsmethode ist nicht mit der FensterSkalierung kompatibel.</value>
</data>
<data name="Home_Activation_Timer_Start" xml:space="preserve">
<value>Start</value>
</data>
<data name="Profile_Cursor_AutoHide.Header" xml:space="preserve">
<value>Mauszeiger bei Inaktivität ausblenden</value>
</data>
<data name="Profile_Cursor_AutoHide_Delay.Header" xml:space="preserve">
<value>Ausblendverzögerung in Sekunden</value>
</data>
<data name="Profile_Advanced_DestAlignment.Description" xml:space="preserve">
<value>Gilt nur für die VollbildSkalierung</value>
</data>
<data name="Profile_Advanced_DestAlignment.Header" xml:space="preserve">
<value>Ausgabeausrichtung</value>
</data>
</root> </root>

View file

@ -1018,4 +1018,40 @@
<data name="Profile_Cursor_AutoHide_Delay.Header" xml:space="preserve"> <data name="Profile_Cursor_AutoHide_Delay.Header" xml:space="preserve">
<value>Hide delay in seconds</value> <value>Hide delay in seconds</value>
</data> </data>
<data name="Profile_Advanced_DestAlignment.Description" xml:space="preserve">
<value>Applies only to fullscreen scaling</value>
</data>
<data name="Profile_Advanced_DestAlignment.Header" xml:space="preserve">
<value>Output alignment</value>
</data>
<data name="Profile_Advanced_DestAlignment_BottomCenter.Content" xml:space="preserve">
<value>Bottom center</value>
</data>
<data name="Profile_Advanced_DestAlignment_BottomLeft.Content" xml:space="preserve">
<value>Bottom left</value>
</data>
<data name="Profile_Advanced_DestAlignment_BottomRight.Content" xml:space="preserve">
<value>Bottom right</value>
</data>
<data name="Profile_Advanced_DestAlignment_Center.Content" xml:space="preserve">
<value>Center</value>
</data>
<data name="Profile_Advanced_DestAlignment_Left.Content" xml:space="preserve">
<value>Left</value>
</data>
<data name="Profile_Advanced_DestAlignment_Right.Content" xml:space="preserve">
<value>Right</value>
</data>
<data name="Profile_Advanced_DestAlignment_TopCenter.Content" xml:space="preserve">
<value>Top center</value>
</data>
<data name="Profile_Advanced_DestAlignment_TopLeft.Content" xml:space="preserve">
<value>Top left</value>
</data>
<data name="Profile_Advanced_DestAlignment_TopRight.Content" xml:space="preserve">
<value>Top right</value>
</data>
<data name="Home_Advanced_DeveloperOptions_DisableTopmost.Content" xml:space="preserve">
<value>Disable always-on-top</value>
</data>
</root> </root>

View file

@ -283,7 +283,7 @@
<value>Mover hacia arriba</value> <value>Mover hacia arriba</value>
</data> </data>
<data name="ScalingModes_NewScalingModeFlyout_CopyFrom.Text" xml:space="preserve"> <data name="ScalingModes_NewScalingModeFlyout_CopyFrom.Text" xml:space="preserve">
<value>Copiado de</value> <value>Copiar de</value>
</data> </data>
<data name="ScalingModes_NewScalingModeFlyout_CopyFrom_None" xml:space="preserve"> <data name="ScalingModes_NewScalingModeFlyout_CopyFrom_None" xml:space="preserve">
<value>Ninguno</value> <value>Ninguno</value>
@ -766,4 +766,160 @@
<data name="Home_Advanced_SimulateExclusiveFullscreen_InfoBar.Title" xml:space="preserve"> <data name="Home_Advanced_SimulateExclusiveFullscreen_InfoBar.Title" xml:space="preserve">
<value>Esta opción no es compatible con algunos juegos antiguos. Úsela con precaución.</value> <value>Esta opción no es compatible con algunos juegos antiguos. Úsela con precaución.</value>
</data> </data>
<data name="Message_InvalidScalingMode" xml:space="preserve">
<value>Modo de escalado inválido.</value>
</data>
<data name="Message_TouchSupport" xml:space="preserve">
<value>Falló la integración de soporte táctil.</value>
</data>
<data name="Message_InvalidSourceWindow" xml:space="preserve">
<value>El escalado de esta ventana no esta disponible.</value>
</data>
<data name="Message_Maximized" xml:space="preserve">
<value>El escalado de ventanas maximizadas o en pantalla completa está desactivado. Puedes cambiar este ajuste en la página de Inicio.</value>
</data>
<data name="Message_LowIntegrityLevel" xml:space="preserve">
<value>Magpie necesita ejecutarse como administrador para escalar esta ventana.</value>
</data>
<data name="Message_ScalingFailedGeneral" xml:space="preserve">
<value>Por favor revisa los logs para mas detalles.</value>
</data>
<data name="Message_CaptureFailed" xml:space="preserve">
<value>Ocurrió un error mientras se capturaba esta ventana. Por favor intenta usar un método de captura diferente.</value>
</data>
<data name="Message_CreateFenceFailed" xml:space="preserve">
<value>La tarjeta gráfica actual no soporta ID3D11Device5::CreateFence. Por favor intenta usar otra tarjeta gráfica o actualizar los drivers.</value>
</data>
<data name="Message_ScalingFailed" xml:space="preserve">
<value>Escalado fallido</value>
</data>
<data name="Profile_Performance_NoGraphicsCard.Title" xml:space="preserve">
<value>No se encontraron tarjetas gráficas compatibles, por lo que se usará renderizado de CPU. El rendimiento puede no ser el esperado.</value>
</data>
<data name="Home_Advanced_MinFrameRate.Header" xml:space="preserve">
<value>Tasa de cuadros mínima</value>
</data>
<data name="Home_Advanced_MinFrameRate.Description" xml:space="preserve">
<value>Estabiliza la frecuencia de la GPU para reducir el stuttering, pero puede aumentar el consumo energético</value>
</data>
<data name="Home_Advanced_DeveloperOptions_DisableFP16.Content" xml:space="preserve">
<value>Desactiva el uso de FP16 en shaders</value>
</data>
<data name="Home_Advanced_DeveloperOptions_BenchmarkMode.Content" xml:space="preserve">
<value>Modo de prueba de rendimiento</value>
</data>
<data name="Root_NewProfileFlyout_NameContextFlyout_AppName" xml:space="preserve">
<value>Completar con nombre de la aplicación</value>
</data>
<data name="Root_NewProfileFlyout_NameContextFlyout_ProcessName" xml:space="preserve">
<value>Completar con nombre del proceso</value>
</data>
<data name="Root_NewProfileFlyout_NameContextFlyout_WindowTitle" xml:space="preserve">
<value>Completar con título de la ventana</value>
</data>
<data name="TextMenuFlyout_Copy" xml:space="preserve">
<value>Copiar</value>
</data>
<data name="TextMenuFlyout_Cut" xml:space="preserve">
<value>Cortar</value>
</data>
<data name="TextMenuFlyout_Paste" xml:space="preserve">
<value>Pegar</value>
</data>
<data name="TextMenuFlyout_Redo" xml:space="preserve">
<value>Rehacer</value>
</data>
<data name="TextMenuFlyout_SelectAll" xml:space="preserve">
<value>Seleccionar Todo</value>
</data>
<data name="TextMenuFlyout_Undo" xml:space="preserve">
<value>Deshacer</value>
</data>
<data name="Message_BannedInWindowedMode" xml:space="preserve">
<value>El escalado de esta ventana en modo ventana no está soportado.</value>
</data>
<data name="Home_Activation_FullscreenScaling.Header" xml:space="preserve">
<value>Atajo de escalado en pantalla completa</value>
</data>
<data name="Home_Activation_FullscreenScaling_ShortcutControl.Title" xml:space="preserve">
<value>Atajo de escalado en pantalla completa</value>
</data>
<data name="Home_Activation_WindowedScaling.Header" xml:space="preserve">
<value>Atajo de escalado en modo ventana</value>
</data>
<data name="Home_Activation_WindowedScaling_ShortcutControl.Title" xml:space="preserve">
<value>Atajo de escalado en modo ventana</value>
</data>
<data name="Home_Advanced_AllowScalingMaximized.Description" xml:space="preserve">
<value>Se aplica solamente al escalado en pantalla completa</value>
</data>
<data name="Home_Toolbar.Description" xml:space="preserve">
<value>La barra de herramientas aparece sobre la ventana escalada, brindando características como mostrar FPS y captura de pantalla. En modo de ventana, también permite arrastrar la ventana escalada.</value>
</data>
<data name="Home_Toolbar.Header" xml:space="preserve">
<value>Barra de herramientas</value>
</data>
<data name="Home_Toolbar_InitialState.Header" xml:space="preserve">
<value>Estado inicial de barra de herramientas</value>
</data>
<data name="Home_Toolbar_InitialState_AlwaysShow.Content" xml:space="preserve">
<value>Mostrar siempre</value>
</data>
<data name="Home_Toolbar_InitialState_AutoHide.Content" xml:space="preserve">
<value>Ocultar automáticamente</value>
</data>
<data name="Home_Toolbar_InitialState_Off.Content" xml:space="preserve">
<value>Desactivado</value>
</data>
<data name="Message_ToolbarIn3DGameMode" xml:space="preserve">
<value>La barra de herramientas no está soportada en modo de juego 3D.</value>
</data>
<data name="Message_ToolbarNewState" xml:space="preserve">
<value>Barra de herramientas: {}</value>
</data>
<data name="Overlay_Toolbar_Close" xml:space="preserve">
<value>Detener Escalado</value>
</data>
<data name="Overlay_Toolbar_Demo" xml:space="preserve">
<value>Ventana de demostración ImGui</value>
</data>
<data name="Overlay_Toolbar_Pin" xml:space="preserve">
<value>Anclar barra de herramientas</value>
</data>
<data name="Overlay_Toolbar_TakeScreenshot" xml:space="preserve">
<value>Tomar captura de pantalla</value>
</data>
<data name="Message_Windowed3DGameMode" xml:space="preserve">
<value>El escalado en modo ventana no está soportado en modo de juego 3D.</value>
</data>
<data name="Profile_General_3DGameMode.Description" xml:space="preserve">
<value>Activa optimizaciones para juegos 3D, pero no es compatible con la barra de herramientas y el escalado en modo ventana</value>
</data>
<data name="Home_Toolbar_ScreenshotSaveDirectory.Header" xml:space="preserve">
<value>Ruta de guardado de capturas de pantalla</value>
</data>
<data name="Home_Toolbar_ScreenshotSaveDirectory_Change.Content" xml:space="preserve">
<value>Cambiar</value>
</data>
<data name="Dialog_SetlectScreenshotSaveDirectory_Title" xml:space="preserve">
<value>Selecciona una ruta para guardar capturas de pantalla</value>
</data>
<data name="Message_ScreenshotSaved" xml:space="preserve">
<value>Captura guardada como {}</value>
</data>
<data name="Message_ScreenshotFailed" xml:space="preserve">
<value>Captura fallida.</value>
</data>
<data name="Profile_WindowedScaling.Header" xml:space="preserve">
<value>Escalado en modo de ventana</value>
</data>
<data name="Profile_WindowedScaling_InitialScaleFactor.Header" xml:space="preserve">
<value>Factor inicial de escalado</value>
</data>
<data name="Profile_WindowedScaling_InitialScaleFactor_Auto.Content" xml:space="preserve">
<value>Auto</value>
</data>
<data name="Profile_WindowedScaling_InitialScaleFactor_Custom.Content" xml:space="preserve">
<value>Personalizado</value>
</data>
</root> </root>

View file

@ -0,0 +1,998 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="About_PageFrame.Title" xml:space="preserve">
<value>Tietoja</value>
</data>
<data name="Home_Activation.Header" xml:space="preserve">
<value>Aktivointi</value>
</data>
<data name="Home_PageFrame.Title" xml:space="preserve">
<value>Koti</value>
</data>
<data name="Home_Activation_Timer.Header" xml:space="preserve">
<value>Viivästetty skaalaus</value>
</data>
<data name="Home_Activation_Timer_Cancel" xml:space="preserve">
<value>Peruuta</value>
</data>
<data name="Home_Activation_Timer_Delay.Header" xml:space="preserve">
<value>Viive sekunneissa</value>
</data>
<data name="ShortcutDialog_Cancel" xml:space="preserve">
<value>Peruuta</value>
</data>
<data name="ShortcutDialog_Description.Text" xml:space="preserve">
<value>Paina näppäinyhdistelmä vaihtaaksesi tämän pikanäppäimen</value>
</data>
<data name="ShortcutDialog_InUse" xml:space="preserve">
<value>Käytössä muualla</value>
</data>
<data name="ShortcutDialog_InvalidShortcut" xml:space="preserve">
<value>Virheellinen pikanäppäin</value>
</data>
<data name="ShortcutDialog_Save" xml:space="preserve">
<value>Tallenna</value>
</data>
<data name="ShortcutDialog_Tip.Text" xml:space="preserve">
<value>Vain Windows-, Ctrl-, Alt, ja Shift-näppäimillä alkavat pikanäppäimet ovat sallittuja.</value>
</data>
<data name="Root_About.Content" xml:space="preserve">
<value>Tietoja</value>
</data>
<data name="Root_Defaults.Content" xml:space="preserve">
<value>Oletusasetukset</value>
</data>
<data name="Root_Home.Content" xml:space="preserve">
<value>Koti</value>
</data>
<data name="Root_NewProfile.Content" xml:space="preserve">
<value>Uusi profiili</value>
</data>
<data name="Root_NewProfileFlyout_ComboBox.PlaceholderText" xml:space="preserve">
<value>Valitse ikkuna</value>
</data>
<data name="Root_NewProfileFlyout_CopyFrom.Text" xml:space="preserve">
<value>Kopioi kohteesta</value>
</data>
<data name="Root_NewProfileFlyout_Create.Content" xml:space="preserve">
<value>Luo</value>
</data>
<data name="Root_NewProfileFlyout_Name.Text" xml:space="preserve">
<value>Nimi</value>
</data>
<data name="Root_NewProfileFlyout_NoCandidateWindow.Text" xml:space="preserve">
<value>Avaa uusi ikkuna luodaksesi profiilin</value>
</data>
<data name="Root_NewProfileFlyout_Title.Text" xml:space="preserve">
<value>Uusi profiili</value>
</data>
<data name="Root_Profiles.Content" xml:space="preserve">
<value>Profiilit</value>
</data>
<data name="Root_ScalingModes.Content" xml:space="preserve">
<value>Skaalaustilat</value>
</data>
<data name="ScalingModes_PageFrame.Title" xml:space="preserve">
<value>Skaalaustilat</value>
</data>
<data name="Home_Advanced.Header" xml:space="preserve">
<value>Lisäasetukset</value>
</data>
<data name="Settings_General.Header" xml:space="preserve">
<value>Yleiset</value>
</data>
<data name="Settings_General_Language.Header" xml:space="preserve">
<value>Kieli</value>
</data>
<data name="Settings_General_Language_System" xml:space="preserve">
<value>Windowsin oletus</value>
</data>
<data name="Settings_General_PortableMode.Header" xml:space="preserve">
<value>Siirrettävä tila</value>
</data>
<data name="Settings_General_PortableMode_Locate.Content" xml:space="preserve">
<value>Avaa asetustiedoston sijainti</value>
</data>
<data name="Settings_Launch_RunAtStartup.Header" xml:space="preserve">
<value>Aja käynnistyksessä</value>
</data>
<data name="Settings_General_ShowNotifyIcon.Description" xml:space="preserve">
<value>Magpie ajetaan taustalla kun pääikkuna suljetaan</value>
</data>
<data name="Settings_General_ShowNotifyIcon.Header" xml:space="preserve">
<value>Näytä ohjelma tehtäväpalkissa</value>
</data>
<data name="Settings_General_Theme.Header" xml:space="preserve">
<value>Teema</value>
</data>
<data name="Settings_General_Theme_Dark.Content" xml:space="preserve">
<value>Tumma</value>
</data>
<data name="Settings_General_Theme_System.Content" xml:space="preserve">
<value>Windowsin oletus</value>
</data>
<data name="Settings_General_Theme_Light.Content" xml:space="preserve">
<value>Vaalea</value>
</data>
<data name="ToggleSwitch.OffContent" xml:space="preserve">
<value>Pois</value>
</data>
<data name="ToggleSwitch.OnContent" xml:space="preserve">
<value>Päällä</value>
</data>
<data name="Settings_Launch.Header" xml:space="preserve">
<value>Käynnistä</value>
</data>
<data name="ScalingModes_General_Export.Text" xml:space="preserve">
<value>Vienti</value>
</data>
<data name="ScalingModes_General_Import.Text" xml:space="preserve">
<value>Tuonti</value>
</data>
<data name="ScalingModes_General_MoreOptions.[using:Windows.UI.Xaml.Controls]ToolTipService.ToolTip" xml:space="preserve">
<value>Lisää asetuksia</value>
</data>
<data name="Settings_Launch_AlwaysRunAsAdmin.Description" xml:space="preserve">
<value>Tarvitset järjestelmänvalvojan oikeudet tämän asetuksen käyttöön</value>
</data>
<data name="Settings_Launch_AlwaysRunAsAdmin.Header" xml:space="preserve">
<value>Aja aina järjestelmänvalvojana</value>
</data>
<data name="Home_UpdateCard_AutoCheckForUpdates.Content" xml:space="preserve">
<value>Tarkista päivityksiä säännöllisesti</value>
</data>
<data name="Home_UpdateCard_DownloadAndInstall.Content" xml:space="preserve">
<value>Lataa ja asenna</value>
</data>
<data name="Home_UpdateCard_ReleaseNotes.Content" xml:space="preserve">
<value>Versiotiedot</value>
</data>
<data name="Home_UpdateCard_RemindMeLater.Content" xml:space="preserve">
<value>Muistuta myöhemmin</value>
</data>
<data name="Home_UpdateCard_Title" xml:space="preserve">
<value>{} on saatavilla</value>
</data>
<data name="About_OtherLinks.Header" xml:space="preserve">
<value>Muita linkkejä</value>
</data>
<data name="About_OtherLinks_ContributionGuidelines.Text" xml:space="preserve">
<value>Ohjeita ohjelman kehityksen auttamiseen</value>
</data>
<data name="About_OtherLinks_FAQ.Text" xml:space="preserve">
<value>UKK</value>
</data>
<data name="About_OtherLinks_License.Text" xml:space="preserve">
<value>Lisenssi</value>
</data>
<data name="About_OtherLinks_Repository.Text" xml:space="preserve">
<value>Github repositorio</value>
</data>
<data name="ScalingModes_Parameters.[using:Windows.UI.Xaml.Controls]ToolTipService.ToolTip" xml:space="preserve">
<value>Parametrit</value>
</data>
<data name="ScalingModes_MoreOptions.[using:Windows.UI.Xaml.Controls]ToolTipService.ToolTip" xml:space="preserve">
<value>Lisää asetuksia</value>
</data>
<data name="ScalingModes_MoreOptionsFlyout_Delete.Text" xml:space="preserve">
<value>Poista</value>
</data>
<data name="ScalingModes_MoreOptionsFlyout_MoveDown.Text" xml:space="preserve">
<value>Siirrä alas</value>
</data>
<data name="ScalingModes_MoreOptionsFlyout_MoveUp.Text" xml:space="preserve">
<value>Siirrä ylös</value>
</data>
<data name="ScalingModes_Rename.[using:Windows.UI.Xaml.Controls]ToolTipService.ToolTip" xml:space="preserve">
<value>Nimeä uudelleen</value>
</data>
<data name="ScalingModes_RenameFlyout_OK.Content" xml:space="preserve">
<value>OK</value>
</data>
<data name="ScalingModes_RenameFlyout_Title.Text" xml:space="preserve">
<value>Nimeä uudelleen</value>
</data>
<data name="ScalingModes_AddEffect.Text" xml:space="preserve">
<value>Lisää efekti</value>
</data>
<data name="ScalingModes_Delete.[using:Windows.UI.Xaml.Controls]ToolTipService.ToolTip" xml:space="preserve">
<value>Poista</value>
</data>
<data name="ScalingModes_DeleteFlyout_Delete.Text" xml:space="preserve">
<value>Poista</value>
</data>
<data name="ScalingModes_DeleteFlyout_Description.Text" xml:space="preserve">
<value>Seuraavien profiilien käytössä:</value>
</data>
<data name="ScalingModes_DeleteFlyout_Title.Text" xml:space="preserve">
<value>Haluatko varmasti poistaa tämän skaalaustilan?</value>
</data>
<data name="ScalingModes_DragNotSupported.Text" xml:space="preserve">
<value>Raahausta ja pudotusta ei tueta järjestelmänvalvontatilassa</value>
</data>
<data name="ScalingModes_DragToReorder.Text" xml:space="preserve">
<value>Raahaa uudelleenjärjestääksesi</value>
</data>
<data name="ScalingModes_MoveDown.[using:Windows.UI.Xaml.Controls]ToolTipService.ToolTip" xml:space="preserve">
<value>Siirrä alas</value>
</data>
<data name="ScalingModes_MoveUp.[using:Windows.UI.Xaml.Controls]ToolTipService.ToolTip" xml:space="preserve">
<value>Siirrä ylös</value>
</data>
<data name="ScalingModes_NewScalingMode.Text" xml:space="preserve">
<value>Uusi skaalaustila</value>
</data>
<data name="ScalingModes_NewScalingModeFlyout_Title.Text" xml:space="preserve">
<value>Uusi skaalaustila</value>
</data>
<data name="ScalingModes_Scale.[using:Windows.UI.Xaml.Controls]ToolTipService.ToolTip" xml:space="preserve">
<value>Skaalaus</value>
</data>
<data name="ScalingModes_NewScalingModeFlyout_CopyFrom.Text" xml:space="preserve">
<value>Kopioi kohteesta</value>
</data>
<data name="ScalingModes_NewScalingModeFlyout_CopyFrom_None" xml:space="preserve">
<value>Ei mitään</value>
</data>
<data name="ScalingModes_NewScalingModeFlyout_Create.Content" xml:space="preserve">
<value>Luo</value>
</data>
<data name="ScalingModes_NewScalingModeFlyout_Name.Text" xml:space="preserve">
<value>Nimi</value>
</data>
<data name="ScalingModes_ScaleFlyout_HeightFactor.Text" xml:space="preserve">
<value>Korkeus (skaalauskerroin)</value>
</data>
<data name="ScalingModes_ScaleFlyout_HeightPixels.Text" xml:space="preserve">
<value>Korkeus (pikseleitä)</value>
</data>
<data name="ScalingModes_ScaleFlyout_WidthFactor.Text" xml:space="preserve">
<value>Leveys (skaalauskerroin)</value>
</data>
<data name="ScalingModes_ScaleFlyout_WidthPixels.Text" xml:space="preserve">
<value>Leveys (pikseleitä)</value>
</data>
<data name="ScalingModes_ScaleFlyout_Type.Text" xml:space="preserve">
<value>Tyyppi</value>
</data>
<data name="ScalingModes_ScaleFlyout_Type_Absolute" xml:space="preserve">
<value>Absoluuttinen</value>
</data>
<data name="ScalingModes_ScaleFlyout_Type_Absolute_Description" xml:space="preserve">
<value>Aseta koko skaalauksen jälkeen</value>
</data>
<data name="ScalingModes_ScaleFlyout_Type_Factor" xml:space="preserve">
<value>Kerroin</value>
</data>
<data name="ScalingModes_ScaleFlyout_Type_Factor_Description" xml:space="preserve">
<value>Aseta skaalauskerroin suhteessa kuvaan</value>
</data>
<data name="ScalingModes_ScaleFlyout_Type_Fill" xml:space="preserve">
<value>Täyttö</value>
</data>
<data name="ScalingModes_ScaleFlyout_Type_Fill_Description" xml:space="preserve">
<value>Täyttää ruudun, kuva voi venyä</value>
</data>
<data name="ScalingModes_ScaleFlyout_Type_Fit" xml:space="preserve">
<value>Sovita</value>
</data>
<data name="ScalingModes_ScaleFlyout_Type_Fit_Description" xml:space="preserve">
<value>Sovittaa skaalakertoimen ruuduntäytön jälkeen suhteellisella skaalauksella</value>
</data>
<data name="Profile_General.Header" xml:space="preserve">
<value>Yleiset</value>
</data>
<data name="Profile_General_3DGameMode.Header" xml:space="preserve">
<value>3D pelitila</value>
</data>
<data name="Profile_General_AutoScale.Header" xml:space="preserve">
<value>Aktiivisen ruudun automaattinen skaalaus</value>
</data>
<data name="Profile_General_CaptureMethod.Header" xml:space="preserve">
<value>Kaappaustapa</value>
</data>
<data name="Profile_General_Multimonitor.Header" xml:space="preserve">
<value>Suositut monitorit</value>
</data>
<data name="Profile_General_Multimonitor_All.Content" xml:space="preserve">
<value>Kaikki monitorit</value>
</data>
<data name="Profile_General_Multimonitor_Closest.Content" xml:space="preserve">
<value>Lähdeikkunaa lähin monitori</value>
</data>
<data name="Profile_General_Multimonitor_Intersected.Content" xml:space="preserve">
<value>Lähdeikkunan kanssa risteävät monitorit</value>
</data>
<data name="Profile_General_ScalingMode.Header" xml:space="preserve">
<value>Skaalaustila</value>
</data>
<data name="Profile_Launch.[using:Windows.UI.Xaml.Controls]ToolTipService.ToolTip" xml:space="preserve">
<value>Käynnistä</value>
</data>
<data name="Profile_MoreOptions.[using:Windows.UI.Xaml.Controls]ToolTipService.ToolTip" xml:space="preserve">
<value>Lisää asetuksia</value>
</data>
<data name="Profile_MoreOptions_Delete.Text" xml:space="preserve">
<value>Poista</value>
</data>
<data name="Profile_MoreOptions_DeleteFlyout_Delete.Text" xml:space="preserve">
<value>Poista</value>
</data>
<data name="Profile_MoreOptions_DeleteFlyout_Title.Text" xml:space="preserve">
<value>Haluatko varmasti poistaa tämän profiilin?</value>
</data>
<data name="Profile_MoreOptions_OpenProgramLocation.Text" xml:space="preserve">
<value>Avaa ohjelman sijainti</value>
</data>
<data name="Profile_MoreOptions_Rename.Text" xml:space="preserve">
<value>Nimeä uudelleen</value>
</data>
<data name="Profile_MoreOptions_RenameFlyout_OK.Content" xml:space="preserve">
<value>OK</value>
</data>
<data name="Profile_MoreOptions_RenameFlyout_Title.Text" xml:space="preserve">
<value>Nimeä uudelleen</value>
</data>
<data name="Profile_MoreOptions_Reorder.Text" xml:space="preserve">
<value>Järjestele uudelleen</value>
</data>
<data name="Profile_MoreOptions_ReorderFlyout_MoveDown.Text" xml:space="preserve">
<value>Siirrä alas</value>
</data>
<data name="Profile_MoreOptions_ReorderFlyout_MoveUp.Text" xml:space="preserve">
<value>Siirrä ylös</value>
</data>
<data name="Profile_MoreOptions_ReorderFlyout_Title.Text" xml:space="preserve">
<value>Järjestele uudelleen</value>
</data>
<data name="Profile_General_ScalingMode_None" xml:space="preserve">
<value>Ei mitään</value>
</data>
<data name="Profile_Performance.Header" xml:space="preserve">
<value>Suorituskyky</value>
</data>
<data name="Profile_Performance_GraphicsCard.Header" xml:space="preserve">
<value>Näytönohjain</value>
</data>
<data name="About_Feedback.Header" xml:space="preserve">
<value>Palaute</value>
</data>
<data name="About_Feedback_Discussion.Header" xml:space="preserve">
<value>Keskustelut</value>
</data>
<data name="About_Feedback_ReportBug.Header" xml:space="preserve">
<value>Ilmoita bugista</value>
</data>
<data name="About_Feedback_RequestFeature.Header" xml:space="preserve">
<value>Pyydä ominaisuutta</value>
</data>
<data name="About_Version_UpdateSettings_CheckForPreviewUpdates.Header" xml:space="preserve">
<value>Tarkastele esikatselupäivityksiä</value>
</data>
<data name="About_Version_UpdateSettings_AutoCheckForUpdates.Header" xml:space="preserve">
<value>Tarkista päivitykset automaattisesti</value>
</data>
<data name="About_Version_CheckForUpdates.Text" xml:space="preserve">
<value>Tarkista päivitykset</value>
</data>
<data name="About_Version_CheckForUpdatesFailed.Title" xml:space="preserve">
<value>Päivitysten haku epäonnistui, yritä myöhemmin uudelleen</value>
</data>
<data name="About_Version_CheckingForUpdates.Text" xml:space="preserve">
<value>Haetaan päivityksiä</value>
</data>
<data name="About_Version_UpdateCard_Cancel.Content" xml:space="preserve">
<value>Peruuta</value>
</data>
<data name="About_Version_UpdateCard_DownloadAndInstall.Content" xml:space="preserve">
<value>Lataa ja asenna</value>
</data>
<data name="About_Version_UpdateCard_ReleaseNotes.Content" xml:space="preserve">
<value>Versiotiedot</value>
</data>
<data name="About_Version_UpdateCard_Retry.Content" xml:space="preserve">
<value>Yritä uudelleen</value>
</data>
<data name="About_Version_UpdateCard_Title" xml:space="preserve">
<value>{} on saatavilla</value>
</data>
<data name="About_Version_UpdateToDate.Title" xml:space="preserve">
<value>Magpie on ajantasalla</value>
</data>
<data name="About_Version_UpdateToDate_DownloadFailed.Text" xml:space="preserve">
<value>Lataaminen epäonnistui</value>
</data>
<data name="About_Version_UpdateToDate_Downloading.Text" xml:space="preserve">
<value>Ladataan</value>
</data>
<data name="About_Version_UpdateToDate_Installing.Text" xml:space="preserve">
<value>Asennetaan</value>
</data>
<data name="Profile_Advanced.Header" xml:space="preserve">
<value>Lisäasetukset</value>
</data>
<data name="Profile_Advanced_DisableDirectFlip.Header" xml:space="preserve">
<value>Poista DirectFlip käytöstä</value>
</data>
<data name="Profile_Cursor.Header" xml:space="preserve">
<value>Kursori</value>
</data>
<data name="Profile_Cursor_DrawCursor_AdjustCursorSpeed.Header" xml:space="preserve">
<value>Säädä kursorin nopeutta kun skaalattu</value>
</data>
<data name="Profile_Cursor_DrawCursor_Interpolation.Header" xml:space="preserve">
<value>Interpolaatioalgoritmi</value>
</data>
<data name="Profile_Cursor_DrawCursor_Interpolation_Bilinear.Content" xml:space="preserve">
<value>Bilineaarinen</value>
</data>
<data name="Profile_Cursor_DrawCursor_Interpolation_NearestNeighbor.Content" xml:space="preserve">
<value>Lähin-naapuri</value>
</data>
<data name="Profile_Cursor_DrawCursor_ScaleFactor.Header" xml:space="preserve">
<value>Skaalauskerroin</value>
</data>
<data name="Profile_Cursor_DrawCursor_ScaleFactor_Custom.Content" xml:space="preserve">
<value>Muu</value>
</data>
<data name="Profile_Cursor_DrawCursor_ScaleFactor_NoScaling.Content" xml:space="preserve">
<value>Ei skaalausta</value>
</data>
<data name="Profile_Cursor_DrawCursor_ScaleFactor_SameAsSourceWindow.Content" xml:space="preserve">
<value>Sama kuin lähdeikkunalla</value>
</data>
<data name="Profile_General_CaptureMethod_Default" xml:space="preserve">
<value>Oletus</value>
</data>
<data name="Profile_SourceWindow.Header" xml:space="preserve">
<value>Lähdeikkuna</value>
</data>
<data name="Profile_SourceWindow_CaptureTitleBar.Description" xml:space="preserve">
<value>Rajoitettu grafiikan kaappaukseen ja työpöydän monistukseen</value>
</data>
<data name="Profile_SourceWindow_CaptureTitleBar.Header" xml:space="preserve">
<value>Kaappaa otsikkopalkki</value>
</data>
<data name="Profile_SourceWindow_CustomCropping.Header" xml:space="preserve">
<value>Muu rajaus</value>
</data>
<data name="Profile_SourceWindow_CustomCropping_Bottom.Header" xml:space="preserve">
<value>Ala</value>
</data>
<data name="Profile_SourceWindow_CustomCropping_Left.Header" xml:space="preserve">
<value>Vasen</value>
</data>
<data name="Profile_SourceWindow_CustomCropping_Pixels.Text" xml:space="preserve">
<value>px</value>
</data>
<data name="Profile_SourceWindow_CustomCropping_Right.Header" xml:space="preserve">
<value>Oikea</value>
</data>
<data name="Profile_SourceWindow_CustomCropping_Top.Header" xml:space="preserve">
<value>Ylä</value>
</data>
<data name="Home_Advanced_InlineParams.Description" xml:space="preserve">
<value>Parantaa hieman suorituskykyä, mutta efektit on käännettävä uudelleen aina kun parametrit muuttuvat</value>
</data>
<data name="Home_Advanced_InlineParams.Header" xml:space="preserve">
<value>Rivitä efektien parametrit</value>
</data>
<data name="Home_Advanced_SimulateExclusiveFullscreen.Description" xml:space="preserve">
<value>Vain kokoruudun skaalauksessa. Vaimentaa tietyt ohjelmailmoitukset ja ponnahdusikkunat jos päällä</value>
</data>
<data name="Home_Advanced_SimulateExclusiveFullscreen.Header" xml:space="preserve">
<value>Simuloi kokoruudun tilaa skaalatessa</value>
</data>
<data name="AppSettings_Dialog_Error" xml:space="preserve">
<value>Virhe</value>
</data>
<data name="Home_Advanced_DeveloperOptions.Description" xml:space="preserve">
<value>Nämä asetukset ovat vain kehitystä varten</value>
</data>
<data name="Home_Advanced_DeveloperOptions.Header" xml:space="preserve">
<value>Kehitysasetukset</value>
</data>
<data name="Home_Advanced_DeveloperOptions_DebugMode.Content" xml:space="preserve">
<value>Virheenkorjaustila</value>
</data>
<data name="Home_Advanced_DeveloperOptions_DisableEffectCache.Content" xml:space="preserve">
<value>Poista efektivälimuisti käytöstä</value>
</data>
<data name="Home_Advanced_DeveloperOptions_SaveEffectSources.Content" xml:space="preserve">
<value>Tallenna varjostimien lähdekoodi efektejä jäsennettäessä</value>
</data>
<data name="Home_Advanced_DeveloperOptions_WarningsAreErrors.Content" xml:space="preserve">
<value>Käsittele varoituksia virheinä kun efektejä käännetään</value>
</data>
<data name="AppSettings_Dialog_Exit" xml:space="preserve">
<value>Poistu</value>
</data>
<data name="AppSettings_ErrorDialog_ConfigLocation" xml:space="preserve">
<value>Asetustiedoston sijainti
{}</value>
</data>
<data name="AppSettings_ErrorDialog_NotValidJson" xml:space="preserve">
<value>Asetustiedosto ei ole JSON-pätevä</value>
</data>
<data name="AppSettings_ErrorDialog_ParseFailed" xml:space="preserve">
<value>Asetustiedoston jäsennys epäonnistui</value>
</data>
<data name="AppSettings_ErrorDialog_ReadFailed" xml:space="preserve">
<value>Asetustiedoston luku epäonnistui</value>
</data>
<data name="NotifyIcon_Exit" xml:space="preserve">
<value>Poistu</value>
</data>
<data name="NotifyIcon_MainWindow" xml:space="preserve">
<value>Pääikkuna</value>
</data>
<data name="Settings_General_RequireRestart.Title" xml:space="preserve">
<value>Uudelleenkäynnistys vaaditaan asetusten aktivointia varten</value>
</data>
<data name="Settings_General_RequireRestart_ActionButton.Content" xml:space="preserve">
<value>Käynnistä Magpie uudelleen</value>
</data>
<data name="ScalingModes_Description_UnknownEffect" xml:space="preserve">
<value>Tuntematon efekti</value>
</data>
<data name="ScalingModes_HasUnkownEffects.Title" xml:space="preserve">
<value>Joitain efektejä ei voitu jäsentää</value>
</data>
<data name="Dialog_Export_Title" xml:space="preserve">
<value>Vie skaalaustilat</value>
</data>
<data name="Dialog_Import_Title" xml:space="preserve">
<value>Tuo skaalaustilat</value>
</data>
<data name="About_Version_UpdateSettings.Header" xml:space="preserve">
<value>Päivitä asetukset</value>
</data>
<data name="About_Version_Version" xml:space="preserve">
<value>Versio</value>
</data>
<data name="Profile_Advanced_LaunchParameters.Header" xml:space="preserve">
<value>Käynnistysparametrit</value>
</data>
<data name="Overlay_Profiler" xml:space="preserve">
<value>Profiloija</value>
</data>
<data name="Overlay_Profiler_CaptureMethod" xml:space="preserve">
<value>Kaappaustapa</value>
</data>
<data name="Overlay_FPS_Lock" xml:space="preserve">
<value>Lukitus</value>
</data>
<data name="Overlay_FPS_Opacity" xml:space="preserve">
<value>Läpinäkymättömyys</value>
</data>
<data name="Overlay_FPS_Unlock" xml:space="preserve">
<value>Poista lukitus</value>
</data>
<data name="Overlay_Profiler_Timings" xml:space="preserve">
<value>Ajoitukset</value>
</data>
<data name="Overlay_Profiler_Timings_SwitchToEffects" xml:space="preserve">
<value>Vaihda efekteihin</value>
</data>
<data name="Overlay_Profiler_Timings_SwitchToPasses" xml:space="preserve">
<value>Vaihda pyyhkäisyihin</value>
</data>
<data name="Overlay_Profiler_Timings_Total" xml:space="preserve">
<value>Kaikkiaan</value>
</data>
<data name="Home_Advanced_DeveloperOptions_DisableFontCache.Content" xml:space="preserve">
<value>Poista fonttivälimuisti käytöstä</value>
</data>
<data name="Home_Advanced_AllowScalingMaximized.Header" xml:space="preserve">
<value>Salli suurennettujen tai kokoruutuikkunoiden skaalaus</value>
</data>
<data name="Dialog_JsonFile" xml:space="preserve">
<value>JSON-tiedosto</value>
</data>
<data name="Profile_MoreOptions_ChangeExecutableForLaunching.Text" xml:space="preserve">
<value>Vaihda ohjelman käynnistystiedosto</value>
</data>
<data name="Dialog_ExeFile" xml:space="preserve">
<value>Käynnistystiedosto</value>
</data>
<data name="Dialog_SelectLauncher_Title" xml:space="preserve">
<value>Valitse käynnistystiedosto avataksesi ohjelman</value>
</data>
<data name="Profile_Performance_FrameRateLimiter.Header" xml:space="preserve">
<value>Ruudunpäivityksen rajoitin</value>
</data>
<data name="Profile_Performance_FrameRateLimiter_MaxFrameRate.Header" xml:space="preserve">
<value>Suurin sallittu ruudunpäivitysnopeus</value>
</data>
<data name="About_Version_CommitId" xml:space="preserve">
<value>Kommitoi</value>
</data>
<data name="About_DeveloperModeEnabled" xml:space="preserve">
<value>Kehittäjätila on aktivoitu.</value>
</data>
<data name="Home_Advanced_DeveloperOptions_DuplicateFrameDetection.Header" xml:space="preserve">
<value>Ruutuduplikaattien tunnistus</value>
</data>
<data name="Home_Advanced_DeveloperOptions_DuplicateFrameDetection_Always.Content" xml:space="preserve">
<value>Aina</value>
</data>
<data name="Home_Advanced_DeveloperOptions_DuplicateFrameDetection_Dynamic.Content" xml:space="preserve">
<value>Dynaaminen</value>
</data>
<data name="Home_Advanced_DeveloperOptions_DuplicateFrameDetection_Never.Content" xml:space="preserve">
<value>Ei koskaan</value>
</data>
<data name="Home_Advanced_DeveloperOptions_EnableStatisticsForDynamicDetection.Content" xml:space="preserve">
<value>Salli tilastot dynaamista tunnistamista varten</value>
</data>
<data name="Overlay_Profiler_DynamicDetection" xml:space="preserve">
<value>Dynaaminen tunnistus</value>
</data>
<data name="Overlay_Profiler_FrameRate" xml:space="preserve">
<value>Ruudunpäivitysnopeus</value>
</data>
<data name="Home_TouchSupport_EnableTouchSupport.Header" xml:space="preserve">
<value>Aktivoi tuki kosketukselle</value>
</data>
<data name="Home_TouchSupport_EnableTouchSupport_Description.Text" xml:space="preserve">
<value>Tarvitset järjestelmänvalvojanoikeudet tämän asetuksen muuttamiseen</value>
</data>
<data name="Home_TouchSupport_EnableTouchSupport_LearnMore.Content" xml:space="preserve">
<value>Lue lisää</value>
</data>
<data name="Home_TouchSupport.Header" xml:space="preserve">
<value>Tuki kosketukselle</value>
</data>
<data name="Home_TouchSupport_Info.Title" xml:space="preserve">
<value>Jos kosketustuki epäonnistuu, Magpie saattaa pyytää järjestelmänvalvojan oikeuksia korjausta varten ennen skaalausta.</value>
</data>
<data name="Home_Advanced_SimulateExclusiveFullscreen_InfoBar.Title" xml:space="preserve">
<value>Jotkin vanhemmat pelit eivät tue tätä asetusta. Käytä varoen.</value>
</data>
<data name="Message_InvalidScalingMode" xml:space="preserve">
<value>Virheellinen skaalaustila.</value>
</data>
<data name="Message_TouchSupport" xml:space="preserve">
<value>Kosketustuen aktivointi epäonnistui.</value>
</data>
<data name="Message_InvalidSourceWindow" xml:space="preserve">
<value>Tämän ikkunan skaalausta ei tueta.</value>
</data>
<data name="Message_Maximized" xml:space="preserve">
<value>Suurennettujen ja kokoruudun ikkunoiden skaalaus on estetty. Voit vaihtaa tätä asetusta Koti-sivulta.</value>
</data>
<data name="Message_LowIntegrityLevel" xml:space="preserve">
<value>Magpie täytyy ajaa järjestelmänvalvojan oikeuksilla tämän ikkunan skaalaamiseksi.</value>
</data>
<data name="Message_ScalingFailedGeneral" xml:space="preserve">
<value>Lue lisätietoja lokista.</value>
</data>
<data name="Message_CaptureFailed" xml:space="preserve">
<value>Virhe tätä ikkunaa kaapatessa. Kokeile toista kaapaustapaa.</value>
</data>
<data name="Message_CreateFenceFailed" xml:space="preserve">
<value>Valittu näytönohjain ei tue funktiota ID3D11Device5::CreateFence. Yritä päivittää ajurit, tai vaihtaa näytönohjainta.</value>
</data>
<data name="Message_ScalingFailed" xml:space="preserve">
<value>Skaalaus epäonnistui</value>
</data>
<data name="Profile_Performance_NoGraphicsCard.Title" xml:space="preserve">
<value>Tuettua näytönohjainta ei löytynyt joten käytetään keskussuoritinta renderöintiin. Suorituskyky ei ehkä vastaa odotuksia.</value>
</data>
<data name="Home_Advanced_MinFrameRate.Header" xml:space="preserve">
<value>Pienin ruudunpäivitysnopeus</value>
</data>
<data name="Home_Advanced_MinFrameRate.Description" xml:space="preserve">
<value>Vakauttaa näytönohjaimen taajuuden nykimisen vähentämiseksi, mutta saattaa lisätä virrankulutusta</value>
</data>
<data name="Home_Advanced_DeveloperOptions_DisableFP16.Content" xml:space="preserve">
<value>Estä FP16-formaatin käytön varjostimissa</value>
</data>
<data name="Home_Advanced_DeveloperOptions_BenchmarkMode.Content" xml:space="preserve">
<value>Suorituskyvyn mittaustila</value>
</data>
<data name="Root_NewProfileFlyout_NameContextFlyout_AppName" xml:space="preserve">
<value>Täytä ohjelman nimellä</value>
</data>
<data name="Root_NewProfileFlyout_NameContextFlyout_ProcessName" xml:space="preserve">
<value>Täytä prosessin nimellä</value>
</data>
<data name="Root_NewProfileFlyout_NameContextFlyout_WindowTitle" xml:space="preserve">
<value>Täytä ikkunan nimellä</value>
</data>
<data name="TextMenuFlyout_Copy" xml:space="preserve">
<value>Kopioi</value>
</data>
<data name="TextMenuFlyout_Cut" xml:space="preserve">
<value>Leikkaa</value>
</data>
<data name="TextMenuFlyout_Paste" xml:space="preserve">
<value>Liitä</value>
</data>
<data name="TextMenuFlyout_Redo" xml:space="preserve">
<value>Tee uudelleen</value>
</data>
<data name="TextMenuFlyout_SelectAll" xml:space="preserve">
<value>Valitse kaikki</value>
</data>
<data name="TextMenuFlyout_Undo" xml:space="preserve">
<value>Peru toiminto</value>
</data>
<data name="Message_BannedInWindowedMode" xml:space="preserve">
<value>Tämän ikkunan ikkunoitua skaalausta ei tueta.</value>
</data>
<data name="Message_InvalidCropping" xml:space="preserve">
<value>Rajausta ei voitu suorittaa.</value>
</data>
<data name="Home_TouchSupport.Description" xml:space="preserve">
<value>Järjestelmän turvarajoitusten vuoksi, Magpie tarvitsee UIAccess-oikeuden kosketustukea varten.</value>
</data>
<data name="Home_Activation.Description" xml:space="preserve">
<value>Paina pikanäppäintä etualan-ikkunan skaalaamiseksi tai skaalauksen lopettamiseksi.</value>
</data>
<data name="Home_Activation_FullscreenScaling.Header" xml:space="preserve">
<value>Kokoruudun skaalauksen pikanäppäin</value>
</data>
<data name="Home_Activation_FullscreenScaling_ShortcutControl.Title" xml:space="preserve">
<value>Kokoruudun skaalauksen pikanäppäin</value>
</data>
<data name="Home_Activation_WindowedScaling.Header" xml:space="preserve">
<value>Ikkunoidun skaalauksen pikanäppäin</value>
</data>
<data name="Home_Activation_WindowedScaling_ShortcutControl.Title" xml:space="preserve">
<value>Ikkunoidun skaalauksen pikanäppäin</value>
</data>
<data name="Home_Advanced_AllowScalingMaximized.Description" xml:space="preserve">
<value>Soveltuu vain kokoruudun skaalaukseen</value>
</data>
<data name="Home_Toolbar.Description" xml:space="preserve">
<value>Työkalupalkki löytyy skaalatun ikkunan yläosasta. Se tarjoaa valintoja kuten ruudunpäivitysnopeuden näytön ja ruudunkaappauksien oton. Ikkunatilassa sen avulla voi raahata skaalattua ikkunaa.</value>
</data>
<data name="Home_Toolbar.Header" xml:space="preserve">
<value>Työkalupalkki</value>
</data>
<data name="Home_Toolbar_InitialState.Header" xml:space="preserve">
<value>Työkalupalkin alkutila</value>
</data>
<data name="Home_Toolbar_InitialState_AlwaysShow.Content" xml:space="preserve">
<value>Näytä aina</value>
</data>
<data name="Home_Toolbar_InitialState_AutoHide.Content" xml:space="preserve">
<value>Piilota automaattisesti</value>
</data>
<data name="Home_Toolbar_InitialState_Off.Content" xml:space="preserve">
<value>Pois</value>
</data>
<data name="Home_Toolbar_StateToggle.Header" xml:space="preserve">
<value>Työkalupalkin tilanvaihdon pikanäppäin</value>
</data>
<data name="Home_Toolbar_StateToggle_ShortcutControl.Title" xml:space="preserve">
<value>Työkalupalkin tilanvaihdon pikanäppäin</value>
</data>
<data name="Message_ToolbarIn3DGameMode" xml:space="preserve">
<value>Työkalupalkkia ei tueta 3D pelitilassa.</value>
</data>
<data name="Message_ToolbarNewState" xml:space="preserve">
<value>Työkalupalkki: {}</value>
</data>
<data name="Overlay_Toolbar_Close" xml:space="preserve">
<value>Lopeta skaalaus</value>
</data>
<data name="Overlay_Toolbar_Demo" xml:space="preserve">
<value>ImGui Demo-ikkuna</value>
</data>
<data name="Overlay_Toolbar_Pin" xml:space="preserve">
<value>Kiinnitä työkalupalkki</value>
</data>
<data name="Overlay_Toolbar_TakeScreenshot" xml:space="preserve">
<value>Ota kuvaruudunkaappaus</value>
</data>
<data name="Overlay_Toolbar_Profiler" xml:space="preserve">
<value>Profilointi-ikkuna</value>
</data>
<data name="Message_Windowed3DGameMode" xml:space="preserve">
<value>Ikkunoitua skaalausta ei tueta 3D-pelitilassa.</value>
</data>
<data name="Profile_General_3DGameMode.Description" xml:space="preserve">
<value>Mahdollistaa 3D-pelien optimoinnit, mutta ei ole yhteensopiva työkalupalkin ja ikkunoidun skaalauksen kanssa</value>
</data>
<data name="Home_Toolbar_ScreenshotSaveDirectory.Header" xml:space="preserve">
<value>Kuvaruudunkaappausten tallennushakemisto</value>
</data>
<data name="Home_Toolbar_ScreenshotSaveDirectory_Change.Content" xml:space="preserve">
<value>Muuta</value>
</data>
<data name="Dialog_SetlectScreenshotSaveDirectory_Title" xml:space="preserve">
<value>Valitse hakemisto kuvaruudunkaappauksille</value>
</data>
<data name="Message_ScreenshotSaved" xml:space="preserve">
<value>Kaappaus tallennettu nimellä {}</value>
</data>
<data name="Message_ScreenshotFailed" xml:space="preserve">
<value>Kaappaus epäonnistui.</value>
</data>
<data name="Overlay_Toolbar_TakeScreenshot_Description" xml:space="preserve">
<value>Paina hiiren kakkospainiketta viedäksesi väliaikatilan tuloksen</value>
</data>
<data name="Overlay_Toolbar_TakeScreenshot_PopupTitle" xml:space="preserve">
<value>Vie väliaikatilan tulos</value>
</data>
<data name="Profile_WindowedScaling.Header" xml:space="preserve">
<value>Ikkunoitu skaalaus</value>
</data>
<data name="Profile_WindowedScaling_InitialScaleFactor.Header" xml:space="preserve">
<value>Lähtöskaalakerroin</value>
</data>
<data name="Profile_WindowedScaling_InitialScaleFactor_Auto.Content" xml:space="preserve">
<value>Automaattinen</value>
</data>
<data name="Profile_WindowedScaling_InitialScaleFactor_Custom.Content" xml:space="preserve">
<value>Muu</value>
</data>
<data name="Profile_Advanced_DisableDirectFlip.Description" xml:space="preserve">
<value>Auttaa välttämään joitain yhteensopivuusongelmia, mutta saattaa huomattavasti lisätä latenssia</value>
</data>
<data name="Profile_General_AutoScale_Disabled.Content" xml:space="preserve">
<value>Poissa käytöstä</value>
</data>
<data name="Profile_General_AutoScale_Fullscreen.Content" xml:space="preserve">
<value>Kokoruudun skaalaus</value>
</data>
<data name="Profile_General_AutoScale_Windowed.Content" xml:space="preserve">
<value>Ikkunoitu skaalaus</value>
</data>
<data name="Profile_General_Multimonitor.Description" xml:space="preserve">
<value>Soveltuu vain kokoruudun skaalaukseen</value>
</data>
<data name="Home_TouchSupport_Warn.Title" xml:space="preserve">
<value>Työkalupalkki ei ole kosketusyhteensopiva.</value>
</data>
<data name="Overlay_Toolbar_Close_Description" xml:space="preserve">
<value>Sulje työkalupalkki hiiren kakkospainikkeella</value>
</data>
<data name="Overlay_Toolbar_SwitchToFullscreen" xml:space="preserve">
<value>Vaihda kokoruudun skaalaukseen</value>
</data>
<data name="Overlay_Toolbar_SwitchToWindowed" xml:space="preserve">
<value>Vaihda ikkunoituun skaalaukseen</value>
</data>
<data name="Home_Toolbar_InitialState_Fullscreen.Header" xml:space="preserve">
<value>Kokoruudun skaalaus</value>
</data>
<data name="Home_Toolbar_InitialState_Windowed.Header" xml:space="preserve">
<value>Ikkunoitu skaalaus</value>
</data>
<data name="Message_ExportScalingModesFailed" xml:space="preserve">
<value>Skaalaustilojen vienti epäonnistui.</value>
</data>
<data name="Message_ImportScalingModesFailed" xml:space="preserve">
<value>Skaalaustilojen tuonti epäonnistui.</value>
</data>
<data name="Home_Advanced_DeveloperOptions_LocateLogs.Header" xml:space="preserve">
<value>Avaa lokien sijainti</value>
</data>
<data name="Message_WindowedDesktopDuplication" xml:space="preserve">
<value>Työpöydän duplikointi ei tue ikkunoiden skaalausta.</value>
</data>
<data name="Profile_General_DesktopDuplicationWarning.Title" xml:space="preserve">
<value>Ikkunoitu skaalaus ei tue tätä kaappausmenetelmää.</value>
</data>
<data name="Settings_Launch_RunAtStartup.Description" xml:space="preserve">
<value>Pääikkunaa ei näytetä jos "Näytä ohjelma tehtäväpalkissa" on päällä</value>
</data>
<data name="Home_Activation_Timer_Description" xml:space="preserve">
<value>Skaalaa etualan ikkuna {} jälkeen</value>
</data>
<data name="Home_Activation_Timer_Start" xml:space="preserve">
<value>Aloita</value>
</data>
<data name="NotifyIcon_Timer_Fullscreen" xml:space="preserve">
<value>Skaalaa {}:n jälkeen (Kokoruutu)</value>
</data>
<data name="NotifyIcon_Timer_Windowed" xml:space="preserve">
<value>Skaalaa {}:n jälkeen (Ikkunoitu)</value>
</data>
<data name="Overlay_Toolbar_Minimize" xml:space="preserve">
<value>Minimoi</value>
</data>
<data name="Profile_Cursor_AutoHide.Header" xml:space="preserve">
<value>Piiloita käyttämätön kursori automaattisesti</value>
</data>
<data name="Profile_Cursor_AutoHide_Delay.Header" xml:space="preserve">
<value>Piilotuksen viive sekunneissa</value>
</data>
<data name="Profile_Advanced_DestAlignment.Description" xml:space="preserve">
<value>Soveltuu vain kokoruudun skaalaukseen</value>
</data>
<data name="Profile_Advanced_DestAlignment.Header" xml:space="preserve">
<value>Ulostulon tasaus</value>
</data>
<data name="Profile_Advanced_DestAlignment_BottomCenter.Content" xml:space="preserve">
<value>Alhaalla-keskellä</value>
</data>
<data name="Profile_Advanced_DestAlignment_BottomLeft.Content" xml:space="preserve">
<value>Ala-vasen</value>
</data>
<data name="Profile_Advanced_DestAlignment_BottomRight.Content" xml:space="preserve">
<value>Ala-oikea</value>
</data>
<data name="Profile_Advanced_DestAlignment_Center.Content" xml:space="preserve">
<value>Keskellä</value>
</data>
<data name="Profile_Advanced_DestAlignment_Left.Content" xml:space="preserve">
<value>Vasen</value>
</data>
<data name="Profile_Advanced_DestAlignment_Right.Content" xml:space="preserve">
<value>Oikea</value>
</data>
<data name="Profile_Advanced_DestAlignment_TopCenter.Content" xml:space="preserve">
<value>Ylhäällä-keskellä</value>
</data>
<data name="Profile_Advanced_DestAlignment_TopLeft.Content" xml:space="preserve">
<value>Ylävasen</value>
</data>
<data name="Profile_Advanced_DestAlignment_TopRight.Content" xml:space="preserve">
<value>Yläoikea</value>
</data>
<data name="Home_Advanced_DeveloperOptions_DisableTopmost.Content" xml:space="preserve">
<value>Poista "aina-päällä" -toiminto käytöstä</value>
</data>
</root>

View file

@ -262,7 +262,7 @@
<value>Fenêtre par defaut</value> <value>Fenêtre par defaut</value>
</data> </data>
<data name="ToggleSwitch.OffContent" xml:space="preserve"> <data name="ToggleSwitch.OffContent" xml:space="preserve">
<value>Off</value> <value>Désactivé</value>
</data> </data>
<data name="ToggleSwitch.OnContent" xml:space="preserve"> <data name="ToggleSwitch.OnContent" xml:space="preserve">
<value>On</value> <value>On</value>
@ -521,7 +521,7 @@
<value>px</value> <value>px</value>
</data> </data>
<data name="Home_Advanced_SimulateExclusiveFullscreen.Description" xml:space="preserve"> <data name="Home_Advanced_SimulateExclusiveFullscreen.Description" xml:space="preserve">
<value>Les notifications et les fenêtres contextuelles de certaines applications seront bloquées</value> <value>S'applique seulement en plein écran. Les notifications et les fenêtres contextuelles de certaines applications seront bloquées</value>
</data> </data>
<data name="ScalingModes_Rename.[using:Windows.UI.Xaml.Controls]ToolTipService.ToolTip" xml:space="preserve"> <data name="ScalingModes_Rename.[using:Windows.UI.Xaml.Controls]ToolTipService.ToolTip" xml:space="preserve">
<value>Renommer</value> <value>Renommer</value>
@ -674,7 +674,7 @@
<value>FAQ</value> <value>FAQ</value>
</data> </data>
<data name="Profile_Cursor_DrawCursor_Interpolation_NearestNeighbor.Content" xml:space="preserve"> <data name="Profile_Cursor_DrawCursor_Interpolation_NearestNeighbor.Content" xml:space="preserve">
<value>Nearest-neighbor</value> <value>Voisin le plus proche</value>
</data> </data>
<data name="ScalingModes_DragNotSupported.Text" xml:space="preserve"> <data name="ScalingModes_DragNotSupported.Text" xml:space="preserve">
<value>Le glisser-déposer n'est pas pris en charge lorsque l'utilisateur est un administrateur</value> <value>Le glisser-déposer n'est pas pris en charge lorsque l'utilisateur est un administrateur</value>
@ -775,4 +775,283 @@
<data name="Message_Maximized" xml:space="preserve"> <data name="Message_Maximized" xml:space="preserve">
<value>La mise à l'échelle des fenêtres maximisées ou en plein écran est désactivée. Vous pouvez changer cette préférence sur la page Accueil.</value> <value>La mise à l'échelle des fenêtres maximisées ou en plein écran est désactivée. Vous pouvez changer cette préférence sur la page Accueil.</value>
</data> </data>
<data name="Message_TouchSupport" xml:space="preserve">
<value>Erreur pendant l'activation du support tactile.</value>
</data>
<data name="Message_LowIntegrityLevel" xml:space="preserve">
<value>Magpie doit être lancé en tant qu'administrateur pour mettre cette fenêtre a léchelle.</value>
</data>
<data name="Message_ScalingFailedGeneral" xml:space="preserve">
<value>Inspectez les messages de log pour plus de détails.</value>
</data>
<data name="Message_CaptureFailed" xml:space="preserve">
<value>Une erreur s'est produite pendant la capture de cette fenêtre. Essayez une méthode de capture différente.</value>
</data>
<data name="Message_CreateFenceFailed" xml:space="preserve">
<value>Cette carte graphique ne supporte pas ID3D11Device5::CreateFence. Essayez de changer de carte graphique ou de mettre a jour les pilotes.</value>
</data>
<data name="Message_ScalingFailed" xml:space="preserve">
<value>La mise à l'échelle a échouée</value>
</data>
<data name="Profile_Performance_NoGraphicsCard.Title" xml:space="preserve">
<value>Aucune carte graphique compatible détectée, le CPU sera utilisé pour le rendu à la place. Les performances peuvent être décevantes.</value>
</data>
<data name="Home_Advanced_MinFrameRate.Header" xml:space="preserve">
<value>Fréquence d'images minimale</value>
</data>
<data name="Home_Advanced_MinFrameRate.Description" xml:space="preserve">
<value>Stabilise la fréquence du GPU pour réduire les saccades, mais peut engendrer une consommation dénergie supérieure</value>
</data>
<data name="Home_Advanced_DeveloperOptions_DisableFP16.Content" xml:space="preserve">
<value>Désactive l'utilisation de FP16 dans les shaders</value>
</data>
<data name="Home_Advanced_DeveloperOptions_BenchmarkMode.Content" xml:space="preserve">
<value>Mode mesure de performance</value>
</data>
<data name="Root_NewProfileFlyout_NameContextFlyout_AppName" xml:space="preserve">
<value>Remplir avec le nom de l'application</value>
</data>
<data name="Root_NewProfileFlyout_NameContextFlyout_ProcessName" xml:space="preserve">
<value>Remplir avec le nom du processus</value>
</data>
<data name="Root_NewProfileFlyout_NameContextFlyout_WindowTitle" xml:space="preserve">
<value>Remplir avec le titre de la fenêtre</value>
</data>
<data name="TextMenuFlyout_Copy" xml:space="preserve">
<value>Copier</value>
</data>
<data name="TextMenuFlyout_Cut" xml:space="preserve">
<value>Couper</value>
</data>
<data name="TextMenuFlyout_Paste" xml:space="preserve">
<value>Coller</value>
</data>
<data name="TextMenuFlyout_Redo" xml:space="preserve">
<value>Rétablir</value>
</data>
<data name="TextMenuFlyout_SelectAll" xml:space="preserve">
<value>Tout sélectionner</value>
</data>
<data name="TextMenuFlyout_Undo" xml:space="preserve">
<value>Annuler</value>
</data>
<data name="Message_BannedInWindowedMode" xml:space="preserve">
<value>Mise à léchelle fenêtrée n'est pas supporté pour cette fenêtre.</value>
</data>
<data name="Message_InvalidCropping" xml:space="preserve">
<value>Erreur pendant le recadrage personnalisé.</value>
</data>
<data name="Home_TouchSupport.Description" xml:space="preserve">
<value>Du à des restrictions du système de sécurité, Magpie a besoin du privilege UIAccess pour le support tactile.</value>
</data>
<data name="Home_Activation.Description" xml:space="preserve">
<value>Utilisez le raccourcis pour activer ou désactiver la mise à léchelle de la fenêtre au premier plan.</value>
</data>
<data name="Home_Activation_FullscreenScaling.Header" xml:space="preserve">
<value>Raccourcis pour mise à léchelle plein écran</value>
</data>
<data name="Home_Activation_FullscreenScaling_ShortcutControl.Title" xml:space="preserve">
<value>Raccourcis pour mise à léchelle plein écran</value>
</data>
<data name="Home_Activation_WindowedScaling.Header" xml:space="preserve">
<value>Raccourcis pour mise à léchelle fenêtrée</value>
</data>
<data name="Home_Activation_WindowedScaling_ShortcutControl.Title" xml:space="preserve">
<value>Raccourcis pour mise à léchelle fenêtrée</value>
</data>
<data name="Home_Advanced_AllowScalingMaximized.Description" xml:space="preserve">
<value>S'applique uniquement à la mise à léchelle plein écran</value>
</data>
<data name="Home_Toolbar.Header" xml:space="preserve">
<value>barre d'outils</value>
</data>
<data name="Home_Toolbar_InitialState.Header" xml:space="preserve">
<value>Etat initial de la barre d'outils</value>
</data>
<data name="Home_Toolbar_InitialState_AlwaysShow.Content" xml:space="preserve">
<value>Toujours montrer</value>
</data>
<data name="Home_Toolbar_InitialState_AutoHide.Content" xml:space="preserve">
<value>Cacher automatiquement</value>
</data>
<data name="Home_Toolbar_InitialState_Off.Content" xml:space="preserve">
<value>Désactivé</value>
</data>
<data name="Message_ToolbarIn3DGameMode" xml:space="preserve">
<value>La barre d'outils n'est pas supportée en mode de jeu 3D.</value>
</data>
<data name="Message_ToolbarNewState" xml:space="preserve">
<value>Barre d'outils : {}</value>
</data>
<data name="Overlay_Toolbar_Close" xml:space="preserve">
<value>Arrêter la mise à léchelle</value>
</data>
<data name="Overlay_Toolbar_TakeScreenshot" xml:space="preserve">
<value>Prendre une capture décran</value>
</data>
<data name="Home_Toolbar.Description" xml:space="preserve">
<value>La barre d'outils apparaît en haut de la fenêtre redimensionnée et propose des fonctionnalités telles que l'affichage des IPS et la capture d'écran. En mode fenêtré, elle permet également de déplacer la fenêtre redimensionnée.</value>
</data>
<data name="Home_Toolbar_StateToggle.Header" xml:space="preserve">
<value>Raccourcis de changement d'état de la barre d'outils</value>
</data>
<data name="Overlay_Toolbar_Demo" xml:space="preserve">
<value>Fenêtre de Demo ImGui</value>
</data>
<data name="Overlay_Toolbar_Pin" xml:space="preserve">
<value>Épingler la barre d'outils</value>
</data>
<data name="Overlay_Toolbar_Profiler" xml:space="preserve">
<value>Fenêtre Profiler</value>
</data>
<data name="Message_Windowed3DGameMode" xml:space="preserve">
<value>La mise à l'échelle par fenêtrage n'est pas prise en charge en mode jeu 3D.</value>
</data>
<data name="Profile_General_3DGameMode.Description" xml:space="preserve">
<value>Permet des optimisations pour les jeux 3D, mais est incompatible avec la barre d'outils et la mise à l'échelle en mode fenêtré</value>
</data>
<data name="Home_Toolbar_ScreenshotSaveDirectory.Header" xml:space="preserve">
<value>Répertoire de sauvegarde des captures d'écran</value>
</data>
<data name="Home_Toolbar_ScreenshotSaveDirectory_Change.Content" xml:space="preserve">
<value>Changer</value>
</data>
<data name="Dialog_SetlectScreenshotSaveDirectory_Title" xml:space="preserve">
<value>Choisissez un répertoire pour sauvegarder vos captures</value>
</data>
<data name="Message_ScreenshotSaved" xml:space="preserve">
<value>Capture d'écran enregistrée sous {}</value>
</data>
<data name="Message_ScreenshotFailed" xml:space="preserve">
<value>Échec de la capture d'écran.</value>
</data>
<data name="Overlay_Toolbar_TakeScreenshot_Description" xml:space="preserve">
<value>Cliquez avec le bouton droit pour exporter le résultat intermédiaire</value>
</data>
<data name="Overlay_Toolbar_TakeScreenshot_PopupTitle" xml:space="preserve">
<value>Exporter le résultat intermédiaire</value>
</data>
<data name="Profile_WindowedScaling.Header" xml:space="preserve">
<value>Mise à l'échelle en mode fenêtré</value>
</data>
<data name="Profile_WindowedScaling_InitialScaleFactor.Header" xml:space="preserve">
<value>facteur d'échelle initial</value>
</data>
<data name="Profile_WindowedScaling_InitialScaleFactor_Auto.Content" xml:space="preserve">
<value>Automatique</value>
</data>
<data name="Profile_WindowedScaling_InitialScaleFactor_Custom.Content" xml:space="preserve">
<value>Personnalisé</value>
</data>
<data name="Profile_Advanced_DisableDirectFlip.Description" xml:space="preserve">
<value>Permet d'éviter certains problèmes de compatibilité, mais peut augmenter considérablement la latence</value>
</data>
<data name="Profile_General_AutoScale_Disabled.Content" xml:space="preserve">
<value>Désactivée</value>
</data>
<data name="Profile_General_AutoScale_Fullscreen.Content" xml:space="preserve">
<value>Mise à l'échelle plein écran</value>
</data>
<data name="Profile_General_AutoScale_Windowed.Content" xml:space="preserve">
<value>Mise à l'échelle par fenêtre</value>
</data>
<data name="Profile_General_Multimonitor.Description" xml:space="preserve">
<value>S'applique uniquement à la mise à l'échelle en plein écran</value>
</data>
<data name="Home_TouchSupport_Warn.Title" xml:space="preserve">
<value>La barre d'outils n'est pas compatible avec les entrées tactiles.</value>
</data>
<data name="Overlay_Toolbar_Close_Description" xml:space="preserve">
<value>Cliquez avec le bouton droit pour fermer la barre d'outils</value>
</data>
<data name="Overlay_Toolbar_SwitchToFullscreen" xml:space="preserve">
<value>Passer en mode plein écran</value>
</data>
<data name="Overlay_Toolbar_SwitchToWindowed" xml:space="preserve">
<value>Passer à la mise à l'échelle fenêtrée</value>
</data>
<data name="Home_Toolbar_InitialState_Fullscreen.Header" xml:space="preserve">
<value>Mise à l'échelle plein écran</value>
</data>
<data name="Home_Toolbar_InitialState_Windowed.Header" xml:space="preserve">
<value>Mise à l'échelle par fenêtre</value>
</data>
<data name="Message_ExportScalingModesFailed" xml:space="preserve">
<value>Échec de l'exportation des modes de mise à l'échelle.</value>
</data>
<data name="Message_ImportScalingModesFailed" xml:space="preserve">
<value>Échec de l'importation des modes de mise à l'échelle.</value>
</data>
<data name="Home_Toolbar_StateToggle_ShortcutControl.Title" xml:space="preserve">
<value>Raccourci de basculement d'état de la barre d'outils</value>
</data>
<data name="Home_Advanced_DeveloperOptions_LocateLogs.Header" xml:space="preserve">
<value>Ouvrir l'emplacement des journaux</value>
</data>
<data name="Message_WindowedDesktopDuplication" xml:space="preserve">
<value>L'échelle de fenêtre n'est pas supportée avec la capture de la duplication de bureau.</value>
</data>
<data name="Profile_General_DesktopDuplicationWarning.Title" xml:space="preserve">
<value>Cette méthode de capture est incompatible avec la mise à l'échelle par fenêtre.</value>
</data>
<data name="Settings_Launch_RunAtStartup.Description" xml:space="preserve">
<value>La fenêtre principale n'apparaîtra pas si l'option «Afficher l'application sur la barre des taches» est activée</value>
</data>
<data name="Home_Activation_Timer_Description" xml:space="preserve">
<value>Redimensionner la fenêtre au premier plan après {}s</value>
</data>
<data name="Home_Activation_Timer_Start" xml:space="preserve">
<value>Commencer</value>
</data>
<data name="NotifyIcon_Timer_Fullscreen" xml:space="preserve">
<value>Mise à l'échelle après {}s (Plein écran)</value>
</data>
<data name="NotifyIcon_Timer_Windowed" xml:space="preserve">
<value>Mise à l'échelle après {}s (Fenêtré)</value>
</data>
<data name="Overlay_Toolbar_Minimize" xml:space="preserve">
<value>Réduire</value>
</data>
<data name="Profile_Cursor_AutoHide.Header" xml:space="preserve">
<value>Masquer automatiquement le curseur lorsqu'il est inactif</value>
</data>
<data name="Profile_Cursor_AutoHide_Delay.Header" xml:space="preserve">
<value>Masquer le délai en secondes</value>
</data>
<data name="Profile_Advanced_DestAlignment.Description" xml:space="preserve">
<value>S'applique uniquement à la mise à léchelle plein écran</value>
</data>
<data name="Profile_Advanced_DestAlignment.Header" xml:space="preserve">
<value>Alignement en sortie</value>
</data>
<data name="Profile_Advanced_DestAlignment_BottomCenter.Content" xml:space="preserve">
<value>Centre Bas</value>
</data>
<data name="Profile_Advanced_DestAlignment_BottomLeft.Content" xml:space="preserve">
<value>Centre Gauche</value>
</data>
<data name="Profile_Advanced_DestAlignment_BottomRight.Content" xml:space="preserve">
<value>Bas Droite</value>
</data>
<data name="Profile_Advanced_DestAlignment_Center.Content" xml:space="preserve">
<value>Centre</value>
</data>
<data name="Profile_Advanced_DestAlignment_Left.Content" xml:space="preserve">
<value>À gauche</value>
</data>
<data name="Profile_Advanced_DestAlignment_Right.Content" xml:space="preserve">
<value>À droite</value>
</data>
<data name="Profile_Advanced_DestAlignment_TopCenter.Content" xml:space="preserve">
<value>Centré en haut</value>
</data>
<data name="Profile_Advanced_DestAlignment_TopLeft.Content" xml:space="preserve">
<value>En haut à gauche</value>
</data>
<data name="Profile_Advanced_DestAlignment_TopRight.Content" xml:space="preserve">
<value>En haut à droite</value>
</data>
<data name="Home_Advanced_DeveloperOptions_DisableTopmost.Content" xml:space="preserve">
<value>Désactiver l'option «Toujours au premier plan»</value>
</data>
</root> </root>

View file

@ -835,4 +835,223 @@
<data name="TextMenuFlyout_Undo" xml:space="preserve"> <data name="TextMenuFlyout_Undo" xml:space="preserve">
<value>Kembalikan</value> <value>Kembalikan</value>
</data> </data>
<data name="Message_BannedInWindowedMode" xml:space="preserve">
<value>Penskalaan berjendela pada jendela ini tidak didukung.</value>
</data>
<data name="Message_InvalidCropping" xml:space="preserve">
<value>Gagal menerapkan pemotongan kustom.</value>
</data>
<data name="Home_TouchSupport.Description" xml:space="preserve">
<value>Karena pembatasan keamanan sistem, Magpie memerlukan hak istimewa UIAccess untuk mendukung input sentuh.</value>
</data>
<data name="Home_Activation.Description" xml:space="preserve">
<value>Tekan pintasan untuk menskalakan atau menghentikan penskalaan jendela latar depan.</value>
</data>
<data name="Home_Activation_FullscreenScaling.Header" xml:space="preserve">
<value>Pintasan penskalaan layar penuh</value>
</data>
<data name="Home_Activation_FullscreenScaling_ShortcutControl.Title" xml:space="preserve">
<value>Pintasan penskalaan layar penuh</value>
</data>
<data name="Home_Activation_WindowedScaling.Header" xml:space="preserve">
<value>Pintasan penskalaan berjendela</value>
</data>
<data name="Home_Activation_WindowedScaling_ShortcutControl.Title" xml:space="preserve">
<value>Pintasan penskalaan berjendela</value>
</data>
<data name="Home_Advanced_AllowScalingMaximized.Description" xml:space="preserve">
<value>Hanya berlaku untuk penskalaan layar penuh</value>
</data>
<data name="Home_Toolbar.Description" xml:space="preserve">
<value>Bilah alat muncul di bagian atas jendela yang diskalakan, menyediakan fitur seperti tampilan FPS dan pengambilan tangkapan layar. Dalam mode berjendela, bilah alat juga memungkinkan penggeseran jendela yang diskalakan.</value>
</data>
<data name="Home_Toolbar.Header" xml:space="preserve">
<value>Bilah alat</value>
</data>
<data name="Home_Toolbar_InitialState.Header" xml:space="preserve">
<value>Status awal bilah alat</value>
</data>
<data name="Home_Toolbar_InitialState_AlwaysShow.Content" xml:space="preserve">
<value>Selalu tampilkan</value>
</data>
<data name="Home_Toolbar_InitialState_AutoHide.Content" xml:space="preserve">
<value>Sembunyikan otomatis</value>
</data>
<data name="Home_Toolbar_InitialState_Off.Content" xml:space="preserve">
<value>Nonaktif</value>
</data>
<data name="Home_Toolbar_StateToggle.Header" xml:space="preserve">
<value>Pintasan pengalihan status bilah alat</value>
</data>
<data name="Home_Toolbar_StateToggle_ShortcutControl.Title" xml:space="preserve">
<value>Pintasan pengalihan status bilah alat</value>
</data>
<data name="Message_ToolbarIn3DGameMode" xml:space="preserve">
<value>Bilah alat tidak didukung dalam mode game 3D.</value>
</data>
<data name="Message_ToolbarNewState" xml:space="preserve">
<value>Bilah alat: {}</value>
</data>
<data name="Overlay_Toolbar_Close" xml:space="preserve">
<value>Hentikan Penskalaan</value>
</data>
<data name="Overlay_Toolbar_Demo" xml:space="preserve">
<value>Jendela Demo ImGui</value>
</data>
<data name="Overlay_Toolbar_Pin" xml:space="preserve">
<value>Sematkan Bilah Alat</value>
</data>
<data name="Overlay_Toolbar_TakeScreenshot" xml:space="preserve">
<value>Ambil Tangkapan Layar</value>
</data>
<data name="Overlay_Toolbar_Profiler" xml:space="preserve">
<value>Jendela Profiler</value>
</data>
<data name="Message_Windowed3DGameMode" xml:space="preserve">
<value>Penskalaan berjendela tidak didukung dalam mode game 3D.</value>
</data>
<data name="Profile_General_3DGameMode.Description" xml:space="preserve">
<value>Mengaktifkan optimasi untuk game 3D, tetapi tidak kompatibel dengan bilah alat dan penskalaan berjendela</value>
</data>
<data name="Home_Toolbar_ScreenshotSaveDirectory.Header" xml:space="preserve">
<value>Direktori penyimpanan tangkapan layar</value>
</data>
<data name="Home_Toolbar_ScreenshotSaveDirectory_Change.Content" xml:space="preserve">
<value>Ubah</value>
</data>
<data name="Dialog_SetlectScreenshotSaveDirectory_Title" xml:space="preserve">
<value>Pilih direktori untuk menyimpan tangkapan layar</value>
</data>
<data name="Message_ScreenshotSaved" xml:space="preserve">
<value>Tangkapan layar disimpan sebagai {}</value>
</data>
<data name="Message_ScreenshotFailed" xml:space="preserve">
<value>Tangkapan layar gagal.</value>
</data>
<data name="Overlay_Toolbar_TakeScreenshot_Description" xml:space="preserve">
<value>Klik kanan untuk mengekspor hasil antara</value>
</data>
<data name="Overlay_Toolbar_TakeScreenshot_PopupTitle" xml:space="preserve">
<value>Ekspor hasil antara</value>
</data>
<data name="Profile_WindowedScaling.Header" xml:space="preserve">
<value>Penskalaan berjendela</value>
</data>
<data name="Profile_WindowedScaling_InitialScaleFactor.Header" xml:space="preserve">
<value>Faktor skala awal</value>
</data>
<data name="Profile_WindowedScaling_InitialScaleFactor_Auto.Content" xml:space="preserve">
<value>Otomatis</value>
</data>
<data name="Profile_WindowedScaling_InitialScaleFactor_Custom.Content" xml:space="preserve">
<value>Kustom</value>
</data>
<data name="Profile_Advanced_DisableDirectFlip.Description" xml:space="preserve">
<value>Membantu menghindari masalah kompatibilitas tertentu tetapi dapat meningkatkan latensi secara signifikan</value>
</data>
<data name="Profile_General_AutoScale_Disabled.Content" xml:space="preserve">
<value>Dinonaktifkan</value>
</data>
<data name="Profile_General_AutoScale_Fullscreen.Content" xml:space="preserve">
<value>Penskalaan layar penuh</value>
</data>
<data name="Profile_General_AutoScale_Windowed.Content" xml:space="preserve">
<value>Penskalaan berjendela</value>
</data>
<data name="Profile_General_Multimonitor.Description" xml:space="preserve">
<value>Hanya berlaku untuk penskalaan layar penuh</value>
</data>
<data name="Home_TouchSupport_Warn.Title" xml:space="preserve">
<value>Bilah alat tidak kompatibel dengan input sentuh.</value>
</data>
<data name="Overlay_Toolbar_Close_Description" xml:space="preserve">
<value>Klik kanan untuk menutup bilah alat</value>
</data>
<data name="Overlay_Toolbar_SwitchToFullscreen" xml:space="preserve">
<value>Beralih ke Penskalaan Layar Penuh</value>
</data>
<data name="Overlay_Toolbar_SwitchToWindowed" xml:space="preserve">
<value>Beralih ke Penskalaan Berjendela</value>
</data>
<data name="Home_Toolbar_InitialState_Fullscreen.Header" xml:space="preserve">
<value>Penskalaan layar penuh</value>
</data>
<data name="Home_Toolbar_InitialState_Windowed.Header" xml:space="preserve">
<value>Penskalaan berjendela</value>
</data>
<data name="Message_ExportScalingModesFailed" xml:space="preserve">
<value>Gagal mengekspor mode penskalaan.</value>
</data>
<data name="Message_ImportScalingModesFailed" xml:space="preserve">
<value>Gagal mengimpor mode penskalaan.</value>
</data>
<data name="Home_Advanced_DeveloperOptions_LocateLogs.Header" xml:space="preserve">
<value>Buka lokasi log</value>
</data>
<data name="Message_WindowedDesktopDuplication" xml:space="preserve">
<value>Penskalaan berjendela tidak didukung dengan pengambilan Desktop Duplication.</value>
</data>
<data name="Profile_General_DesktopDuplicationWarning.Title" xml:space="preserve">
<value>Metode pengambilan ini tidak kompatibel dengan penskalaan berjendela.</value>
</data>
<data name="Settings_Launch_RunAtStartup.Description" xml:space="preserve">
<value>Jendela utama tidak akan muncul jika "Tampilkan aplikasi di baki sistem" diaktifkan</value>
</data>
<data name="Home_Activation_Timer_Description" xml:space="preserve">
<value>Skalakan jendela latar depan setelah {}d</value>
</data>
<data name="Home_Activation_Timer_Start" xml:space="preserve">
<value>Mulai</value>
</data>
<data name="NotifyIcon_Timer_Fullscreen" xml:space="preserve">
<value>Skalakan setelah {}d (Layar Penuh)</value>
</data>
<data name="NotifyIcon_Timer_Windowed" xml:space="preserve">
<value>Skalakan setelah {}d (Berjendela)</value>
</data>
<data name="Overlay_Toolbar_Minimize" xml:space="preserve">
<value>Minimalkan</value>
</data>
<data name="Profile_Cursor_AutoHide.Header" xml:space="preserve">
<value>Sembunyikan kursor otomatis saat tidak aktif</value>
</data>
<data name="Profile_Cursor_AutoHide_Delay.Header" xml:space="preserve">
<value>Penundaan sembunyikan dalam detik</value>
</data>
<data name="Profile_Advanced_DestAlignment.Description" xml:space="preserve">
<value>Hanya berlaku untuk penskalaan layar penuh</value>
</data>
<data name="Profile_Advanced_DestAlignment.Header" xml:space="preserve">
<value>Perataan keluaran</value>
</data>
<data name="Profile_Advanced_DestAlignment_BottomCenter.Content" xml:space="preserve">
<value>Bawah tengah</value>
</data>
<data name="Profile_Advanced_DestAlignment_BottomLeft.Content" xml:space="preserve">
<value>Bawah kiri</value>
</data>
<data name="Profile_Advanced_DestAlignment_BottomRight.Content" xml:space="preserve">
<value>Bawah kanan</value>
</data>
<data name="Profile_Advanced_DestAlignment_Center.Content" xml:space="preserve">
<value>Tengah</value>
</data>
<data name="Profile_Advanced_DestAlignment_Left.Content" xml:space="preserve">
<value>Kiri</value>
</data>
<data name="Profile_Advanced_DestAlignment_Right.Content" xml:space="preserve">
<value>Kanan</value>
</data>
<data name="Profile_Advanced_DestAlignment_TopCenter.Content" xml:space="preserve">
<value>Atas tengah</value>
</data>
<data name="Profile_Advanced_DestAlignment_TopLeft.Content" xml:space="preserve">
<value>Atas kiri</value>
</data>
<data name="Profile_Advanced_DestAlignment_TopRight.Content" xml:space="preserve">
<value>Atas kanan</value>
</data>
<data name="Home_Advanced_DeveloperOptions_DisableTopmost.Content" xml:space="preserve">
<value>Nonaktifkan selalu-di-atas</value>
</data>
</root> </root>

View file

@ -715,4 +715,49 @@
<data name="Dialog_JsonFile" xml:space="preserve"> <data name="Dialog_JsonFile" xml:space="preserve">
<value>FIle JSON</value> <value>FIle JSON</value>
</data> </data>
<data name="Profile_Performance_FrameRateLimiter.Header" xml:space="preserve">
<value>Limitatore del frame rate</value>
</data>
<data name="Profile_Performance_FrameRateLimiter_MaxFrameRate.Header" xml:space="preserve">
<value>Frame rate massimo</value>
</data>
<data name="About_DeveloperModeEnabled" xml:space="preserve">
<value>La modalità sviluppatore è abilitata.</value>
</data>
<data name="Home_Advanced_DeveloperOptions_DuplicateFrameDetection.Header" xml:space="preserve">
<value>Rilevazione di frame duplicati</value>
</data>
<data name="Home_Advanced_DeveloperOptions_DuplicateFrameDetection_Always.Content" xml:space="preserve">
<value>Sempre</value>
</data>
<data name="Home_Advanced_DeveloperOptions_DuplicateFrameDetection_Dynamic.Content" xml:space="preserve">
<value>Dinamico</value>
</data>
<data name="Home_Advanced_DeveloperOptions_DuplicateFrameDetection_Never.Content" xml:space="preserve">
<value>Mai</value>
</data>
<data name="Home_Advanced_DeveloperOptions_EnableStatisticsForDynamicDetection.Content" xml:space="preserve">
<value>Abilita le statistiche per il rilevamento dinamico</value>
</data>
<data name="Overlay_Profiler_DynamicDetection" xml:space="preserve">
<value>Rilevamento dinamico</value>
</data>
<data name="Overlay_Profiler_FrameRate" xml:space="preserve">
<value>Frame rate</value>
</data>
<data name="Home_TouchSupport_EnableTouchSupport.Header" xml:space="preserve">
<value>Abilita il supporto touch</value>
</data>
<data name="Home_TouchSupport_EnableTouchSupport_Description.Text" xml:space="preserve">
<value>Per cambiare quest'impostazione devi fornire i permessi d'amministratore</value>
</data>
<data name="Home_TouchSupport_EnableTouchSupport_LearnMore.Content" xml:space="preserve">
<value>Scopri di più</value>
</data>
<data name="Home_TouchSupport.Header" xml:space="preserve">
<value>Supporto touch</value>
</data>
<data name="Home_TouchSupport_Info.Title" xml:space="preserve">
<value>Se il supporto touch fallisce, Magpie potrebbe richiedere privilegi di amministratore prima di effettuare il ridimensionamento per eseguire riparazioni.</value>
</data>
</root> </root>

View file

@ -60,45 +60,45 @@
: and then encoded with base64 encoding. : and then encoded with base64 encoding.
--> -->
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root"> <xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace"></xsd:import> <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true"> <xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType> <xsd:complexType>
<xsd:choice maxOccurs="unbounded"> <xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata"> <xsd:element name="metadata">
<xsd:complexType> <xsd:complexType>
<xsd:sequence> <xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0"></xsd:element> <xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence> </xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string"></xsd:attribute> <xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string"></xsd:attribute> <xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string"></xsd:attribute> <xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space"></xsd:attribute> <xsd:attribute ref="xml:space" />
</xsd:complexType> </xsd:complexType>
</xsd:element> </xsd:element>
<xsd:element name="assembly"> <xsd:element name="assembly">
<xsd:complexType> <xsd:complexType>
<xsd:attribute name="alias" type="xsd:string"></xsd:attribute> <xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string"></xsd:attribute> <xsd:attribute name="name" type="xsd:string" />
</xsd:complexType> </xsd:complexType>
</xsd:element> </xsd:element>
<xsd:element name="data"> <xsd:element name="data">
<xsd:complexType> <xsd:complexType>
<xsd:sequence> <xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"></xsd:element> <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2"></xsd:element> <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence> </xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1"></xsd:attribute> <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3"></xsd:attribute> <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4"></xsd:attribute> <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space"></xsd:attribute> <xsd:attribute ref="xml:space" />
</xsd:complexType> </xsd:complexType>
</xsd:element> </xsd:element>
<xsd:element name="resheader"> <xsd:element name="resheader">
<xsd:complexType> <xsd:complexType>
<xsd:sequence> <xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"></xsd:element> <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence> </xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required"></xsd:attribute> <xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType> </xsd:complexType>
</xsd:element> </xsd:element>
</xsd:choice> </xsd:choice>
@ -1018,4 +1018,40 @@
<data name="Profile_Cursor_AutoHide_Delay.Header" xml:space="preserve"> <data name="Profile_Cursor_AutoHide_Delay.Header" xml:space="preserve">
<value>非表示までの秒数</value> <value>非表示までの秒数</value>
</data> </data>
<data name="Profile_Advanced_DestAlignment.Description" xml:space="preserve">
<value>フルスクリーン・スケーリングにのみ適用されます</value>
</data>
<data name="Profile_Advanced_DestAlignment.Header" xml:space="preserve">
<value>画面の出力位置</value>
</data>
<data name="Profile_Advanced_DestAlignment_BottomCenter.Content" xml:space="preserve">
<value>中央下</value>
</data>
<data name="Profile_Advanced_DestAlignment_BottomLeft.Content" xml:space="preserve">
<value>左下</value>
</data>
<data name="Profile_Advanced_DestAlignment_BottomRight.Content" xml:space="preserve">
<value>右下</value>
</data>
<data name="Profile_Advanced_DestAlignment_Center.Content" xml:space="preserve">
<value>中央</value>
</data>
<data name="Profile_Advanced_DestAlignment_Left.Content" xml:space="preserve">
<value>左</value>
</data>
<data name="Profile_Advanced_DestAlignment_Right.Content" xml:space="preserve">
<value>右</value>
</data>
<data name="Profile_Advanced_DestAlignment_TopCenter.Content" xml:space="preserve">
<value>中央上</value>
</data>
<data name="Profile_Advanced_DestAlignment_TopLeft.Content" xml:space="preserve">
<value>左上</value>
</data>
<data name="Profile_Advanced_DestAlignment_TopRight.Content" xml:space="preserve">
<value>右上</value>
</data>
<data name="Home_Advanced_DeveloperOptions_DisableTopmost.Content" xml:space="preserve">
<value>常時最前面表示を無効にする</value>
</data>
</root> </root>

View file

@ -298,7 +298,7 @@
<value>높이(픽셀)</value> <value>높이(픽셀)</value>
</data> </data>
<data name="ScalingModes_ScaleFlyout_WidthFactor.Text" xml:space="preserve"> <data name="ScalingModes_ScaleFlyout_WidthFactor.Text" xml:space="preserve">
<value>너비(스케일링 인수)</value> <value>너비(배율 인수)</value>
</data> </data>
<data name="ScalingModes_ScaleFlyout_Type.Text" xml:space="preserve"> <data name="ScalingModes_ScaleFlyout_Type.Text" xml:space="preserve">
<value>유형</value> <value>유형</value>
@ -307,7 +307,7 @@
<value>맞추기</value> <value>맞추기</value>
</data> </data>
<data name="ScalingModes_ScaleFlyout_Type_Fit_Description" xml:space="preserve"> <data name="ScalingModes_ScaleFlyout_Type_Fit_Description" xml:space="preserve">
<value>비례 스케일링으로 화면을 채운 후에 스케일링 인수를 설정합니다</value> <value>비례 스케일링으로 화면을 채운 후에 배율 인수를 설정합니다</value>
</data> </data>
<data name="Profile_General.Header" xml:space="preserve"> <data name="Profile_General.Header" xml:space="preserve">
<value>일반</value> <value>일반</value>
@ -406,7 +406,7 @@
<value>효과 매개변수를 인라인으로 만듦</value> <value>효과 매개변수를 인라인으로 만듦</value>
</data> </data>
<data name="Home_Advanced_SimulateExclusiveFullscreen.Description" xml:space="preserve"> <data name="Home_Advanced_SimulateExclusiveFullscreen.Description" xml:space="preserve">
<value>특정 응용 프로그램에서의 알림 및 팝업이 차단됩니다</value> <value>전체화면 스케일링에만 적용됩니다. 활성화하면 특정 앱 알림과 팝업이 표시되지 않습니다</value>
</data> </data>
<data name="Home_Advanced_SimulateExclusiveFullscreen.Header" xml:space="preserve"> <data name="Home_Advanced_SimulateExclusiveFullscreen.Header" xml:space="preserve">
<value>스케일링 할 때 단독 전체 화면 시뮬레이션</value> <value>스케일링 할 때 단독 전체 화면 시뮬레이션</value>
@ -526,7 +526,7 @@
<value>없음</value> <value>없음</value>
</data> </data>
<data name="ScalingModes_ScaleFlyout_HeightFactor.Text" xml:space="preserve"> <data name="ScalingModes_ScaleFlyout_HeightFactor.Text" xml:space="preserve">
<value>높이(스케일링 인수)</value> <value>높이(배율 인수)</value>
</data> </data>
<data name="ScalingModes_DragNotSupported.Text" xml:space="preserve"> <data name="ScalingModes_DragNotSupported.Text" xml:space="preserve">
<value>관리자 권한으로 실행 중일 때는 드래그 앤 드롭이 지원되지 않습니다</value> <value>관리자 권한으로 실행 중일 때는 드래그 앤 드롭이 지원되지 않습니다</value>
@ -545,7 +545,7 @@
<value>삭제</value> <value>삭제</value>
</data> </data>
<data name="ScalingModes_ScaleFlyout_Type_Factor_Description" xml:space="preserve"> <data name="ScalingModes_ScaleFlyout_Type_Factor_Description" xml:space="preserve">
<value>입력 이미지를 기준으로 스케일링 인수 설정</value> <value>입력 이미지를 기준으로 배율 인수 설정</value>
</data> </data>
<data name="ScalingModes_RenameFlyout_OK.Content" xml:space="preserve"> <data name="ScalingModes_RenameFlyout_OK.Content" xml:space="preserve">
<value>확인</value> <value>확인</value>
@ -835,4 +835,223 @@
<data name="TextMenuFlyout_Paste" xml:space="preserve"> <data name="TextMenuFlyout_Paste" xml:space="preserve">
<value>붙여넣기</value> <value>붙여넣기</value>
</data> </data>
<data name="Home_Activation.Description" xml:space="preserve">
<value>단축키를 누르면 현재 활성화된 창을 업스케일링하거나 원래대로 되돌릴 수 있습니다.</value>
</data>
<data name="Home_Toolbar.Description" xml:space="preserve">
<value>스케일된 창 상단에 툴바가 나타나며, FPS 표시나 스크린샷 캡처 등의 기능을 제공합니다. 창 모드에서는 스케일된 창을 끌어서 이동시킬 수도 있습니다.</value>
</data>
<data name="Home_Toolbar.Header" xml:space="preserve">
<value>툴바</value>
</data>
<data name="Home_Toolbar_InitialState.Header" xml:space="preserve">
<value>툴바 초기 상태</value>
</data>
<data name="Home_Toolbar_InitialState_AlwaysShow.Content" xml:space="preserve">
<value>항상 표시</value>
</data>
<data name="Home_Toolbar_InitialState_AutoHide.Content" xml:space="preserve">
<value>자동 숨김</value>
</data>
<data name="Home_Toolbar_StateToggle.Header" xml:space="preserve">
<value>툴바 창 전환 단축키</value>
</data>
<data name="Home_Toolbar_StateToggle_ShortcutControl.Title" xml:space="preserve">
<value>툴바 창 전환 단축키</value>
</data>
<data name="Message_ToolbarIn3DGameMode" xml:space="preserve">
<value>3D 게임 모드에서는 툴바가 지원되지 않습니다.</value>
</data>
<data name="Message_ToolbarNewState" xml:space="preserve">
<value>툴바: {}</value>
</data>
<data name="Overlay_Toolbar_Pin" xml:space="preserve">
<value>툴바 고정</value>
</data>
<data name="Overlay_Toolbar_TakeScreenshot" xml:space="preserve">
<value>스크린샷 캡처</value>
</data>
<data name="Overlay_Toolbar_Profiler" xml:space="preserve">
<value>프로파일러 창</value>
</data>
<data name="Profile_General_3DGameMode.Description" xml:space="preserve">
<value>3D 게임 최적화 기능으로 활성화하지만, 툴바 및 창 크기 조정 기능과 호환되지 않습니다</value>
</data>
<data name="Home_Toolbar_ScreenshotSaveDirectory.Header" xml:space="preserve">
<value>스크린샷 저장 경로</value>
</data>
<data name="Overlay_Toolbar_TakeScreenshot_Description" xml:space="preserve">
<value>오른쪽 클릭으로 중간 단계 내보내기</value>
</data>
<data name="Overlay_Toolbar_TakeScreenshot_PopupTitle" xml:space="preserve">
<value>중간 단계 내보내기</value>
</data>
<data name="Home_TouchSupport_Warn.Title" xml:space="preserve">
<value>툴바는 터치 입력을 지원하지 않습니다.</value>
</data>
<data name="Overlay_Toolbar_Close_Description" xml:space="preserve">
<value>오른쪽 클릭으로 툴바 닫기</value>
</data>
<data name="Overlay_Toolbar_SwitchToFullscreen" xml:space="preserve">
<value>전체화면 스케일링으로 전환</value>
</data>
<data name="Overlay_Toolbar_SwitchToWindowed" xml:space="preserve">
<value>창모드 스케일링으로 전환</value>
</data>
<data name="Home_Toolbar_InitialState_Fullscreen.Header" xml:space="preserve">
<value>전체화면 스케일링</value>
</data>
<data name="Home_Toolbar_InitialState_Windowed.Header" xml:space="preserve">
<value>창모드 스케일링</value>
</data>
<data name="Overlay_Toolbar_Minimize" xml:space="preserve">
<value>최소화</value>
</data>
<data name="Profile_WindowedScaling.Header" xml:space="preserve">
<value>창 모드 스케일링</value>
</data>
<data name="Profile_WindowedScaling_InitialScaleFactor.Header" xml:space="preserve">
<value>초기 확대 비율</value>
</data>
<data name="Profile_WindowedScaling_InitialScaleFactor_Auto.Content" xml:space="preserve">
<value>자동</value>
</data>
<data name="Profile_WindowedScaling_InitialScaleFactor_Custom.Content" xml:space="preserve">
<value>사용자 지정</value>
</data>
<data name="Profile_Cursor_AutoHide.Header" xml:space="preserve">
<value>커서 자동 숨기기</value>
</data>
<data name="Profile_Cursor_AutoHide_Delay.Header" xml:space="preserve">
<value>숨김 지연시간(초)</value>
</data>
<data name="Profile_Advanced_DisableDirectFlip.Description" xml:space="preserve">
<value>특정 호환 문제를 해결하는 데 도움이 될 수 있지만, 지연 시간이 늘어날 수 있습니다</value>
</data>
<data name="Message_BannedInWindowedMode" xml:space="preserve">
<value>이 윈도우의 스케일링은 지원하지 않습니다.</value>
</data>
<data name="Message_InvalidCropping" xml:space="preserve">
<value>자르기 사용자 지정 적용에 실패했습니다.</value>
</data>
<data name="Home_TouchSupport.Description" xml:space="preserve">
<value>시스템 보안 제한으로 Magpie는 터치 입력을 지원하기 위해 UIA Access 권한이 필요로 합니다.</value>
</data>
<data name="Home_Activation_FullscreenScaling.Header" xml:space="preserve">
<value>전체화면 스케일링 단축키</value>
</data>
<data name="Home_Activation_FullscreenScaling_ShortcutControl.Title" xml:space="preserve">
<value>전체화면 스케일링 단축키</value>
</data>
<data name="Home_Activation_WindowedScaling.Header" xml:space="preserve">
<value>창 모드 스케일링 단축키</value>
</data>
<data name="Home_Activation_WindowedScaling_ShortcutControl.Title" xml:space="preserve">
<value>창 모드 스케일링 단축키</value>
</data>
<data name="Overlay_Toolbar_Close" xml:space="preserve">
<value>스케일링 중지</value>
</data>
<data name="Message_Windowed3DGameMode" xml:space="preserve">
<value>3D 게임 모드에서는 창 모드 스케일링이 지원되지 않습니다.</value>
</data>
<data name="Dialog_SetlectScreenshotSaveDirectory_Title" xml:space="preserve">
<value>스크린샷을 저장할 경로를 선택하세요</value>
</data>
<data name="Message_ScreenshotSaved" xml:space="preserve">
<value>스크린샷 저장 {}</value>
</data>
<data name="Message_ScreenshotFailed" xml:space="preserve">
<value>스크린샷 실패.</value>
</data>
<data name="Home_Advanced_AllowScalingMaximized.Description" xml:space="preserve">
<value>전체화면 스케일링에만 적용됩니다</value>
</data>
<data name="Home_Toolbar_InitialState_Off.Content" xml:space="preserve">
<value>끄기</value>
</data>
<data name="Overlay_Toolbar_Demo" xml:space="preserve">
<value>ImGui 데모 창</value>
</data>
<data name="Home_Toolbar_ScreenshotSaveDirectory_Change.Content" xml:space="preserve">
<value>변경</value>
</data>
<data name="Profile_General_AutoScale_Disabled.Content" xml:space="preserve">
<value>비활성화</value>
</data>
<data name="Profile_General_AutoScale_Fullscreen.Content" xml:space="preserve">
<value>전체화면 스케일링</value>
</data>
<data name="Profile_General_AutoScale_Windowed.Content" xml:space="preserve">
<value>창모드 스케일링</value>
</data>
<data name="Profile_General_Multimonitor.Description" xml:space="preserve">
<value>전체화면 스케일링에만 적용됩니다</value>
</data>
<data name="Message_ExportScalingModesFailed" xml:space="preserve">
<value>스케일링 모드를 내보내는 데 실패했습니다.</value>
</data>
<data name="Message_ImportScalingModesFailed" xml:space="preserve">
<value>스케일링 모드를 불러오는 데 실패했습니다.</value>
</data>
<data name="Home_Advanced_DeveloperOptions_LocateLogs.Header" xml:space="preserve">
<value>로그 위치 열기</value>
</data>
<data name="Message_WindowedDesktopDuplication" xml:space="preserve">
<value>데스크탑 복제 캡처에서는 창모드 스케일링을 지원하지 않습니다.</value>
</data>
<data name="Profile_General_DesktopDuplicationWarning.Title" xml:space="preserve">
<value>이 캡처 방식은 창모드 스케일링과 호환되지 않습니다.</value>
</data>
<data name="Settings_Launch_RunAtStartup.Description" xml:space="preserve">
<value>"시스템 트레이에 앱 표시"가 활성화되어 있으면 메인 창이 나타나지 않습니다</value>
</data>
<data name="Home_Activation_Timer_Description" xml:space="preserve">
<value>{}초 후에 활성화된 창을 스케일링합니다</value>
</data>
<data name="Home_Activation_Timer_Start" xml:space="preserve">
<value>시작</value>
</data>
<data name="NotifyIcon_Timer_Fullscreen" xml:space="preserve">
<value>{}초 후에 스케일링 (전체화면)</value>
</data>
<data name="NotifyIcon_Timer_Windowed" xml:space="preserve">
<value>{}초 후에 스케일링 (창모드)</value>
</data>
<data name="Profile_Advanced_DestAlignment.Description" xml:space="preserve">
<value>전체 화면 스케일링에만 적용</value>
</data>
<data name="Profile_Advanced_DestAlignment.Header" xml:space="preserve">
<value>출력 정렬</value>
</data>
<data name="Profile_Advanced_DestAlignment_BottomCenter.Content" xml:space="preserve">
<value>가운데 아래</value>
</data>
<data name="Profile_Advanced_DestAlignment_BottomLeft.Content" xml:space="preserve">
<value>왼쪽 아래</value>
</data>
<data name="Profile_Advanced_DestAlignment_BottomRight.Content" xml:space="preserve">
<value>오른쪽 아래</value>
</data>
<data name="Profile_Advanced_DestAlignment_Center.Content" xml:space="preserve">
<value>가운데</value>
</data>
<data name="Profile_Advanced_DestAlignment_Left.Content" xml:space="preserve">
<value>왼쪽</value>
</data>
<data name="Profile_Advanced_DestAlignment_Right.Content" xml:space="preserve">
<value>오른쪽</value>
</data>
<data name="Profile_Advanced_DestAlignment_TopCenter.Content" xml:space="preserve">
<value>가운데 위</value>
</data>
<data name="Profile_Advanced_DestAlignment_TopLeft.Content" xml:space="preserve">
<value>왼쪽 위</value>
</data>
<data name="Profile_Advanced_DestAlignment_TopRight.Content" xml:space="preserve">
<value>오른쪽 위</value>
</data>
<data name="Home_Advanced_DeveloperOptions_DisableTopmost.Content" xml:space="preserve">
<value>항상 위에 표시 사용 안 함</value>
</data>
</root> </root>

View file

@ -535,7 +535,7 @@
<value>Desativar cache de fonte</value> <value>Desativar cache de fonte</value>
</data> </data>
<data name="Home_Advanced_SimulateExclusiveFullscreen.Description" xml:space="preserve"> <data name="Home_Advanced_SimulateExclusiveFullscreen.Description" xml:space="preserve">
<value>Notificações e pop-ups de determinados aplicativos serão bloqueados</value> <value>Aplica-se apenas ao dimensionamento em tela cheia. Suprime certas notificações e pop-ups de aplicativos quando ativado.</value>
</data> </data>
<data name="Home_Advanced_SimulateExclusiveFullscreen.Header" xml:space="preserve"> <data name="Home_Advanced_SimulateExclusiveFullscreen.Header" xml:space="preserve">
<value>Simular tela cheia exclusiva durante o redimensionamento</value> <value>Simular tela cheia exclusiva durante o redimensionamento</value>
@ -811,4 +811,79 @@
<data name="Overlay_Toolbar_Minimize" xml:space="preserve"> <data name="Overlay_Toolbar_Minimize" xml:space="preserve">
<value>Minimizar</value> <value>Minimizar</value>
</data> </data>
<data name="Root_NewProfileFlyout_NameContextFlyout_AppName" xml:space="preserve">
<value>Preencha com o nome do aplicativo</value>
</data>
<data name="Root_NewProfileFlyout_NameContextFlyout_ProcessName" xml:space="preserve">
<value>Preencha com o nome do processo</value>
</data>
<data name="Root_NewProfileFlyout_NameContextFlyout_WindowTitle" xml:space="preserve">
<value>Preencha com o titulo da janela</value>
</data>
<data name="TextMenuFlyout_Copy" xml:space="preserve">
<value>Copiar</value>
</data>
<data name="TextMenuFlyout_Cut" xml:space="preserve">
<value>Recortar</value>
</data>
<data name="TextMenuFlyout_Paste" xml:space="preserve">
<value>Colar</value>
</data>
<data name="TextMenuFlyout_Redo" xml:space="preserve">
<value>Refazer</value>
</data>
<data name="TextMenuFlyout_SelectAll" xml:space="preserve">
<value>Selecionar Tudo</value>
</data>
<data name="TextMenuFlyout_Undo" xml:space="preserve">
<value>Desfazer</value>
</data>
<data name="Message_BannedInWindowedMode" xml:space="preserve">
<value>O redimensionamento desta janela não é suportado.</value>
</data>
<data name="Message_InvalidCropping" xml:space="preserve">
<value>Falha ao aplicar o recorte personalizado.</value>
</data>
<data name="Home_TouchSupport.Description" xml:space="preserve">
<value>Devido a restrições de segurança do sistema, o Magpie requer privilégios de acesso à interface do usuário para suportar entradas táteis.</value>
</data>
<data name="Home_Activation.Description" xml:space="preserve">
<value>Pressione o atalho para dimensionar ou interromper o dimensionamento da janela em primeiro plano.</value>
</data>
<data name="Home_Activation_FullscreenScaling.Header" xml:space="preserve">
<value>Atalho para ampliar para tela cheia</value>
</data>
<data name="Home_Activation_FullscreenScaling_ShortcutControl.Title" xml:space="preserve">
<value>Atalho para ampliar para tela cheia</value>
</data>
<data name="Home_Activation_WindowedScaling.Header" xml:space="preserve">
<value>Atalho para dimensionamento em janela</value>
</data>
<data name="Home_Activation_WindowedScaling_ShortcutControl.Title" xml:space="preserve">
<value>Atalho para dimensionamento em janela</value>
</data>
<data name="Home_Advanced_AllowScalingMaximized.Description" xml:space="preserve">
<value>Aplica-se apenas ao dimensionamento em tela cheia</value>
</data>
<data name="Home_Toolbar.Description" xml:space="preserve">
<value>A barra de ferramentas aparece na parte superior da janela redimensionada, oferecendo recursos como exibição de FPS e captura de tela. No modo janela, ela também permite arrastar a janela redimensionada.</value>
</data>
<data name="Home_Toolbar.Header" xml:space="preserve">
<value>Barra de ferramentas</value>
</data>
<data name="Home_Toolbar_InitialState.Header" xml:space="preserve">
<value>Estado inicial da barra de ferramentas</value>
</data>
<data name="Home_Toolbar_InitialState_AlwaysShow.Content" xml:space="preserve">
<value>Sempre mostrar</value>
</data>
<data name="Home_Toolbar_InitialState_AutoHide.Content" xml:space="preserve">
<value>Ocultar automaticamente</value>
</data>
<data name="Home_Toolbar_InitialState_Off.Content" xml:space="preserve">
<value>Desligado</value>
</data>
<data name="Home_Toolbar_StateToggle.Header" xml:space="preserve">
<value>Atalho para alternar o estado da barra de ferramentas</value>
</data>
</root> </root>

View file

@ -1012,4 +1012,46 @@
<data name="Overlay_Toolbar_Minimize" xml:space="preserve"> <data name="Overlay_Toolbar_Minimize" xml:space="preserve">
<value>Свернуть</value> <value>Свернуть</value>
</data> </data>
<data name="Profile_Cursor_AutoHide.Header" xml:space="preserve">
<value>Автоскрытие курсора при неактивности</value>
</data>
<data name="Profile_Cursor_AutoHide_Delay.Header" xml:space="preserve">
<value>Время до скрытия в секундах</value>
</data>
<data name="Profile_Advanced_DestAlignment.Description" xml:space="preserve">
<value>Действует только для полноэкранного масштабирования</value>
</data>
<data name="Profile_Advanced_DestAlignment.Header" xml:space="preserve">
<value>Выравнивание вывода</value>
</data>
<data name="Profile_Advanced_DestAlignment_BottomCenter.Content" xml:space="preserve">
<value>Внизу по центру</value>
</data>
<data name="Profile_Advanced_DestAlignment_BottomLeft.Content" xml:space="preserve">
<value>Внизу слева</value>
</data>
<data name="Profile_Advanced_DestAlignment_BottomRight.Content" xml:space="preserve">
<value>Внизу справа</value>
</data>
<data name="Profile_Advanced_DestAlignment_Center.Content" xml:space="preserve">
<value>Центр</value>
</data>
<data name="Profile_Advanced_DestAlignment_Left.Content" xml:space="preserve">
<value>Лево</value>
</data>
<data name="Profile_Advanced_DestAlignment_Right.Content" xml:space="preserve">
<value>Право</value>
</data>
<data name="Profile_Advanced_DestAlignment_TopCenter.Content" xml:space="preserve">
<value>Сверху по центру</value>
</data>
<data name="Profile_Advanced_DestAlignment_TopLeft.Content" xml:space="preserve">
<value>Сверху слева</value>
</data>
<data name="Profile_Advanced_DestAlignment_TopRight.Content" xml:space="preserve">
<value>Сверху справа</value>
</data>
<data name="Home_Advanced_DeveloperOptions_DisableTopmost.Content" xml:space="preserve">
<value>Отключить функцию «Всегда поверх всех окон»</value>
</data>
</root> </root>

View file

@ -835,4 +835,223 @@
<data name="TextMenuFlyout_Redo" xml:space="preserve"> <data name="TextMenuFlyout_Redo" xml:space="preserve">
<value>மீண்டும்செய்</value> <value>மீண்டும்செய்</value>
</data> </data>
<data name="Message_BannedInWindowedMode" xml:space="preserve">
<value>இந்த சாளரத்தின் சாளர அளவீடு ஆதரிக்கப்படவில்லை.</value>
</data>
<data name="Message_InvalidCropping" xml:space="preserve">
<value>தனிப்பயன் செதுக்குதலைப் பயன்படுத்துவதில் தோல்வி.</value>
</data>
<data name="Home_TouchSupport.Description" xml:space="preserve">
<value>கணினி பாதுகாப்பு கட்டுப்பாடுகள் காரணமாக, தொடு உள்ளீட்டை ஆதரிக்க Magpieக்கு UIAccess சிறப்புரிமை தேவைப்படுகிறது.</value>
</data>
<data name="Home_Activation.Description" xml:space="preserve">
<value>முன்புற சாளரத்தை அளவிட அல்லது அளவிடுவதை நிறுத்த குறுக்குவழியை அழுத்தவும்.</value>
</data>
<data name="Home_Activation_FullscreenScaling.Header" xml:space="preserve">
<value>முழுத்திரை அளவிடுதல் குறுக்குவழி</value>
</data>
<data name="Home_Activation_FullscreenScaling_ShortcutControl.Title" xml:space="preserve">
<value>முழுத்திரை அளவிடுதல் குறுக்குவழி</value>
</data>
<data name="Home_Activation_WindowedScaling.Header" xml:space="preserve">
<value>சாளர அளவிடுதல் குறுக்குவழி</value>
</data>
<data name="Home_Activation_WindowedScaling_ShortcutControl.Title" xml:space="preserve">
<value>சாளர அளவிடுதல் குறுக்குவழி</value>
</data>
<data name="Home_Advanced_AllowScalingMaximized.Description" xml:space="preserve">
<value>முழுத்திரை அளவிடுதலுக்கு மட்டுமே பொருந்தும்</value>
</data>
<data name="Home_Toolbar.Description" xml:space="preserve">
<value>கருவிப்பட்டி அளவிடப்பட்ட சாளரத்தின் மேல் தோன்றும், FPS காட்சி மற்றும் திரைக்காட்சி பிடிப்பு போன்ற அம்சங்களை வழங்குகிறது. சாளர பயன்முறையில், அளவிடப்பட்ட சாளரத்தை இழுக்கவும் இது அனுமதிக்கிறது.</value>
</data>
<data name="Home_Toolbar.Header" xml:space="preserve">
<value>கருவிப்பட்டி</value>
</data>
<data name="Home_Toolbar_InitialState.Header" xml:space="preserve">
<value>ஆரம்ப கருவிப்பட்டியின் நிலை</value>
</data>
<data name="Home_Toolbar_InitialState_AlwaysShow.Content" xml:space="preserve">
<value>எப்போதும் காட்டு</value>
</data>
<data name="Home_Toolbar_InitialState_AutoHide.Content" xml:space="preserve">
<value>தானாக மறை</value>
</data>
<data name="Home_Toolbar_InitialState_Off.Content" xml:space="preserve">
<value>அணை</value>
</data>
<data name="Home_Toolbar_StateToggle.Header" xml:space="preserve">
<value>கருவிப்பட்டி நிலை மாற்று குறுக்குவழி</value>
</data>
<data name="Home_Toolbar_StateToggle_ShortcutControl.Title" xml:space="preserve">
<value>கருவிப்பட்டி நிலை மாற்று குறுக்குவழி</value>
</data>
<data name="Message_ToolbarIn3DGameMode" xml:space="preserve">
<value>கருவிப்பட்டி 3D கேம் பயன்முறையில் ஆதரிக்கப்படவில்லை.</value>
</data>
<data name="Message_ToolbarNewState" xml:space="preserve">
<value>கருவிப்பட்டி: {}</value>
</data>
<data name="Overlay_Toolbar_Close" xml:space="preserve">
<value>அளவிடுவதை நிறுத்து</value>
</data>
<data name="Overlay_Toolbar_Demo" xml:space="preserve">
<value>ImGui டெமோ சாளரம்</value>
</data>
<data name="Overlay_Toolbar_Pin" xml:space="preserve">
<value>கருவிப்பட்டியை பின் செய்யவும்</value>
</data>
<data name="Overlay_Toolbar_TakeScreenshot" xml:space="preserve">
<value>திரைக்காட்சி எடுக்கவும்</value>
</data>
<data name="Overlay_Toolbar_Profiler" xml:space="preserve">
<value>சுயவிவர சாளரம்</value>
</data>
<data name="Message_Windowed3DGameMode" xml:space="preserve">
<value>3D கேம் பயன்முறையில் சாளர அளவீடு ஆதரிக்கப்படாது.</value>
</data>
<data name="Profile_General_3DGameMode.Description" xml:space="preserve">
<value>3D கேம்களுக்கான மேம்படுத்தல்களை இயக்குகிறது, ஆனால் கருவிப்பட்டி மற்றும் சாளர அளவீடு ஆகியவற்றுடன் பொருந்தாது</value>
</data>
<data name="Home_Toolbar_ScreenshotSaveDirectory.Header" xml:space="preserve">
<value>திரைக்காட்சி சேமிப்பு அடைவு</value>
</data>
<data name="Home_Toolbar_ScreenshotSaveDirectory_Change.Content" xml:space="preserve">
<value>மாற்றம்</value>
</data>
<data name="Dialog_SetlectScreenshotSaveDirectory_Title" xml:space="preserve">
<value>திரை சாட்களைச் சேமிக்க ஒரு கோப்பகத்தைத் தேர்ந்தெடுக்கவும்</value>
</data>
<data name="Message_ScreenshotSaved" xml:space="preserve">
<value>திரைக்காட்சி {} ஆக சேமிக்கப்பட்டது</value>
</data>
<data name="Message_ScreenshotFailed" xml:space="preserve">
<value>திரைக்காட்சி தோல்வியடைந்தது.</value>
</data>
<data name="Overlay_Toolbar_TakeScreenshot_Description" xml:space="preserve">
<value>இடைநிலை முடிவை ஏற்றுமதி செய்ய வலது சொடுக்கு செய்யவும்</value>
</data>
<data name="Overlay_Toolbar_TakeScreenshot_PopupTitle" xml:space="preserve">
<value>ஏற்றுமதி இடைநிலை முடிவு</value>
</data>
<data name="Profile_WindowedScaling.Header" xml:space="preserve">
<value>சாளர அளவீடு</value>
</data>
<data name="Profile_WindowedScaling_InitialScaleFactor.Header" xml:space="preserve">
<value>ஆரம்ப அளவு காரணி</value>
</data>
<data name="Profile_WindowedScaling_InitialScaleFactor_Auto.Content" xml:space="preserve">
<value>தானி</value>
</data>
<data name="Profile_WindowedScaling_InitialScaleFactor_Custom.Content" xml:space="preserve">
<value>தனிப்பயன்</value>
</data>
<data name="Profile_Advanced_DisableDirectFlip.Description" xml:space="preserve">
<value>சில பொருந்தக்கூடிய சிக்கல்களைத் தவிர்க்க உதவுகிறது, ஆனால் தாமதத்தை கணிசமாக அதிகரிக்கலாம்</value>
</data>
<data name="Profile_General_AutoScale_Disabled.Content" xml:space="preserve">
<value>முடக்கப்பட்டது</value>
</data>
<data name="Profile_General_AutoScale_Fullscreen.Content" xml:space="preserve">
<value>முழுத்திரை அளவிடுதல்</value>
</data>
<data name="Profile_General_AutoScale_Windowed.Content" xml:space="preserve">
<value>சாளர அளவீடு</value>
</data>
<data name="Profile_General_Multimonitor.Description" xml:space="preserve">
<value>முழுத்திரை அளவிடுதலுக்கு மட்டுமே பொருந்தும்</value>
</data>
<data name="Home_TouchSupport_Warn.Title" xml:space="preserve">
<value>தொடு உள்ளீட்டுடன் கருவிப்பட்டி இணக்கமாக இல்லை.</value>
</data>
<data name="Overlay_Toolbar_Close_Description" xml:space="preserve">
<value>கருவிப்பட்டியை மூட வலது சொடுக்கு செய்யவும்</value>
</data>
<data name="Overlay_Toolbar_SwitchToFullscreen" xml:space="preserve">
<value>முழுத்திரை அளவிடுதலுக்கு மாறவும்</value>
</data>
<data name="Overlay_Toolbar_SwitchToWindowed" xml:space="preserve">
<value>சாளர அளவிடுதலுக்கு மாறவும்</value>
</data>
<data name="Home_Toolbar_InitialState_Fullscreen.Header" xml:space="preserve">
<value>முழுத்திரை அளவிடுதல்</value>
</data>
<data name="Home_Toolbar_InitialState_Windowed.Header" xml:space="preserve">
<value>சாளர அளவீடு</value>
</data>
<data name="Message_ExportScalingModesFailed" xml:space="preserve">
<value>அளவிடுதல் முறைகளை ஏற்றுமதி செய்ய முடியவில்லை.</value>
</data>
<data name="Message_ImportScalingModesFailed" xml:space="preserve">
<value>அளவிடுதல் முறைகளை இறக்குமதி செய்ய முடியவில்லை.</value>
</data>
<data name="Home_Advanced_DeveloperOptions_LocateLogs.Header" xml:space="preserve">
<value>பதிவுகளின் இருப்பிடத்தைத் திறக்கவும்</value>
</data>
<data name="Message_WindowedDesktopDuplication" xml:space="preserve">
<value>டெச்க்டாப் டூப்ளிகேசன் கேப்சருடன் சாளரம் ச்கேலிங் ஆதரிக்கப்படவில்லை.</value>
</data>
<data name="Profile_General_DesktopDuplicationWarning.Title" xml:space="preserve">
<value>இந்த பிடிப்பு முறை சாளர அளவீடுகளுடன் பொருந்தாது.</value>
</data>
<data name="Settings_Launch_RunAtStartup.Description" xml:space="preserve">
<value>"கணினி தட்டில் பயன்பாட்டைக் காண்பி" இயக்கப்பட்டிருந்தால் முதன்மையான சாளரம் தோன்றாது</value>
</data>
<data name="Home_Activation_Timer_Description" xml:space="preserve">
<value>முன்புற சாளரத்தை {}sக்குப் பிறகு அளவிடவும்</value>
</data>
<data name="Home_Activation_Timer_Start" xml:space="preserve">
<value>தொடங்கு</value>
</data>
<data name="NotifyIcon_Timer_Fullscreen" xml:space="preserve">
<value>{}களுக்குப் பின் அளவிடு (முழுத்திரை)</value>
</data>
<data name="NotifyIcon_Timer_Windowed" xml:space="preserve">
<value>{}களுக்குப் பின் அளவுகோல் (சாளரம்)</value>
</data>
<data name="Overlay_Toolbar_Minimize" xml:space="preserve">
<value>குறைக்கவும்</value>
</data>
<data name="Profile_Cursor_AutoHide.Header" xml:space="preserve">
<value>செயலற்ற நிலையில் கர்சரை தானாக மறை</value>
</data>
<data name="Profile_Cursor_AutoHide_Delay.Header" xml:space="preserve">
<value>வினாடிகளில் தாமதத்தை மறை</value>
</data>
<data name="Profile_Advanced_DestAlignment.Description" xml:space="preserve">
<value>முழுத்திரை அளவிடுதலுக்கு மட்டுமே பொருந்தும்</value>
</data>
<data name="Profile_Advanced_DestAlignment.Header" xml:space="preserve">
<value>வெளியீடு சீரமைப்பு</value>
</data>
<data name="Profile_Advanced_DestAlignment_BottomCenter.Content" xml:space="preserve">
<value>கீழ் நடுவண்</value>
</data>
<data name="Profile_Advanced_DestAlignment_BottomLeft.Content" xml:space="preserve">
<value>கீழே இடது</value>
</data>
<data name="Profile_Advanced_DestAlignment_BottomRight.Content" xml:space="preserve">
<value>கீழ் வலது</value>
</data>
<data name="Profile_Advanced_DestAlignment_Center.Content" xml:space="preserve">
<value>நடுவண்</value>
</data>
<data name="Profile_Advanced_DestAlignment_Left.Content" xml:space="preserve">
<value>இடது</value>
</data>
<data name="Profile_Advanced_DestAlignment_Right.Content" xml:space="preserve">
<value>வலது</value>
</data>
<data name="Profile_Advanced_DestAlignment_TopCenter.Content" xml:space="preserve">
<value>மேல் நடுவண்</value>
</data>
<data name="Profile_Advanced_DestAlignment_TopLeft.Content" xml:space="preserve">
<value>மேல் இடது</value>
</data>
<data name="Profile_Advanced_DestAlignment_TopRight.Content" xml:space="preserve">
<value>மேல் வலது</value>
</data>
<data name="Home_Advanced_DeveloperOptions_DisableTopmost.Content" xml:space="preserve">
<value>எப்பொழுதும் மேல்நிலையை முடக்கு</value>
</data>
</root> </root>

View file

@ -808,4 +808,250 @@
<data name="Home_Advanced_DeveloperOptions_BenchmarkMode.Content" xml:space="preserve"> <data name="Home_Advanced_DeveloperOptions_BenchmarkMode.Content" xml:space="preserve">
<value>Karşılaştırma modu</value> <value>Karşılaştırma modu</value>
</data> </data>
<data name="Root_NewProfileFlyout_NameContextFlyout_AppName" xml:space="preserve">
<value>Uygulama adını girin</value>
</data>
<data name="Root_NewProfileFlyout_NameContextFlyout_ProcessName" xml:space="preserve">
<value>İşlem adını girin</value>
</data>
<data name="Root_NewProfileFlyout_NameContextFlyout_WindowTitle" xml:space="preserve">
<value>Pencere başlığıyla doldur</value>
</data>
<data name="TextMenuFlyout_Copy" xml:space="preserve">
<value>Kopyala</value>
</data>
<data name="TextMenuFlyout_Cut" xml:space="preserve">
<value>Kes</value>
</data>
<data name="TextMenuFlyout_Paste" xml:space="preserve">
<value>Yapıştır</value>
</data>
<data name="TextMenuFlyout_Redo" xml:space="preserve">
<value>Tekrarla</value>
</data>
<data name="TextMenuFlyout_SelectAll" xml:space="preserve">
<value>Tümünü Seç</value>
</data>
<data name="TextMenuFlyout_Undo" xml:space="preserve">
<value>Geri al</value>
</data>
<data name="Message_BannedInWindowedMode" xml:space="preserve">
<value>Bu pencerenin pencereli ölçeklendirilmesi desteklenmemektedir.</value>
</data>
<data name="Message_InvalidCropping" xml:space="preserve">
<value>Özel kırpma işlemi uygulanamadı.</value>
</data>
<data name="Home_TouchSupport.Description" xml:space="preserve">
<value>Sistem güvenlik kısıtlamaları nedeniyle, Magpie'nin dokunmatik girişi destekleyebilmesi için UIAccess ayrıcalığına ihtiyaç vardır.</value>
</data>
<data name="Home_Activation.Description" xml:space="preserve">
<value>Ön plandaki pencerenin boyutunu değiştirmek veya değiştirmeyi durdurmak için kısayola basın.</value>
</data>
<data name="Home_Activation_FullscreenScaling.Header" xml:space="preserve">
<value>Tam ekran ölçeklendirme kısayolu</value>
</data>
<data name="Home_Activation_FullscreenScaling_ShortcutControl.Title" xml:space="preserve">
<value>Tam ekran ölçeklendirme kısayolu</value>
</data>
<data name="Home_Activation_WindowedScaling.Header" xml:space="preserve">
<value>Pencereli ölçeklendirme kısayolu</value>
</data>
<data name="Home_Activation_WindowedScaling_ShortcutControl.Title" xml:space="preserve">
<value>Pencereli ölçeklendirme kısayolu</value>
</data>
<data name="Home_Advanced_AllowScalingMaximized.Description" xml:space="preserve">
<value>Yalnızca tam ekran ölçeklendirme için geçerlidir</value>
</data>
<data name="Home_Toolbar.Description" xml:space="preserve">
<value>Ölçeklendirilmiş pencerenin üst kısmında, FPS gösterimi ve ekran görüntüsü alma gibi özellikler sunan bir araç çubuğu görünür. Pencere modunda, ölçeklendirilmiş pencerenin sürüklenmesine de olanak tanır.</value>
</data>
<data name="Home_Toolbar.Header" xml:space="preserve">
<value>Araç Çubuğu</value>
</data>
<data name="Home_Toolbar_InitialState.Header" xml:space="preserve">
<value>Araç çubuğunun başlangıç durumu</value>
</data>
<data name="Home_Toolbar_InitialState_AlwaysShow.Content" xml:space="preserve">
<value>Her zaman göster</value>
</data>
<data name="Home_Toolbar_InitialState_AutoHide.Content" xml:space="preserve">
<value>Otomatik gizle</value>
</data>
<data name="Home_Toolbar_InitialState_Off.Content" xml:space="preserve">
<value>Kapalı</value>
</data>
<data name="Home_Toolbar_StateToggle.Header" xml:space="preserve">
<value>Araç çubuğu durumunu değiştirme kısayolu</value>
</data>
<data name="Home_Toolbar_StateToggle_ShortcutControl.Title" xml:space="preserve">
<value>Araç çubuğu durumunu değiştirme kısayolu</value>
</data>
<data name="Message_ToolbarIn3DGameMode" xml:space="preserve">
<value>Araç çubuğu, 3D oyun modunda desteklenmemektedir.</value>
</data>
<data name="Message_ToolbarNewState" xml:space="preserve">
<value>Araç çubuğu: {}</value>
</data>
<data name="Overlay_Toolbar_Close" xml:space="preserve">
<value>Ölçeklendirmeyi Durdur</value>
</data>
<data name="Overlay_Toolbar_Demo" xml:space="preserve">
<value>ImGui Demo Penceresi</value>
</data>
<data name="Overlay_Toolbar_Pin" xml:space="preserve">
<value>Araç Çubuğunu Sabitle</value>
</data>
<data name="Overlay_Toolbar_TakeScreenshot" xml:space="preserve">
<value>Ekran görüntüsü al</value>
</data>
<data name="Overlay_Toolbar_Profiler" xml:space="preserve">
<value>Profil Penceresi</value>
</data>
<data name="Message_Windowed3DGameMode" xml:space="preserve">
<value>3D oyun modunda pencereli ölçeklendirme desteklenmemektedir.</value>
</data>
<data name="Profile_General_3DGameMode.Description" xml:space="preserve">
<value>3D oyunlar için optimizasyonları etkinleştirir, ancak araç çubuğu ve pencereli ölçeklendirme ile uyumsuzdur</value>
</data>
<data name="Home_Toolbar_ScreenshotSaveDirectory.Header" xml:space="preserve">
<value>Ekran görüntüsü kaydetme dizini</value>
</data>
<data name="Home_Toolbar_ScreenshotSaveDirectory_Change.Content" xml:space="preserve">
<value>Değiştir</value>
</data>
<data name="Dialog_SetlectScreenshotSaveDirectory_Title" xml:space="preserve">
<value>Ekran görüntülerini kaydetmek için bir klasör seçin</value>
</data>
<data name="Message_ScreenshotSaved" xml:space="preserve">
<value>Ekran görüntüsü {} olarak kaydedildi</value>
</data>
<data name="Message_ScreenshotFailed" xml:space="preserve">
<value>Ekran görüntüsü alınamadı.</value>
</data>
<data name="Overlay_Toolbar_TakeScreenshot_Description" xml:space="preserve">
<value>Ara sonucu dışa aktarmak için sağ tıklayın</value>
</data>
<data name="Overlay_Toolbar_TakeScreenshot_PopupTitle" xml:space="preserve">
<value>Ara sonucu dışa aktar</value>
</data>
<data name="Profile_WindowedScaling.Header" xml:space="preserve">
<value>Pencereli ölçeklendirme</value>
</data>
<data name="Profile_WindowedScaling_InitialScaleFactor.Header" xml:space="preserve">
<value>Başlangıç ölçek faktörü</value>
</data>
<data name="Profile_WindowedScaling_InitialScaleFactor_Auto.Content" xml:space="preserve">
<value>Otomatik</value>
</data>
<data name="Profile_WindowedScaling_InitialScaleFactor_Custom.Content" xml:space="preserve">
<value>Özel</value>
</data>
<data name="Profile_Advanced_DisableDirectFlip.Description" xml:space="preserve">
<value>Bazı uyumluluk sorunlarının önlenmesine yardımcı olur, ancak gecikmeyi önemli ölçüde artırabilir</value>
</data>
<data name="Profile_General_AutoScale_Disabled.Content" xml:space="preserve">
<value>Devre dışı</value>
</data>
<data name="Profile_General_AutoScale_Fullscreen.Content" xml:space="preserve">
<value>Tam ekran ölçeklendirme</value>
</data>
<data name="Profile_General_AutoScale_Windowed.Content" xml:space="preserve">
<value>Pencereli ölçeklendirme</value>
</data>
<data name="Profile_General_Multimonitor.Description" xml:space="preserve">
<value>Sadece tam ekran ölçeklendirme için geçerlidir</value>
</data>
<data name="Home_TouchSupport_Warn.Title" xml:space="preserve">
<value>Araç çubuğu dokunmatik girişle uyumlu değildir.</value>
</data>
<data name="Overlay_Toolbar_Close_Description" xml:space="preserve">
<value>Araç çubuğunu kapatmak için sağ tıklayın</value>
</data>
<data name="Overlay_Toolbar_SwitchToFullscreen" xml:space="preserve">
<value>Tam Ekran Ölçeklendirmeye Geç</value>
</data>
<data name="Overlay_Toolbar_SwitchToWindowed" xml:space="preserve">
<value>Pencereli Ölçeklendirmeye Geç</value>
</data>
<data name="Home_Toolbar_InitialState_Fullscreen.Header" xml:space="preserve">
<value>Tam ekran ölçeklendirme</value>
</data>
<data name="Home_Toolbar_InitialState_Windowed.Header" xml:space="preserve">
<value>Pencereli ölçeklendirme</value>
</data>
<data name="Message_ExportScalingModesFailed" xml:space="preserve">
<value>Ölçeklendirme modları dışa aktarılamadı.</value>
</data>
<data name="Message_ImportScalingModesFailed" xml:space="preserve">
<value>Ölçeklendirme modları içe aktarılamadı.</value>
</data>
<data name="Home_Advanced_DeveloperOptions_LocateLogs.Header" xml:space="preserve">
<value>Günlük dosyalarının bulunduğu konumu aç</value>
</data>
<data name="Message_WindowedDesktopDuplication" xml:space="preserve">
<value>Masaüstü Yansıtma yakalama özelliğinde pencereli ölçeklendirme desteklenmemektedir.</value>
</data>
<data name="Profile_General_DesktopDuplicationWarning.Title" xml:space="preserve">
<value>Bu yakalama yöntemi, pencereli ölçeklendirmeyle uyumlu değildir.</value>
</data>
<data name="Settings_Launch_RunAtStartup.Description" xml:space="preserve">
<value>"Uygulamayı sistem tepsisinde göster" seçeneği etkinleştirilmişse ana pencere görünmez</value>
</data>
<data name="Home_Activation_Timer_Description" xml:space="preserve">
<value>Ön plandaki pencereyi {} saniye sonra yeniden boyutlandır</value>
</data>
<data name="Home_Activation_Timer_Start" xml:space="preserve">
<value>Başlat</value>
</data>
<data name="NotifyIcon_Timer_Fullscreen" xml:space="preserve">
<value>{} saniye sonra ölçekle (Tam ekran)</value>
</data>
<data name="NotifyIcon_Timer_Windowed" xml:space="preserve">
<value>{} saniye sonra ölçeklendir (Pencereli)</value>
</data>
<data name="Overlay_Toolbar_Minimize" xml:space="preserve">
<value>Küçült</value>
</data>
<data name="Profile_Cursor_AutoHide.Header" xml:space="preserve">
<value>Hareketsizken imleci otomatik olarak gizle</value>
</data>
<data name="Profile_Cursor_AutoHide_Delay.Header" xml:space="preserve">
<value>Gecikmeyi saniye cinsinden gizle</value>
</data>
<data name="Profile_Advanced_DestAlignment.Description" xml:space="preserve">
<value>Yalnızca tam ekran ölçeklendirme için geçerlidir</value>
</data>
<data name="Profile_Advanced_DestAlignment.Header" xml:space="preserve">
<value>Çıktı hizalaması</value>
</data>
<data name="Profile_Advanced_DestAlignment_BottomCenter.Content" xml:space="preserve">
<value>Alt orta</value>
</data>
<data name="Profile_Advanced_DestAlignment_BottomLeft.Content" xml:space="preserve">
<value>Sol alt</value>
</data>
<data name="Profile_Advanced_DestAlignment_BottomRight.Content" xml:space="preserve">
<value>Sağ alt</value>
</data>
<data name="Profile_Advanced_DestAlignment_Center.Content" xml:space="preserve">
<value>Merkez</value>
</data>
<data name="Profile_Advanced_DestAlignment_Left.Content" xml:space="preserve">
<value>Sol</value>
</data>
<data name="Profile_Advanced_DestAlignment_Right.Content" xml:space="preserve">
<value>Sağ</value>
</data>
<data name="Profile_Advanced_DestAlignment_TopCenter.Content" xml:space="preserve">
<value>Üst orta</value>
</data>
<data name="Profile_Advanced_DestAlignment_TopLeft.Content" xml:space="preserve">
<value>Sol üst</value>
</data>
<data name="Profile_Advanced_DestAlignment_TopRight.Content" xml:space="preserve">
<value>Sağ üst</value>
</data>
<data name="Home_Advanced_DeveloperOptions_DisableTopmost.Content" xml:space="preserve">
<value>"Her zaman üstte" seçeneğini devre dışı bırak</value>
</data>
</root> </root>

View file

@ -169,7 +169,7 @@
<value>Thử lại</value> <value>Thử lại</value>
</data> </data>
<data name="About_Version_UpdateCard_Title" xml:space="preserve"> <data name="About_Version_UpdateCard_Title" xml:space="preserve">
<value>Đã có bản cập nhật {} </value> <value>Đã có bản cập nhật {}</value>
</data> </data>
<data name="About_Version_UpdateSettings.Header" xml:space="preserve"> <data name="About_Version_UpdateSettings.Header" xml:space="preserve">
<value>Cài đặt cập nhật</value> <value>Cài đặt cập nhật</value>
@ -302,7 +302,7 @@
<value>Mở khóa</value> <value>Mở khóa</value>
</data> </data>
<data name="Overlay_Profiler" xml:space="preserve"> <data name="Overlay_Profiler" xml:space="preserve">
<value>Profiler</value> <value>Hồ sơ</value>
</data> </data>
<data name="Overlay_Profiler_CaptureMethod" xml:space="preserve"> <data name="Overlay_Profiler_CaptureMethod" xml:space="preserve">
<value>Phương pháp lấy cửa sổ</value> <value>Phương pháp lấy cửa sổ</value>
@ -335,13 +335,13 @@
<value>Thay đổi tốc độ con trỏ khi scale</value> <value>Thay đổi tốc độ con trỏ khi scale</value>
</data> </data>
<data name="Profile_Cursor_DrawCursor_Interpolation.Header" xml:space="preserve"> <data name="Profile_Cursor_DrawCursor_Interpolation.Header" xml:space="preserve">
<value>Thuật toán </value> <value>Thuật toán</value>
</data> </data>
<data name="Profile_Cursor_DrawCursor_Interpolation_Bilinear.Content" xml:space="preserve"> <data name="Profile_Cursor_DrawCursor_Interpolation_Bilinear.Content" xml:space="preserve">
<value>Bilinear</value> <value>Song tuyến tính</value>
</data> </data>
<data name="Profile_Cursor_DrawCursor_Interpolation_NearestNeighbor.Content" xml:space="preserve"> <data name="Profile_Cursor_DrawCursor_Interpolation_NearestNeighbor.Content" xml:space="preserve">
<value>Nearest-neighbor</value> <value>Thuật toán nội suy ảnh đơn giản nhất</value>
</data> </data>
<data name="Profile_Cursor_DrawCursor_ScaleFactor.Header" xml:space="preserve"> <data name="Profile_Cursor_DrawCursor_ScaleFactor.Header" xml:space="preserve">
<value>Mức độ Scale</value> <value>Mức độ Scale</value>
@ -551,10 +551,10 @@
<value>Đổi tên</value> <value>Đổi tên</value>
</data> </data>
<data name="ScalingModes_Scale.[using:Windows.UI.Xaml.Controls]ToolTipService.ToolTip" xml:space="preserve"> <data name="ScalingModes_Scale.[using:Windows.UI.Xaml.Controls]ToolTipService.ToolTip" xml:space="preserve">
<value>Scale</value> <value>Tỉ lệ</value>
</data> </data>
<data name="ScalingModes_ScaleFlyout_HeightFactor.Text" xml:space="preserve"> <data name="ScalingModes_ScaleFlyout_HeightFactor.Text" xml:space="preserve">
<value>Chiều cao (theo tỷ lệ scale)</value> <value>Chiều cao (hệ số tỷ lệ)</value>
</data> </data>
<data name="ScalingModes_ScaleFlyout_HeightPixels.Text" xml:space="preserve"> <data name="ScalingModes_ScaleFlyout_HeightPixels.Text" xml:space="preserve">
<value>Chiều cao (theo pixel)</value> <value>Chiều cao (theo pixel)</value>
@ -587,7 +587,7 @@
<value>Giữ tỷ lệ hình ảnh sau khi làm đầy màn hình</value> <value>Giữ tỷ lệ hình ảnh sau khi làm đầy màn hình</value>
</data> </data>
<data name="ScalingModes_ScaleFlyout_WidthFactor.Text" xml:space="preserve"> <data name="ScalingModes_ScaleFlyout_WidthFactor.Text" xml:space="preserve">
<value>Chiều rông (theo tỷ lệ)</value> <value>Chiều rng (theo tỷ lệ)</value>
</data> </data>
<data name="ScalingModes_ScaleFlyout_WidthPixels.Text" xml:space="preserve"> <data name="ScalingModes_ScaleFlyout_WidthPixels.Text" xml:space="preserve">
<value>Chiều rộng (theo pixel)</value> <value>Chiều rộng (theo pixel)</value>
@ -701,7 +701,7 @@
<value>Lưu</value> <value>Lưu</value>
</data> </data>
<data name="ShortcutDialog_Tip.Text" xml:space="preserve"> <data name="ShortcutDialog_Tip.Text" xml:space="preserve">
<value>Chỉ các phím tắt sử dụng phim Windows, Ctrl, Alt và Shift là hợp lệ</value> <value>Chỉ các phím tắt sử dụng phim Windows, Ctrl, Alt và Shift là hợp lệ.</value>
</data> </data>
<data name="ToggleSwitch.OffContent" xml:space="preserve"> <data name="ToggleSwitch.OffContent" xml:space="preserve">
<value>Tắt</value> <value>Tắt</value>
@ -802,4 +802,256 @@
<data name="Home_Advanced_MinFrameRate.Header" xml:space="preserve"> <data name="Home_Advanced_MinFrameRate.Header" xml:space="preserve">
<value>Tốc độ khung hình tối thiểu</value> <value>Tốc độ khung hình tối thiểu</value>
</data> </data>
<data name="Profile_Cursor_AutoHide_Delay.Header" xml:space="preserve">
<value>Ẩn độ trễ tính bằng giây</value>
</data>
<data name="Profile_Advanced_DestAlignment.Description" xml:space="preserve">
<value>Chỉ áp dụng cho tỷ lệ toàn màn hình</value>
</data>
<data name="Profile_Advanced_DestAlignment.Header" xml:space="preserve">
<value>Căn chỉnh đầu ra</value>
</data>
<data name="Profile_Advanced_DestAlignment_BottomCenter.Content" xml:space="preserve">
<value>Trung tâm phía dưới</value>
</data>
<data name="Profile_Advanced_DestAlignment_BottomLeft.Content" xml:space="preserve">
<value>Dưới cùng bên trái</value>
</data>
<data name="Profile_Advanced_DestAlignment_BottomRight.Content" xml:space="preserve">
<value>Dưới cùng bên phải</value>
</data>
<data name="Profile_Advanced_DestAlignment_Center.Content" xml:space="preserve">
<value>Ở giữa</value>
</data>
<data name="Profile_Advanced_DestAlignment_Left.Content" xml:space="preserve">
<value>Bên trái</value>
</data>
<data name="Profile_Advanced_DestAlignment_Right.Content" xml:space="preserve">
<value>Bên phải</value>
</data>
<data name="Profile_Advanced_DestAlignment_TopCenter.Content" xml:space="preserve">
<value>Trung tâm ở giữa</value>
</data>
<data name="Profile_Advanced_DestAlignment_TopLeft.Content" xml:space="preserve">
<value>Trung tâm bên trái</value>
</data>
<data name="Profile_Advanced_DestAlignment_TopRight.Content" xml:space="preserve">
<value>Trung tâm bên phải</value>
</data>
<data name="Home_Advanced_DeveloperOptions_DisableTopmost.Content" xml:space="preserve">
<value>Tắt chế độ luôn ở trên cùng</value>
</data>
<data name="Dialog_SetlectScreenshotSaveDirectory_Title" xml:space="preserve">
<value>Chọn thư mục để lưu ảnh chụp màn hình</value>
</data>
<data name="Message_ScreenshotSaved" xml:space="preserve">
<value>Ảnh chụp màn hình được lưu dưới dạng {}</value>
</data>
<data name="Message_ScreenshotFailed" xml:space="preserve">
<value>Ảnh chụp màn hình không thành công.</value>
</data>
<data name="Overlay_Toolbar_TakeScreenshot_Description" xml:space="preserve">
<value>Nhấp chuột phải để xuất kết quả trung gian</value>
</data>
<data name="Overlay_Toolbar_TakeScreenshot_PopupTitle" xml:space="preserve">
<value>Xuất kết quả trung gian</value>
</data>
<data name="Profile_WindowedScaling.Header" xml:space="preserve">
<value>Tỷ lệ cửa sổ</value>
</data>
<data name="Profile_WindowedScaling_InitialScaleFactor.Header" xml:space="preserve">
<value>Hệ số tỷ lệ ban đầu</value>
</data>
<data name="Profile_WindowedScaling_InitialScaleFactor_Auto.Content" xml:space="preserve">
<value>Tự động</value>
</data>
<data name="Profile_WindowedScaling_InitialScaleFactor_Custom.Content" xml:space="preserve">
<value>Tùy chỉnh</value>
</data>
<data name="Profile_Advanced_DisableDirectFlip.Description" xml:space="preserve">
<value>Giúp tránh một số vấn đề về khả năng tương thích nhưng có thể làm tăng đáng kể độ trễ</value>
</data>
<data name="Profile_General_AutoScale_Disabled.Content" xml:space="preserve">
<value>Tắt</value>
</data>
<data name="Profile_General_AutoScale_Fullscreen.Content" xml:space="preserve">
<value>Tỷ lệ toàn màn hình</value>
</data>
<data name="Profile_General_AutoScale_Windowed.Content" xml:space="preserve">
<value>Tỷ lệ cửa sổ</value>
</data>
<data name="Profile_General_Multimonitor.Description" xml:space="preserve">
<value>Chỉ áp dụng cho tỷ lệ toàn màn hình</value>
</data>
<data name="Home_TouchSupport_Warn.Title" xml:space="preserve">
<value>Thanh công cụ không tương thích với đầu vào cảm ứng.</value>
</data>
<data name="Overlay_Toolbar_Close_Description" xml:space="preserve">
<value>Nhấp chuột phải để đóng thanh công cụ</value>
</data>
<data name="Overlay_Toolbar_SwitchToFullscreen" xml:space="preserve">
<value>Chuyển sang chế độ toàn màn hình</value>
</data>
<data name="Overlay_Toolbar_SwitchToWindowed" xml:space="preserve">
<value>Chuyển sang chế độ cửa sổ</value>
</data>
<data name="Home_Toolbar_InitialState_Fullscreen.Header" xml:space="preserve">
<value>Tỷ lệ toàn màn hình</value>
</data>
<data name="Home_Toolbar_InitialState_Windowed.Header" xml:space="preserve">
<value>Tỷ lệ cửa sổ</value>
</data>
<data name="Message_ExportScalingModesFailed" xml:space="preserve">
<value>Không xuất được chế độ tỷ lệ.</value>
</data>
<data name="Message_ImportScalingModesFailed" xml:space="preserve">
<value>Không nhập được chế độ tỷ lệ.</value>
</data>
<data name="Home_Advanced_DeveloperOptions_LocateLogs.Header" xml:space="preserve">
<value>Mở vị trí logs</value>
</data>
<data name="Message_WindowedDesktopDuplication" xml:space="preserve">
<value>Tính năng chụp Desktop Duplication không hỗ trợ tỷ lệ cửa sổ.</value>
</data>
<data name="Profile_General_DesktopDuplicationWarning.Title" xml:space="preserve">
<value>Phương pháp chụp này không tương thích với chế độ chia tỷ lệ theo cửa sổ.</value>
</data>
<data name="Settings_Launch_RunAtStartup.Description" xml:space="preserve">
<value>Cửa sổ chính sẽ không xuất hiện nếu "Hiển thị ứng dụng trên khay hệ thống" được bật</value>
</data>
<data name="Home_Activation_Timer_Description" xml:space="preserve">
<value>Thu nhỏ cửa sổ nền trước sau {}s</value>
</data>
<data name="Home_Activation_Timer_Start" xml:space="preserve">
<value>Bắt đầu</value>
</data>
<data name="NotifyIcon_Timer_Fullscreen" xml:space="preserve">
<value>Tỷ lệ sau {} giây (Toàn màn hình)</value>
</data>
<data name="NotifyIcon_Timer_Windowed" xml:space="preserve">
<value>Tỷ lệ sau {} giây (Có cửa sổ)</value>
</data>
<data name="Overlay_Toolbar_Minimize" xml:space="preserve">
<value>Thu nhỏ</value>
</data>
<data name="Profile_Cursor_AutoHide.Header" xml:space="preserve">
<value>Tự động ẩn con trỏ khi nhàn rỗi</value>
</data>
<data name="Profile_General_3DGameMode.Description" xml:space="preserve">
<value>Cho phép tối ưu hóa cho trò chơi 3D, nhưng không tương thích với thanh công cụ và tỷ lệ cửa sổ</value>
</data>
<data name="Home_Toolbar_ScreenshotSaveDirectory.Header" xml:space="preserve">
<value>Thư mục lưu ảnh chụp màn hình</value>
</data>
<data name="Home_Toolbar_ScreenshotSaveDirectory_Change.Content" xml:space="preserve">
<value>Thay đổi</value>
</data>
<data name="Home_Activation_WindowedScaling.Header" xml:space="preserve">
<value>Phím tắt mở rộng cửa sổ</value>
</data>
<data name="Home_Activation_WindowedScaling_ShortcutControl.Title" xml:space="preserve">
<value>Phím tắt mở rộng cửa sổ</value>
</data>
<data name="Home_Advanced_AllowScalingMaximized.Description" xml:space="preserve">
<value>Chỉ áp dụng cho tỷ lệ toàn màn hình</value>
</data>
<data name="Home_Toolbar.Description" xml:space="preserve">
<value>Thanh công cụ xuất hiện ở đầu cửa sổ đã thu nhỏ, cung cấp các tính năng như hiển thị FPS và chụp ảnh màn hình. Ở chế độ cửa sổ, thanh công cụ cũng cho phép kéo cửa sổ đã thu nhỏ.</value>
</data>
<data name="Home_Toolbar.Header" xml:space="preserve">
<value>Thanh công cụ</value>
</data>
<data name="Home_Toolbar_InitialState.Header" xml:space="preserve">
<value>Trạng thái thanh công cụ ban đầu</value>
</data>
<data name="Home_Toolbar_InitialState_AlwaysShow.Content" xml:space="preserve">
<value>Luôn luôn hiển thị</value>
</data>
<data name="Home_Toolbar_InitialState_AutoHide.Content" xml:space="preserve">
<value>Tự động ẩn</value>
</data>
<data name="Home_Toolbar_InitialState_Off.Content" xml:space="preserve">
<value>Tắt</value>
</data>
<data name="Home_Toolbar_StateToggle.Header" xml:space="preserve">
<value>Phím tắt chuyển đổi trạng thái thanh công cụ</value>
</data>
<data name="Home_Toolbar_StateToggle_ShortcutControl.Title" xml:space="preserve">
<value>Phím tắt chuyển đổi trạng thái thanh công cụ</value>
</data>
<data name="Message_ToolbarIn3DGameMode" xml:space="preserve">
<value>Thanh công cụ không được hỗ trợ ở chế độ trò chơi 3D.</value>
</data>
<data name="Message_ToolbarNewState" xml:space="preserve">
<value>Thanh công cụ: {}</value>
</data>
<data name="Overlay_Toolbar_Close" xml:space="preserve">
<value>Dừng mở rộng quy mô</value>
</data>
<data name="Overlay_Toolbar_Demo" xml:space="preserve">
<value>Cửa sổ demo ImGui</value>
</data>
<data name="Overlay_Toolbar_Pin" xml:space="preserve">
<value>Ghim thanh công cụ</value>
</data>
<data name="Overlay_Toolbar_TakeScreenshot" xml:space="preserve">
<value>Chụp ảnh màn hình</value>
</data>
<data name="Message_Windowed3DGameMode" xml:space="preserve">
<value>Chế độ thu phóng theo cửa sổ không được hỗ trợ ở chế độ trò chơi 3D.</value>
</data>
<data name="Home_Activation.Description" xml:space="preserve">
<value>Nhấn phím tắt để thay đổi hoặc dừng thay đổi kích thước cửa sổ nền trước.</value>
</data>
<data name="Home_Activation_FullscreenScaling.Header" xml:space="preserve">
<value>Phím tắt thay đổi tỷ lệ toàn màn hình</value>
</data>
<data name="Home_Activation_FullscreenScaling_ShortcutControl.Title" xml:space="preserve">
<value>Phím tắt thay đổi tỷ lệ toàn màn hình</value>
</data>
<data name="Home_Advanced_DeveloperOptions_BenchmarkMode.Content" xml:space="preserve">
<value>Chế độ chuẩn</value>
</data>
<data name="Root_NewProfileFlyout_NameContextFlyout_AppName" xml:space="preserve">
<value>Điền tên ứng dụng</value>
</data>
<data name="Root_NewProfileFlyout_NameContextFlyout_ProcessName" xml:space="preserve">
<value>Điền tên quy trình</value>
</data>
<data name="Root_NewProfileFlyout_NameContextFlyout_WindowTitle" xml:space="preserve">
<value>Điền tiêu đề cửa sổ</value>
</data>
<data name="TextMenuFlyout_Copy" xml:space="preserve">
<value>Sao chép</value>
</data>
<data name="TextMenuFlyout_Cut" xml:space="preserve">
<value>Cắt</value>
</data>
<data name="TextMenuFlyout_Paste" xml:space="preserve">
<value>Dán</value>
</data>
<data name="TextMenuFlyout_Redo" xml:space="preserve">
<value>Làm lại</value>
</data>
<data name="TextMenuFlyout_SelectAll" xml:space="preserve">
<value>Chọn hết</value>
</data>
<data name="TextMenuFlyout_Undo" xml:space="preserve">
<value>Hoàn tác</value>
</data>
<data name="Message_BannedInWindowedMode" xml:space="preserve">
<value>Không hỗ trợ tính năng thu nhỏ cửa sổ này.</value>
</data>
<data name="Message_InvalidCropping" xml:space="preserve">
<value>Không áp dụng được chế độ cắt tùy chỉnh.</value>
</data>
<data name="Home_TouchSupport.Description" xml:space="preserve">
<value>Do hạn chế về bảo mật hệ thống, Magpie yêu cầu quyền UIAccess để hỗ trợ nhập liệu cảm ứng.</value>
</data>
<data name="Home_Advanced_DeveloperOptions_DisableFP16.Content" xml:space="preserve">
<value>Vô hiệu hóa việc sử dụng FP16 trong trình đổ bóng</value>
</data>
<data name="Overlay_Toolbar_Profiler" xml:space="preserve">
<value>Cửa sổ Profiler</value>
</data>
</root> </root>

View file

@ -1018,4 +1018,40 @@
<data name="Profile_Cursor_AutoHide_Delay.Header" xml:space="preserve"> <data name="Profile_Cursor_AutoHide_Delay.Header" xml:space="preserve">
<value>隐藏延迟(秒)</value> <value>隐藏延迟(秒)</value>
</data> </data>
<data name="Profile_Advanced_DestAlignment.Description" xml:space="preserve">
<value>仅适用于全屏模式缩放</value>
</data>
<data name="Profile_Advanced_DestAlignment.Header" xml:space="preserve">
<value>输出画面位置</value>
</data>
<data name="Profile_Advanced_DestAlignment_BottomCenter.Content" xml:space="preserve">
<value>底部居中</value>
</data>
<data name="Profile_Advanced_DestAlignment_BottomLeft.Content" xml:space="preserve">
<value>左下角</value>
</data>
<data name="Profile_Advanced_DestAlignment_BottomRight.Content" xml:space="preserve">
<value>右下角</value>
</data>
<data name="Profile_Advanced_DestAlignment_Center.Content" xml:space="preserve">
<value>居中</value>
</data>
<data name="Profile_Advanced_DestAlignment_Left.Content" xml:space="preserve">
<value>左对齐</value>
</data>
<data name="Profile_Advanced_DestAlignment_Right.Content" xml:space="preserve">
<value>右对齐</value>
</data>
<data name="Profile_Advanced_DestAlignment_TopCenter.Content" xml:space="preserve">
<value>顶部居中</value>
</data>
<data name="Profile_Advanced_DestAlignment_TopLeft.Content" xml:space="preserve">
<value>左上角</value>
</data>
<data name="Profile_Advanced_DestAlignment_TopRight.Content" xml:space="preserve">
<value>右上角</value>
</data>
<data name="Home_Advanced_DeveloperOptions_DisableTopmost.Content" xml:space="preserve">
<value>禁用缩放窗口置顶</value>
</data>
</root> </root>

View file

@ -60,45 +60,45 @@
: and then encoded with base64 encoding. : and then encoded with base64 encoding.
--> -->
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root"> <xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace"></xsd:import> <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true"> <xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType> <xsd:complexType>
<xsd:choice maxOccurs="unbounded"> <xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata"> <xsd:element name="metadata">
<xsd:complexType> <xsd:complexType>
<xsd:sequence> <xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0"></xsd:element> <xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence> </xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string"></xsd:attribute> <xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string"></xsd:attribute> <xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string"></xsd:attribute> <xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space"></xsd:attribute> <xsd:attribute ref="xml:space" />
</xsd:complexType> </xsd:complexType>
</xsd:element> </xsd:element>
<xsd:element name="assembly"> <xsd:element name="assembly">
<xsd:complexType> <xsd:complexType>
<xsd:attribute name="alias" type="xsd:string"></xsd:attribute> <xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string"></xsd:attribute> <xsd:attribute name="name" type="xsd:string" />
</xsd:complexType> </xsd:complexType>
</xsd:element> </xsd:element>
<xsd:element name="data"> <xsd:element name="data">
<xsd:complexType> <xsd:complexType>
<xsd:sequence> <xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"></xsd:element> <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2"></xsd:element> <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence> </xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1"></xsd:attribute> <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3"></xsd:attribute> <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4"></xsd:attribute> <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space"></xsd:attribute> <xsd:attribute ref="xml:space" />
</xsd:complexType> </xsd:complexType>
</xsd:element> </xsd:element>
<xsd:element name="resheader"> <xsd:element name="resheader">
<xsd:complexType> <xsd:complexType>
<xsd:sequence> <xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"></xsd:element> <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence> </xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required"></xsd:attribute> <xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType> </xsd:complexType>
</xsd:element> </xsd:element>
</xsd:choice> </xsd:choice>
@ -1018,4 +1018,40 @@
<data name="Profile_Cursor_AutoHide_Delay.Header" xml:space="preserve"> <data name="Profile_Cursor_AutoHide_Delay.Header" xml:space="preserve">
<value>隱藏倒數(秒)</value> <value>隱藏倒數(秒)</value>
</data> </data>
<data name="Profile_Advanced_DestAlignment.Description" xml:space="preserve">
<value>僅適用於全螢幕模式縮放</value>
</data>
<data name="Profile_Advanced_DestAlignment.Header" xml:space="preserve">
<value>輸出畫面位置</value>
</data>
<data name="Profile_Advanced_DestAlignment_BottomCenter.Content" xml:space="preserve">
<value>底部置中</value>
</data>
<data name="Profile_Advanced_DestAlignment_BottomLeft.Content" xml:space="preserve">
<value>左下角</value>
</data>
<data name="Profile_Advanced_DestAlignment_BottomRight.Content" xml:space="preserve">
<value>右下角</value>
</data>
<data name="Profile_Advanced_DestAlignment_Center.Content" xml:space="preserve">
<value>置中對齊</value>
</data>
<data name="Profile_Advanced_DestAlignment_Left.Content" xml:space="preserve">
<value>向左對齊</value>
</data>
<data name="Profile_Advanced_DestAlignment_Right.Content" xml:space="preserve">
<value>向右對齊</value>
</data>
<data name="Profile_Advanced_DestAlignment_TopCenter.Content" xml:space="preserve">
<value>頂部置中</value>
</data>
<data name="Profile_Advanced_DestAlignment_TopLeft.Content" xml:space="preserve">
<value>左上角</value>
</data>
<data name="Profile_Advanced_DestAlignment_TopRight.Content" xml:space="preserve">
<value>右上角</value>
</data>
<data name="Home_Advanced_DeveloperOptions_DisableTopmost.Content" xml:space="preserve">
<value>停用縮放視窗置頂</value>
</data>
</root> </root>

View file

@ -200,7 +200,7 @@ void RootPage::NavigationView_DisplayModeChanged(MUXC::NavigationView const& nv,
nv.IsPaneToggleButtonVisible(!isExpanded); nv.IsPaneToggleButtonVisible(!isExpanded);
if (isExpanded) { if (isExpanded) {
// 延迟设置 IsPaneOpen 才能起作用 // 延迟设置 IsPaneOpen 才能起作用
Dispatcher().RunAsync(CoreDispatcherPriority::Low, [nv(MUXC::NavigationView(nv))]() { App::Get().Dispatcher().TryEnqueue(DispatcherQueuePriority::Low, [nv(MUXC::NavigationView(nv))]() {
nv.IsPaneOpen(true); nv.IsPaneOpen(true);
}); });
} }
@ -219,7 +219,7 @@ void RootPage::NavigationView_ItemInvoked(MUXC::NavigationView const&, MUXC::Nav
_newProfileViewModel->PrepareForOpen(); _newProfileViewModel->PrepareForOpen();
// 同步调用 ShowAt 有时会失败 // 同步调用 ShowAt 有时会失败
App::Get().Dispatcher().RunAsync(CoreDispatcherPriority::Normal, [that(get_strong())]() { App::Get().Dispatcher().TryEnqueue([that(get_strong())]() {
that->NewProfileFlyout().ShowAt(that->NewProfileNavigationViewItem()); that->NewProfileFlyout().ShowAt(that->NewProfileNavigationViewItem());
}); });
} }

View file

@ -217,7 +217,7 @@ fire_and_forget ScalingModesViewModel::_AddScalingModes(bool isInitialExpanded)
void ScalingModesViewModel::_ScalingModesService_Added(EffectAddedWay way) { void ScalingModesViewModel::_ScalingModesService_Added(EffectAddedWay way) {
// 不支持在事件回调中修改事件本身,因此延迟执行 // 不支持在事件回调中修改事件本身,因此延迟执行
App::Get().Dispatcher().RunAsync(CoreDispatcherPriority::Normal, [this, way]() { App::Get().Dispatcher().TryEnqueue([this, way]() {
_AddScalingModes(way == EffectAddedWay::Add); _AddScalingModes(way == EffectAddedWay::Add);
}); });
} }

View file

@ -16,7 +16,6 @@
using namespace winrt::Magpie::implementation; using namespace winrt::Magpie::implementation;
using namespace winrt; using namespace winrt;
using namespace Windows::System::Threading;
using winrt::Magpie::ShortcutAction; using winrt::Magpie::ShortcutAction;
@ -34,19 +33,22 @@ void ScalingService::Initialize() {
_scalingRuntime->StateChanged( _scalingRuntime->StateChanged(
std::bind_front(&ScalingService::_ScalingRuntime_StateChanged, this)); std::bind_front(&ScalingService::_ScalingRuntime_StateChanged, this));
const DispatcherQueue& dispatcher = App::Get().Dispatcher();
_countDownTimer = dispatcher.CreateTimer();
_countDownTimer.Interval(25ms); _countDownTimer.Interval(25ms);
_countDownTimer.Tick({ this, &ScalingService::_CountDownTimer_Tick }); _countDownTimer.Tick({ this, &ScalingService::_CountDownTimer_Tick });
_checkForegroundTimer = ThreadPoolTimer::CreatePeriodicTimer( _checkForegroundTimer = dispatcher.CreateTimer();
{ this, &ScalingService::_CheckForegroundTimer_Tick }, _checkForegroundTimer.Interval(50ms);
50ms _checkForegroundTimer.Tick({ this, &ScalingService::_CheckForegroundTimer_Tick });
); _checkForegroundTimer.Start();
_shortcutActivatedRevoker = ShortcutService::Get().ShortcutActivated( _shortcutActivatedRevoker = ShortcutService::Get().ShortcutActivated(
auto_revoke, std::bind_front(&ScalingService::_ShortcutService_ShortcutPressed, this)); auto_revoke, std::bind_front(&ScalingService::_ShortcutService_ShortcutPressed, this));
// 立即检查前台窗口 // 立即检查前台窗口
_CheckForegroundTimer_Tick(nullptr); _CheckForegroundTimer_Tick(nullptr, nullptr);
} }
void ScalingService::Uninitialize() { void ScalingService::Uninitialize() {
@ -54,10 +56,7 @@ void ScalingService::Uninitialize() {
return; return;
} }
if (_checkForegroundTimer) { _checkForegroundTimer.Stop();
_checkForegroundTimer.Cancel();
}
_countDownTimer.Stop(); _countDownTimer.Stop();
_scalingRuntime.reset(); _scalingRuntime.reset();
@ -103,7 +102,7 @@ bool ScalingService::IsScaling() const noexcept {
void ScalingService::CheckForeground() { void ScalingService::CheckForeground() {
_hwndChecked = NULL; _hwndChecked = NULL;
_CheckForegroundTimer_Tick(nullptr); _CheckForegroundTimer_Tick(nullptr, nullptr);
} }
void ScalingService::_ShortcutService_ShortcutPressed(ShortcutAction action) { void ScalingService::_ShortcutService_ShortcutPressed(ShortcutAction action) {
@ -131,12 +130,7 @@ void ScalingService::_ShortcutService_ShortcutPressed(ShortcutAction action) {
} }
} }
void ScalingService::_CountDownTimer_Tick(winrt::IInspectable const&, winrt::IInspectable const&) { void ScalingService::_CountDownTimer_Tick(winrt::DispatcherQueueTimer const&, winrt::IInspectable const&) {
// 以防在 Uninitialize 或取消计时后执行
if (!_scalingRuntime || !IsTimerOn()) {
return;
}
const double timeLeft = SecondsLeft(); const double timeLeft = SecondsLeft();
// 剩余时间在 10 ms 以内计时结束 // 剩余时间在 10 ms 以内计时结束
@ -253,20 +247,10 @@ static bool IsReadyForScaling(HWND hwndFore) noexcept {
return !Win32Helper::IsWindowHung(hwndFore); return !Win32Helper::IsWindowHung(hwndFore);
} }
fire_and_forget ScalingService::_CheckForegroundTimer_Tick(ThreadPoolTimer const& timer) { void ScalingService::_CheckForegroundTimer_Tick(winrt::DispatcherQueueTimer const&, winrt::IInspectable const&) {
if (timer) {
// ThreadPoolTimer 在后台线程触发
co_await App::Get().Dispatcher();
}
// ThreadPoolTimer 是异步的Uninitialize 后仍可能执行
if (!_scalingRuntime) {
co_return;
}
const HWND hwndFore = GetForegroundWindow(); const HWND hwndFore = GetForegroundWindow();
if (!hwndFore || hwndFore == _hwndChecked) { if (!hwndFore || hwndFore == _hwndChecked) {
co_return; return;
} }
if (hwndFore != _hwndCurSrc) { if (hwndFore != _hwndCurSrc) {
@ -276,7 +260,7 @@ fire_and_forget ScalingService::_CheckForegroundTimer_Tick(ThreadPoolTimer const
if (profile && !(_hwndCurSrc && IsPopupWindow(hwndFore, _hwndCurSrc))) { if (profile && !(_hwndCurSrc && IsPopupWindow(hwndFore, _hwndCurSrc))) {
// 如果窗口处于某种中间状态则跳过此次检查 // 如果窗口处于某种中间状态则跳过此次检查
if (!IsReadyForScaling(hwndFore)) { if (!IsReadyForScaling(hwndFore)) {
co_return; return;
} }
// 自动缩放可以终止当前缩放 // 自动缩放可以终止当前缩放
@ -289,7 +273,7 @@ fire_and_forget ScalingService::_CheckForegroundTimer_Tick(ThreadPoolTimer const
} }
void ScalingService::_ScalingRuntime_StateChanged(ScalingState value) { void ScalingService::_ScalingRuntime_StateChanged(ScalingState value) {
App::Get().Dispatcher().RunAsync(CoreDispatcherPriority::Normal, [this, value]() { App::Get().Dispatcher().TryEnqueue([this, value]() {
if (value == ScalingState::Scaling) { if (value == ScalingState::Scaling) {
StopTimer(); StopTimer();
} else if (value == ScalingState::Idle) { } else if (value == ScalingState::Idle) {
@ -378,6 +362,7 @@ ScalingError ScalingService::_StartScaleImpl(HWND hWnd, const Profile& profile,
options.maxFrameRate = profile.maxFrameRate; options.maxFrameRate = profile.maxFrameRate;
} }
options.multiMonitorUsage = profile.multiMonitorUsage; options.multiMonitorUsage = profile.multiMonitorUsage;
options.destAlignment = profile.destAlignment;
options.cursorInterpolationMode = profile.cursorInterpolationMode; options.cursorInterpolationMode = profile.cursorInterpolationMode;
options.flags = profile.scalingFlags; options.flags = profile.scalingFlags;
@ -455,6 +440,7 @@ ScalingError ScalingService::_StartScaleImpl(HWND hWnd, const Profile& profile,
options.IsDeveloperMode(settings.IsDeveloperMode()); options.IsDeveloperMode(settings.IsDeveloperMode());
options.IsDebugMode(settings.IsDebugMode()); options.IsDebugMode(settings.IsDebugMode());
options.IsBenchmarkMode(settings.IsBenchmarkMode()); options.IsBenchmarkMode(settings.IsBenchmarkMode());
options.IsTopmostDisabled(settings.IsTopmostDisabled());
options.IsEffectCacheDisabled(settings.IsEffectCacheDisabled()); options.IsEffectCacheDisabled(settings.IsEffectCacheDisabled());
options.IsFontCacheDisabled(settings.IsFontCacheDisabled()); options.IsFontCacheDisabled(settings.IsFontCacheDisabled());
options.IsSaveEffectSources(settings.IsSaveEffectSources()); options.IsSaveEffectSources(settings.IsSaveEffectSources());
@ -490,8 +476,7 @@ ScalingError ScalingService::_StartScaleImpl(HWND hWnd, const Profile& profile,
options.showError = &ShowError; options.showError = &ShowError;
options.save = [](const ScalingOptions& options, HWND /*hwndScaling*/) noexcept { options.save = [](const ScalingOptions& options, HWND /*hwndScaling*/) noexcept {
App::Get().Dispatcher().RunAsync( App::Get().Dispatcher().TryEnqueue(
CoreDispatcherPriority::Normal,
[overlayOptions(options.overlayOptions)]() { [overlayOptions(options.overlayOptions)]() {
AppSettings::Get().OverlayOptions() = std::move(overlayOptions); AppSettings::Get().OverlayOptions() = std::move(overlayOptions);
AppSettings::Get().SaveAsync(); AppSettings::Get().SaveAsync();

View file

@ -1,8 +1,6 @@
#pragma once #pragma once
#include "Event.h" #include "Event.h"
#include "ScalingRuntime.h" #include "ScalingRuntime.h"
#include <winrt/Magpie.h>
#include <winrt/Windows.System.Threading.h>
namespace Magpie { namespace Magpie {
class ScalingRuntime; class ScalingRuntime;
@ -57,9 +55,9 @@ private:
void _ShortcutService_ShortcutPressed(winrt::Magpie::ShortcutAction action); void _ShortcutService_ShortcutPressed(winrt::Magpie::ShortcutAction action);
void _CountDownTimer_Tick(winrt::IInspectable const&, winrt::IInspectable const&); void _CountDownTimer_Tick(winrt::DispatcherQueueTimer const&, winrt::IInspectable const&);
winrt::fire_and_forget _CheckForegroundTimer_Tick(winrt::Threading::ThreadPoolTimer const& timer); void _CheckForegroundTimer_Tick(winrt::DispatcherQueueTimer const&, winrt::IInspectable const&);
void _ScalingRuntime_StateChanged(ScalingState value); void _ScalingRuntime_StateChanged(ScalingState value);
@ -71,9 +69,8 @@ private:
std::optional<ScalingRuntime> _scalingRuntime; std::optional<ScalingRuntime> _scalingRuntime;
winrt::DispatcherTimer _countDownTimer; winrt::DispatcherQueueTimer _countDownTimer{ nullptr };
// DispatcherTimer 在不显示主窗口时可能停滞,因此使用 ThreadPoolTimer winrt::DispatcherQueueTimer _checkForegroundTimer{ nullptr };
winrt::Threading::ThreadPoolTimer _checkForegroundTimer{ nullptr };
Event<winrt::Magpie::ShortcutAction>::EventRevoker _shortcutActivatedRevoker; Event<winrt::Magpie::ShortcutAction>::EventRevoker _shortcutActivatedRevoker;

View file

@ -192,6 +192,16 @@ void SettingsCard::OnPointerReleased(PointerRoutedEventArgs const& args) {
_isCursorCaptured = false; _isCursorCaptured = false;
} }
void SettingsCard::OnKeyDown(KeyRoutedEventArgs const& args) {
// XAML Islands 中 ButtonBase 会吞掉空格和回车UWP 却没有这个问题。这里使子树中的 TextBox
// 能正常工作。https://learn.microsoft.com/en-us/windows/apps/develop/input/keyboard-events
// 记录了按钮在 OnKeyDown 中处理空格和回车。
IInspectable focusedElem = FocusManager::GetFocusedElement(XamlRoot());
if (!focusedElem || !focusedElem.try_as<TextBox>()) {
base_type::OnKeyDown(args);
}
}
static bool IsNotEmpty(IInspectable const& value) noexcept { static bool IsNotEmpty(IInspectable const& value) noexcept {
if (!value) { if (!value) {
return false; return false;

View file

@ -48,6 +48,8 @@ struct SettingsCard : SettingsCardT<SettingsCard> {
void OnPointerReleased(Input::PointerRoutedEventArgs const& args); void OnPointerReleased(Input::PointerRoutedEventArgs const& args);
void OnKeyDown(Input::KeyRoutedEventArgs const& args);
private: private:
static DependencyProperty _headerProperty; static DependencyProperty _headerProperty;
static DependencyProperty _descriptionProperty; static DependencyProperty _descriptionProperty;

View file

@ -206,8 +206,7 @@ LRESULT CALLBACK ShortcutService::_LowLevelKeyboardProc(int nCode, WPARAM wParam
that._keyboardHookShortcutActivated = true; that._keyboardHookShortcutActivated = true;
// 延迟执行回调以缩短钩子的处理时间 // 延迟执行回调以缩短钩子的处理时间
App::Get().Dispatcher().RunAsync( App::Get().Dispatcher().TryEnqueue(
CoreDispatcherPriority::Normal,
[action]() { [action]() {
Logger::Get().Info(fmt::format("热键 {} 激活Keyboard Hook", ShortcutHelper::ToString(action))); Logger::Get().Info(fmt::format("热键 {} 激活Keyboard Hook", ShortcutHelper::ToString(action)));
Get()._FireShortcut(action); Get()._FireShortcut(action);

View file

@ -37,8 +37,8 @@ void TextBlockHelper::_OnIsAutoTooltipEnabledChanged(DependencyObject const& sen
TextBlock::TextProperty(), TextBlock::TextProperty(),
[](DependencyObject const& sender, DependencyProperty const&) { [](DependencyObject const& sender, DependencyProperty const&) {
// 等待布局更新 // 等待布局更新
App::Get().Dispatcher().RunAsync( App::Get().Dispatcher().TryEnqueue(
CoreDispatcherPriority::Low, DispatcherQueuePriority::Low,
std::bind_front(&_SetTooltipBasedOnTrimmingState, sender.try_as<TextBlock>(), true) std::bind_front(&_SetTooltipBasedOnTrimmingState, sender.try_as<TextBlock>(), true)
); );
} }

View file

@ -40,11 +40,12 @@ ToastPage::ToastPage(uint64_t hwndToast) : _hwndToast((HWND)hwndToast) {
void ToastPage::InitializeComponent() { void ToastPage::InitializeComponent() {
ToastPageT::InitializeComponent(); ToastPageT::InitializeComponent();
_appThemeChangedRevoker = App::Get().ThemeChanged(auto_revoke, [this](bool) { _appThemeChangedRevoker = App::Get().ThemeChanged(
Dispatcher().TryRunAsync(CoreDispatcherPriority::Normal, [this] { auto_revoke,
_UpdateTheme(); [this, dispatcher(DispatcherQueue::GetForCurrentThread())](bool) {
}); dispatcher.TryEnqueue([this] { _UpdateTheme(); });
}); }
);
_UpdateTheme(); _UpdateTheme();
} }
@ -97,7 +98,7 @@ static void UpdateToastPosition(HWND hwndToast, const RECT& frameRect, bool upda
} }
fire_and_forget ToastPage::ShowMessageOnWindow(std::wstring title, std::wstring message, HWND hwndTarget, bool showLogo) { fire_and_forget ToastPage::ShowMessageOnWindow(std::wstring title, std::wstring message, HWND hwndTarget, bool showLogo) {
CoreDispatcher dispatcher = Dispatcher(); DispatcherQueue dispatcher = DispatcherQueue::GetForCurrentThread();
// !!! HACK !!! // !!! HACK !!!
// 重用 TeachingTip 有一个 bug: 前一个 Toast 正在消失时新的 Toast 不会显示。为了 // 重用 TeachingTip 有一个 bug: 前一个 Toast 正在消失时新的 Toast 不会显示。为了
@ -107,7 +108,7 @@ fire_and_forget ToastPage::ShowMessageOnWindow(std::wstring title, std::wstring
if (oldTeachingTip) { if (oldTeachingTip) {
UnloadObject(oldTeachingTip); UnloadObject(oldTeachingTip);
// 确保卸载完成,防止弹出动画 bug // 确保卸载完成,防止弹出动画 bug
co_await resume_foreground(dispatcher, CoreDispatcherPriority::Low); co_await resume_foreground(dispatcher, DispatcherQueuePriority::Low);
} else { } else {
oldTeachingTip = std::move(_oldTeachingTip); oldTeachingTip = std::move(_oldTeachingTip);
} }
@ -134,12 +135,10 @@ fire_and_forget ToastPage::ShowMessageOnWindow(std::wstring title, std::wstring
} }
if (isTargetTopMost || !isOwned) { if (isTargetTopMost || !isOwned) {
SetWindowPos(_hwndToast, HWND_TOPMOST, 0, 0, 0, 0, SetWindowPos(_hwndToast, HWND_TOPMOST, 0, 0, 0, 0, SWP_NO_ACTIVATE_MOVE_SIZE);
SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);
} }
if (!isTargetTopMost) { if (!isTargetTopMost) {
SetWindowPos(_hwndToast, HWND_NOTOPMOST, 0, 0, 0, 0, SetWindowPos(_hwndToast, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NO_ACTIVATE_MOVE_SIZE);
SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);
} }
// 更改所有者后应更新 Z 轴顺序 // 更改所有者后应更新 Z 轴顺序
@ -160,7 +159,7 @@ fire_and_forget ToastPage::ShowMessageOnWindow(std::wstring title, std::wstring
// !!! HACK !!! // !!! HACK !!!
// 移除关闭按钮和修复弹出动画。必须在模板加载完成后做TeachingTip 没有 Opening 事件,但可以监听 // 移除关闭按钮和修复弹出动画。必须在模板加载完成后做TeachingTip 没有 Opening 事件,但可以监听
// MessageTextBlock 的 LayoutUpdated 事件,它在 TeachingTip 显示前必然会被引发。 // MessageTextBlock 的 LayoutUpdated 事件,它在 TeachingTip 显示前必然会被引发。
MessageTextBlock().LayoutUpdated([this, weak(weak_ref(curTeachingTip))](IInspectable const&, IInspectable const&) { MessageTextBlock().LayoutUpdated([this, weak(weak_ref(curTeachingTip)), dispatcher](IInspectable const&, IInspectable const&) {
auto teachingTip = weak.get(); auto teachingTip = weak.get();
if (!teachingTip) { if (!teachingTip) {
return; return;
@ -185,7 +184,7 @@ fire_and_forget ToastPage::ShowMessageOnWindow(std::wstring title, std::wstring
if (XamlHelper::ContainsControl(popup.Child(), MessageTextBlock())) { if (XamlHelper::ContainsControl(popup.Child(), MessageTextBlock())) {
popup.Visibility(Visibility::Collapsed); popup.Visibility(Visibility::Collapsed);
Dispatcher().RunAsync(CoreDispatcherPriority::Low, [popup]() { dispatcher.TryEnqueue(DispatcherQueuePriority::Low, [popup]() {
popup.Visibility(Visibility::Visible); popup.Visibility(Visibility::Visible);
}); });
@ -204,7 +203,7 @@ fire_and_forget ToastPage::ShowMessageOnWindow(std::wstring title, std::wstring
// 第三个参数用于延长 oldTeachingTip 的生存期,确保关闭动画播放完毕后再析构。 // 第三个参数用于延长 oldTeachingTip 的生存期,确保关闭动画播放完毕后再析构。
// TeachingTip 的显示和隐藏动画总计 500ms显示时长不应少于这个时间。 // TeachingTip 的显示和隐藏动画总计 500ms显示时长不应少于这个时间。
// https://github.com/Blinue/microsoft-ui-xaml/blob/75f7666f5907aad29de1cb2e49405cc06d433fba/dev/TeachingTip/TeachingTip.h#L239-L240 // https://github.com/Blinue/microsoft-ui-xaml/blob/75f7666f5907aad29de1cb2e49405cc06d433fba/dev/TeachingTip/TeachingTip.h#L239-L240
[](CoreDispatcher dispatcher, weak_ref<MUXC::TeachingTip> weakCurTeachingTip, MUXC::TeachingTip) -> fire_and_forget { [](DispatcherQueue dispatcher, weak_ref<MUXC::TeachingTip> weakCurTeachingTip, MUXC::TeachingTip) -> fire_and_forget {
// 显示时长固定 2 秒 // 显示时长固定 2 秒
co_await 2s; co_await 2s;
co_await dispatcher; co_await dispatcher;
@ -219,7 +218,7 @@ fire_and_forget ToastPage::ShowMessageOnWindow(std::wstring title, std::wstring
curTeachingTip.IsOpen(false); curTeachingTip.IsOpen(false);
// 某些特殊情况下关闭会失败(比如被调试器暂停后),应等待一段时间后检查 IsOpen // 某些特殊情况下关闭会失败(比如被调试器暂停后),应等待一段时间后检查 IsOpen
co_await resume_foreground(dispatcher, CoreDispatcherPriority::Low); co_await resume_foreground(dispatcher, DispatcherQueuePriority::Low);
if (!curTeachingTip.IsOpen()) { if (!curTeachingTip.IsOpen()) {
co_return; co_return;
@ -268,11 +267,11 @@ fire_and_forget ToastPage::ShowMessageOnWindow(std::wstring title, std::wstring
// 如果 hwndTarget 位于前台定期将弹窗置顶。SWP_NOOWNERZORDER 可以避免修改 hwndTarget // 如果 hwndTarget 位于前台定期将弹窗置顶。SWP_NOOWNERZORDER 可以避免修改 hwndTarget
// 的 Z 顺序,理论上不需要这个标志,可能是 OS 的 bug。 // 的 Z 顺序,理论上不需要这个标志,可能是 OS 的 bug。
SetWindowPos(_hwndToast, HWND_TOPMOST, 0, 0, 0, 0, SetWindowPos(_hwndToast, HWND_TOPMOST, 0, 0, 0, 0,
SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE | SWP_NOOWNERZORDER); SWP_NO_ACTIVATE_MOVE_SIZE | SWP_NOOWNERZORDER);
} }
if (!isTargetTopMost) { if (!isTargetTopMost) {
SetWindowPos(_hwndToast, HWND_NOTOPMOST, 0, 0, 0, 0, SetWindowPos(_hwndToast, HWND_NOTOPMOST, 0, 0, 0, 0,
SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE | SWP_NOOWNERZORDER); SWP_NO_ACTIVATE_MOVE_SIZE | SWP_NOOWNERZORDER);
} }
// 窗口没有移动则无需更新 // 窗口没有移动则无需更新

View file

@ -42,13 +42,13 @@ void ToastService::Uninitialize() noexcept {
} }
void ToastService::ShowMessageOnWindow(std::wstring_view title, std::wstring_view message, HWND hwndTarget) const noexcept { void ToastService::ShowMessageOnWindow(std::wstring_view title, std::wstring_view message, HWND hwndTarget) const noexcept {
_Dispatcher().RunAsync(CoreDispatcherPriority::Normal, [this, title(std::wstring(title)), message(std::wstring(message)), hwndTarget]() { _Dispatcher().TryEnqueue([this, title(std::wstring(title)), message(std::wstring(message)), hwndTarget]() {
_toastPage->ShowMessageOnWindow(std::move(title), std::move(message), hwndTarget, true); _toastPage->ShowMessageOnWindow(std::move(title), std::move(message), hwndTarget, true);
}); });
} }
void ToastService::ShowMessageInApp(std::wstring_view title, std::wstring_view message) const noexcept { void ToastService::ShowMessageInApp(std::wstring_view title, std::wstring_view message) const noexcept {
_Dispatcher().RunAsync(CoreDispatcherPriority::Normal, [this, title(std::wstring(title)), message(std::wstring(message))]() { _Dispatcher().TryEnqueue([this, title(std::wstring(title)), message(std::wstring(message))]() {
_toastPage->ShowMessageOnWindow(std::move(title), std::move(message), App::Get().MainWindow().Handle(), false); _toastPage->ShowMessageOnWindow(std::move(title), std::move(message), App::Get().MainWindow().Handle(), false);
}); });
} }
@ -85,8 +85,7 @@ void ToastService::_ToastThreadProc() noexcept {
wil::GetModuleInstanceHandle(), wil::GetModuleInstanceHandle(),
nullptr nullptr
); );
SetWindowPos(_hwndToast, NULL, 0, 0, 0, 0, SetWindowPos(_hwndToast, NULL, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NO_ACTIVATE_MOVE_SIZE);
SWP_SHOWWINDOW | SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);
// DesktopWindowXamlSource 在控件之前创建则无需调用 WindowsXamlManager::InitializeForCurrentThread // DesktopWindowXamlSource 在控件之前创建则无需调用 WindowsXamlManager::InitializeForCurrentThread
DesktopWindowXamlSource xamlSource; DesktopWindowXamlSource xamlSource;
@ -102,7 +101,7 @@ void ToastService::_ToastThreadProc() noexcept {
_toastPage = make_self<winrt::Magpie::implementation::ToastPage>((uint64_t)_hwndToast); _toastPage = make_self<winrt::Magpie::implementation::ToastPage>((uint64_t)_hwndToast);
xamlSource.Content(*_toastPage); xamlSource.Content(*_toastPage);
_dispatcher = _toastPage->Dispatcher(); _dispatcher = winrt::DispatcherQueue::GetForCurrentThread();
// 如果主线程正在等待则唤醒主线程 // 如果主线程正在等待则唤醒主线程
_dispatcherInitialized.store(true, std::memory_order_release); _dispatcherInitialized.store(true, std::memory_order_release);
_dispatcherInitialized.notify_one(); _dispatcherInitialized.notify_one();
@ -168,7 +167,7 @@ LRESULT ToastService::_ToastWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM l
return DefWindowProc(hWnd, msg, wParam, lParam); return DefWindowProc(hWnd, msg, wParam, lParam);
} }
const CoreDispatcher& ToastService::_Dispatcher() const noexcept { const DispatcherQueue& ToastService::_Dispatcher() const noexcept {
_dispatcherInitialized.wait(false, std::memory_order_acquire); _dispatcherInitialized.wait(false, std::memory_order_acquire);
return _dispatcher; return _dispatcher;
} }

View file

@ -29,11 +29,11 @@ private:
static LRESULT CALLBACK _ToastWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); static LRESULT CALLBACK _ToastWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
// 确保 _dispatcher 完成初始化 // 确保 _dispatcher 完成初始化
const winrt::CoreDispatcher& _Dispatcher() const noexcept; const winrt::DispatcherQueue& _Dispatcher() const noexcept;
std::thread _toastThread; std::thread _toastThread;
winrt::CoreDispatcher _dispatcher{ nullptr }; winrt::DispatcherQueue _dispatcher{ nullptr };
std::atomic<bool> _dispatcherInitialized = false; std::atomic<bool> _dispatcherInitialized = false;
// 只能在 toast 线程访问 // 只能在 toast 线程访问

View file

@ -25,19 +25,13 @@ using namespace Windows::Web::Http;
namespace Magpie { namespace Magpie {
static constexpr Version MAGPIE_VERSION( static constexpr Version MAGPIE_VERSION(MP_MAJOR_VERSION, MP_MINOR_VERSION, MP_PATCH_VERSION);
#ifdef MP_MAJOR_VERSION
MP_MAJOR_VERSION, MP_MINOR_VERSION, MP_PATCH_VERSION
#else
0, 0, 0
#endif
);
static constexpr uint32_t MD5_HASH_LENGTH = 16; static constexpr uint32_t MD5_HASH_LENGTH = 16;
void UpdateService::Initialize() noexcept { void UpdateService::Initialize() noexcept {
// 只有发布版本能检查更新 // 只有发布版本能检查更新
#ifdef MP_VERSION_TAG #ifdef MP_VERSION_STRING
AppSettings& settings = AppSettings::Get(); AppSettings& settings = AppSettings::Get();
if (settings.IsAutoCheckForUpdates()) { if (settings.IsAutoCheckForUpdates()) {
_StartTimer(); _StartTimer();

View file

@ -55,6 +55,7 @@ protected:
using namespace winrt::Windows::UI::Xaml::Hosting; using namespace winrt::Windows::UI::Xaml::Hosting;
_content = content; _content = content;
_dispatcher = winrt::DispatcherQueue::GetForCurrentThread();
// 初始化 XAML Islands // 初始化 XAML Islands
_xamlSource = DesktopWindowXamlSource(); _xamlSource = DesktopWindowXamlSource();
@ -364,7 +365,7 @@ protected:
PostMessage(hwndDWXS, WM_SIZE, wParam, lParam); PostMessage(hwndDWXS, WM_SIZE, wParam, lParam);
} }
_content->Dispatcher().RunAsync(winrt::CoreDispatcherPriority::Normal, [xamlRoot(_content->XamlRoot())]() { _dispatcher.TryEnqueue([xamlRoot(_content->XamlRoot())]() {
XamlHelper::RepositionXamlPopups(xamlRoot, true); XamlHelper::RepositionXamlPopups(xamlRoot, true);
}); });
} }
@ -511,6 +512,7 @@ private:
winrt::com_ptr<IDesktopWindowXamlSourceNative2> _xamlSourceNative2; winrt::com_ptr<IDesktopWindowXamlSourceNative2> _xamlSourceNative2;
C _content{ nullptr }; C _content{ nullptr };
winrt::DispatcherQueue _dispatcher{ nullptr };
uint32_t _currentDpi = USER_DEFAULT_SCREEN_DPI; uint32_t _currentDpi = USER_DEFAULT_SCREEN_DPI;
uint32_t _nativeTopBorderThickness = 1; uint32_t _nativeTopBorderThickness = 1;

View file

@ -1,6 +1,6 @@
[requires] [requires]
fmt/11.2.0 fmt/12.1.0
spdlog/1.15.3 spdlog/1.17.0
parallel-hashmap/2.0.0 parallel-hashmap/2.0.0
rapidjson/cci.20230929 rapidjson/cci.20230929
kuba-zip/0.3.2 kuba-zip/0.3.2

Some files were not shown because too many files have changed in this diff Show more