Compare commits
457 Commits
3.7.1
...
copilot/fi
Author | SHA1 | Date | |
---|---|---|---|
![]() |
94ec17d62a | ||
![]() |
a5241251d4 | ||
![]() |
14a5bea926 | ||
![]() |
3dbc9fc763 | ||
![]() |
139cb873f2 | ||
![]() |
fd1004e6d3 | ||
![]() |
b0dceffa94 | ||
![]() |
2246c5a361 | ||
![]() |
5a5cce93b4 | ||
![]() |
8d7df24798 | ||
![]() |
3ae4eeb26d | ||
![]() |
da0033b52a | ||
![]() |
2e941f468e | ||
![]() |
fbfd2484df | ||
![]() |
e342cd0851 | ||
![]() |
d90993817d | ||
![]() |
5cedcff912 | ||
![]() |
9fe37520d3 | ||
![]() |
67b5dbf310 | ||
![]() |
efe47ff43b | ||
![]() |
417876edd2 | ||
![]() |
03b1ca557f | ||
![]() |
f39b53a5c6 | ||
![]() |
68cb555bad | ||
![]() |
d88c8ab8de | ||
![]() |
a38b7a450a | ||
![]() |
8ad5f39eab | ||
![]() |
83cfd2a3d8 | ||
![]() |
4840a87858 | ||
![]() |
a4d118e11f | ||
![]() |
79b002c0b3 | ||
![]() |
b26575581a | ||
![]() |
8c95a42a64 | ||
![]() |
55a069046f | ||
![]() |
0714574374 | ||
![]() |
10ce29e836 | ||
![]() |
8d66dfac54 | ||
![]() |
d06abf461e | ||
![]() |
4c4375612e | ||
![]() |
8dcb09cf84 | ||
![]() |
b27ff01eff | ||
![]() |
befdb17718 | ||
![]() |
d60b10a8cf | ||
![]() |
2ee54695e7 | ||
![]() |
4a72e1ed8e | ||
![]() |
0bb6e622f6 | ||
![]() |
345b061a8d | ||
![]() |
67dc0ce10d | ||
![]() |
631fd91219 | ||
![]() |
cf6dd5cdf3 | ||
![]() |
7a11127b09 | ||
![]() |
e035153642 | ||
![]() |
78b695a170 | ||
![]() |
ed4169d6fe | ||
![]() |
0a79d59c79 | ||
![]() |
d6cc984267 | ||
![]() |
484acddba3 | ||
![]() |
18634f15be | ||
![]() |
5869cc6670 | ||
![]() |
09a3cc3ea5 | ||
![]() |
f9586be3ec | ||
![]() |
a6c077fbbb | ||
![]() |
c47d9f3c9b | ||
![]() |
06d9ed2a85 | ||
![]() |
37ed56ff34 | ||
![]() |
87e04dca9d | ||
![]() |
3fd444102d | ||
![]() |
b5773fc721 | ||
![]() |
32ce27e447 | ||
![]() |
95f1c5bca2 | ||
![]() |
f6ca3a62e2 | ||
![]() |
efba55b8d5 | ||
![]() |
4c3bf23e67 | ||
![]() |
007b960019 | ||
![]() |
a14b22d762 | ||
![]() |
3fce8b4f53 | ||
![]() |
5e459e35e5 | ||
![]() |
b3570d1215 | ||
![]() |
eecb56db14 | ||
![]() |
3858e142e2 | ||
![]() |
d7f482511f | ||
![]() |
9cca8c3c0b | ||
![]() |
22e8838ce3 | ||
![]() |
63f516b504 | ||
![]() |
08587186c2 | ||
![]() |
f99a786510 | ||
![]() |
3de93386cc | ||
![]() |
b42b7ce4e8 | ||
![]() |
89571b1431 | ||
![]() |
a7e26519ed | ||
![]() |
c1e6362440 | ||
![]() |
25f7df52bd | ||
![]() |
04247db107 | ||
![]() |
7456cbc3a5 | ||
![]() |
99caca2dfd | ||
![]() |
dc2d722f0a | ||
![]() |
267b37c526 | ||
![]() |
913474f7ad | ||
![]() |
c979ed0254 | ||
![]() |
71904ebac5 | ||
![]() |
a8746dd3ef | ||
![]() |
93be5681d3 | ||
![]() |
2fd3a15071 | ||
![]() |
6e9d86457c | ||
![]() |
1df89d69a9 | ||
![]() |
8850f52f3a | ||
![]() |
cb4aa2e9d9 | ||
![]() |
db3af0580d | ||
![]() |
469f955208 | ||
![]() |
ea077af8a2 | ||
![]() |
33030780ff | ||
![]() |
9319ca7213 | ||
![]() |
b1a2387203 | ||
![]() |
12a6b35c6c | ||
![]() |
1f13aa6678 | ||
![]() |
72c8e567cd | ||
![]() |
fe13f5d45e | ||
![]() |
e76c882d49 | ||
![]() |
667815e360 | ||
![]() |
13bcc4b1d4 | ||
![]() |
fa61b1e68f | ||
![]() |
2750cb75dd | ||
![]() |
f1237aa86f | ||
![]() |
2a94fa155d | ||
![]() |
682801a8bb | ||
![]() |
f9b075dfa3 | ||
![]() |
0a8039d962 | ||
![]() |
0dc8c03446 | ||
![]() |
9cef4d9830 | ||
![]() |
e9306329ee | ||
![]() |
7ca7d2783e | ||
![]() |
98dd96283d | ||
![]() |
21071a62d1 | ||
![]() |
a65a453390 | ||
![]() |
856f7f137c | ||
![]() |
3878dd0049 | ||
![]() |
9a04232e84 | ||
![]() |
ff25bedcae | ||
![]() |
7ca15b5e1e | ||
![]() |
b2a7b22f20 | ||
![]() |
ae7633e1e7 | ||
![]() |
ebb90d5586 | ||
![]() |
ac7a08cbf3 | ||
![]() |
e16a89f979 | ||
![]() |
9a17d5fa0f | ||
![]() |
caf301f3f5 | ||
![]() |
9d42da53c0 | ||
![]() |
1632b207db | ||
![]() |
3ec576968e | ||
![]() |
84222e3188 | ||
![]() |
6b7fc303e0 | ||
![]() |
e113030dce | ||
![]() |
12046220c1 | ||
![]() |
6943ed5cb4 | ||
![]() |
4ff7cd53c4 | ||
![]() |
a7c89d7e69 | ||
![]() |
32e45da1d6 | ||
![]() |
6ad73eddea | ||
![]() |
a796cdbdf0 | ||
![]() |
1db667e32f | ||
![]() |
d858840183 | ||
![]() |
aef35d748e | ||
![]() |
2bf6387b8f | ||
![]() |
b96619c244 | ||
![]() |
3fff4c1b2b | ||
![]() |
f3c08d5b76 | ||
![]() |
1c1f6d55e7 | ||
![]() |
2c330a0136 | ||
![]() |
83ae611af1 | ||
![]() |
741d9967d1 | ||
![]() |
01f92b0b3a | ||
![]() |
c959e649a0 | ||
![]() |
869a134587 | ||
![]() |
75841d241f | ||
![]() |
273b2fc893 | ||
![]() |
e5b45a7c01 | ||
![]() |
4d3d216d78 | ||
![]() |
879ec689a9 | ||
![]() |
a4d2aea98d | ||
![]() |
68b0a928b6 | ||
![]() |
8d9c1e3f6e | ||
![]() |
b3ed13f16a | ||
![]() |
e86716fc54 | ||
![]() |
cf0c8529a0 | ||
![]() |
ce5adc6801 | ||
![]() |
44ba8b1436 | ||
![]() |
0168318f39 | ||
![]() |
f0d55455e4 | ||
![]() |
17091056de | ||
![]() |
a60fafdd38 | ||
![]() |
54031a166a | ||
![]() |
efc83b0669 | ||
![]() |
a580926059 | ||
![]() |
21af7ad7ff | ||
![]() |
01faaa7ce0 | ||
![]() |
533e097a0c | ||
![]() |
c9fa5ff43b | ||
![]() |
679b00fe71 | ||
![]() |
04c7ed931f | ||
![]() |
781f270824 | ||
![]() |
5aa0cf06a8 | ||
![]() |
7eabaff36a | ||
![]() |
f897ce46ea | ||
![]() |
e2e5885fd5 | ||
![]() |
9a3591e6f6 | ||
![]() |
5fd2d8a88a | ||
![]() |
4fd8c14b98 | ||
![]() |
1b3d2e518d | ||
![]() |
c686c373ba | ||
![]() |
555b801fe6 | ||
![]() |
2624989a75 | ||
![]() |
220ab789a5 | ||
![]() |
9f20a6d646 | ||
![]() |
a9d4fb1a9b | ||
![]() |
500a78f7ec | ||
![]() |
c1e4f32bb3 | ||
![]() |
bbed9223ef | ||
![]() |
d190980e12 | ||
![]() |
7b8e89d09e | ||
![]() |
e7d3250d2b | ||
![]() |
a64aeada91 | ||
![]() |
b31de49da1 | ||
![]() |
576cb5814d | ||
![]() |
5bc7fecdcf | ||
![]() |
743079c5bf | ||
![]() |
3153f7b279 | ||
![]() |
efe28423e9 | ||
![]() |
3bd1239457 | ||
![]() |
59124967d2 | ||
![]() |
376ed30dc5 | ||
![]() |
2b38b2c946 | ||
![]() |
05e9f43ba4 | ||
![]() |
e5b04ed07a | ||
![]() |
cc1e126101 | ||
![]() |
22a5d69ac8 | ||
![]() |
8b6ab6b037 | ||
![]() |
d18b33a18e | ||
![]() |
1a83848c2c | ||
![]() |
fdb602b9ed | ||
![]() |
00829ec21b | ||
![]() |
53d76cb0f8 | ||
![]() |
8a5d640572 | ||
![]() |
833222507b | ||
![]() |
2fb23a94bf | ||
![]() |
ef55a3eaff | ||
![]() |
05c967e582 | ||
![]() |
645edf2439 | ||
![]() |
6deadf9d73 | ||
![]() |
b81b2f9ef8 | ||
![]() |
eed0c53e9c | ||
![]() |
51a46155d7 | ||
![]() |
2e8fd2bae7 | ||
![]() |
05a2a819b7 | ||
![]() |
86e7803cd7 | ||
![]() |
77c332d825 | ||
![]() |
d20eb71f2b | ||
![]() |
1ce2fc2f89 | ||
![]() |
c2acdaa182 | ||
![]() |
eff9d795f0 | ||
![]() |
27c2257feb | ||
![]() |
9803f5d6a8 | ||
![]() |
00ef7d1e01 | ||
![]() |
06e7dbaae7 | ||
![]() |
34f69cc4f4 | ||
![]() |
74e8394b07 | ||
![]() |
0370876a3f | ||
![]() |
dd322ac7e9 | ||
![]() |
6e8c0ce593 | ||
![]() |
75c45f96c2 | ||
![]() |
f7b22fb600 | ||
![]() |
4170dc7a16 | ||
![]() |
47f4106b5d | ||
![]() |
b28fcbb398 | ||
![]() |
97f8232767 | ||
![]() |
8fa4f6cc5b | ||
![]() |
ebcb223ef0 | ||
![]() |
90b23cd1f8 | ||
![]() |
beca7d06ca | ||
![]() |
e4ea156a20 | ||
![]() |
8279c55526 | ||
![]() |
a95b050ae5 | ||
![]() |
5bf422a17f | ||
![]() |
d51c8bb25e | ||
![]() |
1903687137 | ||
![]() |
ee884f1c7d | ||
![]() |
e0f581e149 | ||
![]() |
a0a46832ed | ||
![]() |
19373a28a7 | ||
![]() |
1bc82c8b81 | ||
![]() |
34a361e84a | ||
![]() |
ff4c9df9a2 | ||
![]() |
9be4df34e7 | ||
![]() |
cb40018d52 | ||
![]() |
30861cc40f | ||
![]() |
abc781d340 | ||
![]() |
41fa5ed1ed | ||
![]() |
00212531fb | ||
![]() |
1f85226297 | ||
![]() |
b6c4ad5ac7 | ||
![]() |
fd01082a3d | ||
![]() |
2d085cb655 | ||
![]() |
460bc7ae2c | ||
![]() |
a4a45b6ddd | ||
![]() |
fe5b24319a | ||
![]() |
895522a1e3 | ||
![]() |
b591b5d3f2 | ||
![]() |
7541b9d051 | ||
![]() |
913727935e | ||
![]() |
3745b0fd3b | ||
![]() |
eb1b2a7920 | ||
![]() |
bbc5bee000 | ||
![]() |
bc7ae4692d | ||
![]() |
612fb36dfc | ||
![]() |
0d1ff892ee | ||
![]() |
a52a490cde | ||
![]() |
61d15fc8f2 | ||
![]() |
cb87c06214 | ||
![]() |
57fb7c6a5f | ||
![]() |
fd60013d23 | ||
![]() |
31325e34c1 | ||
![]() |
93273820aa | ||
![]() |
bfa28fc5fa | ||
![]() |
8a2a0df832 | ||
![]() |
e70c23ad75 | ||
![]() |
e4e0fe3fa6 | ||
![]() |
190ab5f3fc | ||
![]() |
3a1a74d0f9 | ||
![]() |
eead801eb9 | ||
![]() |
08e75b8e36 | ||
![]() |
96d8c420c4 | ||
![]() |
d96c6e21ce | ||
![]() |
82987b0848 | ||
![]() |
4eb4251db5 | ||
![]() |
ffecab95be | ||
![]() |
9f74be0e1c | ||
![]() |
d5cf6e832f | ||
![]() |
a8653c0f83 | ||
![]() |
482934ba22 | ||
![]() |
f50eb6448b | ||
![]() |
bdbac0b5e7 | ||
![]() |
4038cf2bb5 | ||
![]() |
a1cd8a1e3c | ||
![]() |
e74c977574 | ||
![]() |
e0d85733a9 | ||
![]() |
36807702e2 | ||
![]() |
596ff6d9d4 | ||
![]() |
0b4cd29197 | ||
![]() |
df00f41765 | ||
![]() |
5220b0b5d8 | ||
![]() |
21de0643ff | ||
![]() |
51a7fe0c7b | ||
![]() |
2999bd201e | ||
![]() |
374b85686d | ||
![]() |
ea89b32316 | ||
![]() |
d096e8bf76 | ||
![]() |
822b22df47 | ||
![]() |
aa53627902 | ||
![]() |
dc67ab0065 | ||
![]() |
883657f6d5 | ||
![]() |
32a1d709a5 | ||
![]() |
cd35e05461 | ||
![]() |
09bd9bc1f9 | ||
![]() |
31075e48e1 | ||
![]() |
7239ae5ddd | ||
![]() |
370c76b6fa | ||
![]() |
4ab015eea8 | ||
![]() |
302aad41ea | ||
![]() |
a82a93d2d9 | ||
![]() |
cb59a3d082 | ||
![]() |
d09e9c48d8 | ||
![]() |
9f3014c20c | ||
![]() |
b4ac9332fe | ||
![]() |
28ec7655f8 | ||
![]() |
c056438c58 | ||
![]() |
fdd5707dba | ||
![]() |
485c477760 | ||
![]() |
c940e0db1b | ||
![]() |
93441072f7 | ||
![]() |
619f16bf88 | ||
![]() |
54fed86f2e | ||
![]() |
a3e0a58a3f | ||
![]() |
92778e6dcf | ||
![]() |
c879f2353a | ||
![]() |
3d66f6c7c9 | ||
![]() |
4b9476e95a | ||
![]() |
66d5c36cbc | ||
![]() |
aa8e5d6355 | ||
![]() |
df75e51b45 | ||
![]() |
4166be0422 | ||
![]() |
77b5eb454e | ||
![]() |
a480d5e08a | ||
![]() |
a1647843b3 | ||
![]() |
e63a9d2084 | ||
![]() |
4dff887ec1 | ||
![]() |
9d24d0fbe6 | ||
![]() |
0f0bf55296 | ||
![]() |
50276003f8 | ||
![]() |
12aa8ea8ed | ||
![]() |
1a9dc33926 | ||
![]() |
4a765300fd | ||
![]() |
27e62e7e3f | ||
![]() |
569f787c15 | ||
![]() |
fc150febcb | ||
![]() |
72d3c3187b | ||
![]() |
9f3126b63f | ||
![]() |
06e796ac0b | ||
![]() |
ec62cb4238 | ||
![]() |
cf7b6ad46f | ||
![]() |
a5c3d5b143 | ||
![]() |
e8327e50c4 | ||
![]() |
3e367da060 | ||
![]() |
d79a3425e9 | ||
![]() |
9edf99fe88 | ||
![]() |
507b157a40 | ||
![]() |
6c800b1379 | ||
![]() |
e2f1fddb09 | ||
![]() |
6096fb0db6 | ||
![]() |
7132d5ac69 | ||
![]() |
b279390ea9 | ||
![]() |
96cbc31979 | ||
![]() |
17c385be53 | ||
![]() |
1d566c942d | ||
![]() |
a74f5bd289 | ||
![]() |
0539ca94c0 | ||
![]() |
f1cbdd00f8 | ||
![]() |
592a768cd3 | ||
![]() |
50979700bd | ||
![]() |
431165f3d8 | ||
![]() |
f090a96aad | ||
![]() |
93fcb9bd30 | ||
![]() |
71c8e51d1f | ||
![]() |
5c9072acfc | ||
![]() |
47540eef95 | ||
![]() |
7f7d9805f1 | ||
![]() |
35450bd561 | ||
![]() |
b417664dd7 | ||
![]() |
c6c727d2cc | ||
![]() |
dea3d05660 | ||
![]() |
7b5b01a7b4 | ||
![]() |
0ee6e3621b | ||
![]() |
437d47ed05 | ||
![]() |
b80c264cdf | ||
![]() |
bd9b32ff91 | ||
![]() |
7c8655aff3 | ||
![]() |
df4f642b51 | ||
![]() |
95492fdd80 | ||
![]() |
e8524dced5 | ||
![]() |
698e780988 | ||
![]() |
660dc88001 | ||
![]() |
c93be2cb51 | ||
![]() |
fc14b58fa5 | ||
![]() |
1ed5f5ba2a | ||
![]() |
22c08f62fa | ||
![]() |
b39a58f1b9 | ||
![]() |
d3217a0983 | ||
![]() |
e8125c51c5 | ||
![]() |
ef51c459ab |
@@ -3,7 +3,7 @@ branches:
|
||||
only:
|
||||
- master
|
||||
skip_branch_with_pr: true
|
||||
image: Visual Studio 2019
|
||||
image: Visual Studio 2022
|
||||
configuration: Release
|
||||
platform: Any CPU
|
||||
clone_script:
|
||||
@@ -20,7 +20,7 @@ cache:
|
||||
- '%USERPROFILE%\.nuget\packages -> **\project.json'
|
||||
before_build:
|
||||
- ps: >-
|
||||
$env:GIT_TAG = git describe --always --tags
|
||||
$env:GIT_TAG = git describe --always --tags --exclude latest
|
||||
|
||||
nuget restore -verbosity detailed
|
||||
build:
|
||||
@@ -38,11 +38,11 @@ artifacts:
|
||||
name: QuickLook-%GIT_TAG%
|
||||
- path: QuickLook-%GIT_TAG%.msi
|
||||
name: QuickLook-%GIT_TAG%
|
||||
deploy:
|
||||
- provider: GitHub
|
||||
auth_token:
|
||||
secure: 5CSvkfKBq9kUho529L1tkH5ywQQFJY/A8Y6lNoHGJFi7mnSqQAaoiVPbUVU4a/KC
|
||||
artifact: QuickLook-$(APPVEYOR_REPO_TAG_NAME)
|
||||
draft: true
|
||||
on:
|
||||
APPVEYOR_REPO_TAG: true
|
||||
# deploy:
|
||||
# - provider: GitHub
|
||||
# auth_token:
|
||||
# secure: 5CSvkfKBq9kUho529L1tkH5ywQQFJY/A8Y6lNoHGJFi7mnSqQAaoiVPbUVU4a/KC
|
||||
# artifact: QuickLook-$(APPVEYOR_REPO_TAG_NAME)
|
||||
# draft: true
|
||||
# on:
|
||||
# APPVEYOR_REPO_TAG: true
|
||||
|
2
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@@ -23,7 +23,7 @@ A clear and concise description of what you expected to happen.
|
||||
|
||||
**Desktop (please complete the following information):**
|
||||
- OS Version: [e.g. Windows 10 1803]
|
||||
- QuickLook Version: [e.g. 0.3.3 from Windows Store]
|
||||
- QuickLook Version: [e.g. 4.0.2 from Microsoft Store or from MSI installer]
|
||||
|
||||
**Screenshots and Exception Log**
|
||||
If applicable, add screenshots and logs to help explain your problem. The log file is located in [one of several locations](https://github.com/QL-Win/QuickLook/wiki/Differences-Between-Distributions#user-data-location).
|
||||
|
80
.github/workflows/msbuild.yml
vendored
Normal file
@@ -0,0 +1,80 @@
|
||||
# run a build for the latest version and upload the artifacts to a "latest" pre-release
|
||||
|
||||
name: MSBuild
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ "master" ]
|
||||
pull_request:
|
||||
branches: [ "master" ]
|
||||
workflow_dispatch:
|
||||
|
||||
env:
|
||||
# Path to the solution file relative to the root of the project.
|
||||
SOLUTION_FILE_PATH: ./QuickLook.sln
|
||||
|
||||
# Configuration type to build.
|
||||
# You can convert this to a build matrix if you need coverage of multiple configuration types.
|
||||
# https://docs.github.com/actions/learn-github-actions/managing-complex-workflows#using-a-build-matrix
|
||||
BUILD_CONFIGURATION: Release
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: windows-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
submodules: recursive
|
||||
fetch-depth: 0
|
||||
ref: master
|
||||
|
||||
- name: Add MSBuild to PATH
|
||||
uses: microsoft/setup-msbuild@v1.0.2
|
||||
|
||||
- name: Restore NuGet packages
|
||||
working-directory: ${{env.GITHUB_WORKSPACE}}
|
||||
run: nuget restore ${{env.SOLUTION_FILE_PATH}}
|
||||
|
||||
- name: Build
|
||||
working-directory: ${{env.GITHUB_WORKSPACE}}
|
||||
# Add additional options to the MSBuild command line here (like platform or verbosity level).
|
||||
# See https://docs.microsoft.com/visualstudio/msbuild/msbuild-command-line-reference
|
||||
run: msbuild /m /p:BuildInParallel=true /p:Configuration=${{env.BUILD_CONFIGURATION}} ${{env.SOLUTION_FILE_PATH}}
|
||||
|
||||
# upload msi and zip artifacts so the publish job below can download and then update latest release via Linux
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: quicklook-build-files
|
||||
path: Build/QuickLook-*.*
|
||||
|
||||
publish:
|
||||
# don't run in parallel - wait for build to complete first
|
||||
needs: build
|
||||
|
||||
# one of the steps uses container action which is Linux only
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
permissions: write-all
|
||||
|
||||
# only run this job on push events, not pull_request
|
||||
if: github.event_name == 'push'
|
||||
|
||||
steps:
|
||||
- uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: quicklook-build-files
|
||||
|
||||
- name: Update latest release
|
||||
# see https://github.com/pyTooling/Actions/tree/main/releaser
|
||||
uses: pyTooling/Actions/releaser@main
|
||||
with:
|
||||
tag: latest
|
||||
rm: true
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
files: QuickLook-*.*
|
||||
|
||||
|
7
.gitignore
vendored
@@ -290,6 +290,11 @@ __pycache__/
|
||||
/QuickLook.Installer/C_QuickLookComponents.wxs
|
||||
/Build/*
|
||||
!/Build/Assets
|
||||
!/Build/AppxManifest.*
|
||||
!/Build/AppxManifest.xml
|
||||
!/Build/assetslayout.resfiles
|
||||
!/Build/priconfig.xml
|
||||
!/Build/micasetup.json
|
||||
!/Build/openssl-sign.cnf
|
||||
!/Build/sideload.crt
|
||||
!/Build/sideload.key
|
||||
!/Build/sideload.pfx
|
@@ -1,53 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Package xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
|
||||
xmlns:desktop="http://schemas.microsoft.com/appx/manifest/desktop/windows10"
|
||||
xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
|
||||
xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10">
|
||||
<Identity Name="21090PaddyXu.QuickLook" Version="0.0.0.0"
|
||||
Publisher='E=xupaddy@gmail.com, CN="Open Source Developer, Pengfei Xu", O=Open Source Developer, C=FI' />
|
||||
<Properties>
|
||||
<DisplayName>QuickLook</DisplayName>
|
||||
<PublisherDisplayName>Paddy Xu</PublisherDisplayName>
|
||||
<Description>Bring macOS “Quick Look” feature to Windows</Description>
|
||||
<Logo>Assets\storelogo.png</Logo>
|
||||
</Properties>
|
||||
<Resources>
|
||||
<Resource Language="en-us" />
|
||||
<Resource uap:Scale="100" />
|
||||
<Resource uap:Scale="125" />
|
||||
<Resource uap:Scale="150" />
|
||||
<Resource uap:Scale="200" />
|
||||
<Resource uap:Scale="400" />
|
||||
</Resources>
|
||||
<Dependencies>
|
||||
<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.14316.0" MaxVersionTested="10.0.15063.0" />
|
||||
</Dependencies>
|
||||
<Capabilities>
|
||||
<rescap:Capability Name="runFullTrust" />
|
||||
</Capabilities>
|
||||
<Applications>
|
||||
<Application Id="Main" Executable="Package\QuickLook.exe" EntryPoint="Windows.FullTrustApplication">
|
||||
<Extensions>
|
||||
<desktop:Extension Category="windows.startupTask" Executable="Package\QuickLook.exe"
|
||||
EntryPoint="Windows.FullTrustApplication">
|
||||
<desktop:StartupTask TaskId="QuickLookTask" Enabled="true" DisplayName="QuickLook" />
|
||||
</desktop:Extension>
|
||||
</Extensions>
|
||||
<uap:VisualElements DisplayName="QuickLook"
|
||||
Description="Bring macOS “Quick Look” feature to Windows"
|
||||
BackgroundColor="transparent"
|
||||
Square150x150Logo="Assets\Square150x150Logo.png"
|
||||
Square44x44Logo="Assets\Square44x44Logo.png">
|
||||
<uap:DefaultTile Wide310x150Logo="Assets\Wide310x150Logo.png"
|
||||
Square310x310Logo="Assets\LargeTile.png"
|
||||
Square71x71Logo="Assets\SmallTile.png">
|
||||
<uap:ShowNameOnTiles>
|
||||
<uap:ShowOn Tile="square150x150Logo" />
|
||||
<uap:ShowOn Tile="wide310x150Logo" />
|
||||
<uap:ShowOn Tile="square310x310Logo" />
|
||||
</uap:ShowNameOnTiles>
|
||||
</uap:DefaultTile>
|
||||
</uap:VisualElements>
|
||||
</Application>
|
||||
</Applications>
|
||||
</Package>
|
@@ -3,10 +3,15 @@
|
||||
xmlns:desktop="http://schemas.microsoft.com/appx/manifest/desktop/windows10"
|
||||
xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
|
||||
xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10">
|
||||
<!-- Invalid package identity name: QL-Win.QuickLook (expected: 21090PaddyXu.QuickLook) -->
|
||||
<!-- Invalid package family name: QL-Win.QuickLook_wgqddy12gm212 (expected: 21090PaddyXu.QuickLook_egxr34yet59cg) -->
|
||||
<!-- Invalid package publisher name: CN=F4F538EC-55CB-41B8-9531-25CC140D0339 (expected: CN=CE36AF3D-FF94-43EB-9908-7EC8FD1D29FB) -->
|
||||
<Identity Name="21090PaddyXu.QuickLook" Version="0.0.0.0" Publisher="CN=CE36AF3D-FF94-43EB-9908-7EC8FD1D29FB" />
|
||||
<Properties>
|
||||
<DisplayName>QuickLook</DisplayName>
|
||||
<PublisherDisplayName>Paddy Xu</PublisherDisplayName>
|
||||
<!-- We can not set the name to QL-Win, see the following error message -->
|
||||
<!-- Package acceptance validation error: The PublisherDisplayName element in the app manifest of QuickLook-4.0.1.0.appx is QL-Win, which doesn't match your publisher display name: emako. -->
|
||||
<PublisherDisplayName>emako</PublisherDisplayName>
|
||||
<Description>Bring macOS “Quick Look” feature to Windows</Description>
|
||||
<Logo>Assets\storelogo.png</Logo>
|
||||
</Properties>
|
||||
@@ -19,7 +24,7 @@
|
||||
<Resource uap:Scale="400" />
|
||||
</Resources>
|
||||
<Dependencies>
|
||||
<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.14316.0" MaxVersionTested="10.0.15063.0" />
|
||||
<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.14316.0" MaxVersionTested="10.0.26100.0" />
|
||||
</Dependencies>
|
||||
<Capabilities>
|
||||
<rescap:Capability Name="runFullTrust" />
|
||||
|
BIN
Build/Assets/Branding/1.png
Normal file
After Width: | Height: | Size: 569 KiB |
BIN
Build/Assets/Branding/2.png
Normal file
After Width: | Height: | Size: 1.3 MiB |
BIN
Build/Assets/Branding/3.png
Normal file
After Width: | Height: | Size: 970 KiB |
BIN
Build/Assets/Branding/4.png
Normal file
After Width: | Height: | Size: 1.1 MiB |
BIN
Build/Assets/Branding/5.png
Normal file
After Width: | Height: | Size: 288 KiB |
BIN
Build/Assets/Branding/6.png
Normal file
After Width: | Height: | Size: 383 KiB |
BIN
Build/Assets/Branding/7.png
Normal file
After Width: | Height: | Size: 206 KiB |
After Width: | Height: | Size: 24 KiB |
After Width: | Height: | Size: 24 KiB |
46
Build/micasetup.json
Normal file
@@ -0,0 +1,46 @@
|
||||
{
|
||||
"Template": "${MicaDir}/template/default.7z",
|
||||
"Package": "./Package.7z",
|
||||
"Output": "./${AppName}.exe",
|
||||
"AppName": "QuickLook",
|
||||
"KeyName": "QuickLook",
|
||||
"ExeName": "QuickLook.exe",
|
||||
"Publisher": "QL-Win",
|
||||
"Version": "${Package}./${ExeName}|3",
|
||||
"TargetFramework": "net472",
|
||||
"Guid": "8B4A9CE5-67B5-4A94-81CB-3771F688FDEB",
|
||||
"Favicon": "./Assets/Square44x44Logo.altform-unplated_targetsize-256.png",
|
||||
"Icon": "./Assets/Square44x44Logo.altform-unplated_targetsize-256.setup.png",
|
||||
"UnIcon": "./Assets/Square44x44Logo.altform-unplated_targetsize-256.uninst.png",
|
||||
"LicenseFile": "../LICENSE-GPL.txt",
|
||||
"License": null,
|
||||
"LicenseType": null,
|
||||
"RequestExecutionLevel": "admin",
|
||||
"SingleInstanceMutex": null,
|
||||
"IsCreateDesktopShortcut": true,
|
||||
"IsCreateUninst": true,
|
||||
"IsCreateStartMenu": true,
|
||||
"IsPinToStartMenu": false,
|
||||
"IsCreateQuickLaunch": true,
|
||||
"IsCreateRegistryKeys": true,
|
||||
"IsCreateAsAutoRun": false,
|
||||
"IsCustomizeVisiableAutoRun": false,
|
||||
"AutoRunLaunchCommand": "/autostart",
|
||||
"IsUseFolderPickerPreferClassic": false,
|
||||
"IsUseInstallPathPreferX86": false,
|
||||
"IsUseInstallPathPreferAppDataLocalPrograms": true,
|
||||
"IsUseInstallPathPreferAppDataRoaming": false,
|
||||
"IsUseRegistryPreferX86": null,
|
||||
"IsAllowFullFolderSecurity": true,
|
||||
"IsAllowFirewall": true,
|
||||
"IsRefreshExplorer": true,
|
||||
"IsInstallCertificate": false,
|
||||
"IsEnableUninstallDelayUntilReboot": true,
|
||||
"IsUseTempPathFork": false,
|
||||
"IsEnvironmentVariable": false,
|
||||
"OverlayInstallRemoveExt": "exe,dll,pdb,config,winmd,txt,bat,ax,manifest,xshd",
|
||||
"UnpackingPassword": null,
|
||||
"MessageOfPage1": null,
|
||||
"MessageOfPage2": null,
|
||||
"MessageOfPage3": null
|
||||
}
|
13
Build/openssl-sign.cnf
Normal file
@@ -0,0 +1,13 @@
|
||||
[req]
|
||||
default_bits = 2048
|
||||
prompt = no
|
||||
default_md = sha256
|
||||
distinguished_name = dn
|
||||
x509_extensions = v3_req
|
||||
|
||||
[dn]
|
||||
CN = CE36AF3D-FF94-43EB-9908-7EC8FD1D29FB
|
||||
|
||||
[v3_req]
|
||||
keyUsage = critical, digitalSignature
|
||||
extendedKeyUsage = codeSigning
|
20
Build/sideload.crt
Normal file
@@ -0,0 +1,20 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIDMjCCAhqgAwIBAgIUBIWdItfat0Fw6npbHI2W7HE/0KYwDQYJKoZIhvcNAQEL
|
||||
BQAwLzEtMCsGA1UEAwwkQ0UzNkFGM0QtRkY5NC00M0VCLTk5MDgtN0VDOEZEMUQy
|
||||
OUZCMB4XDTI1MDUxMzE3NDgzNVoXDTI4MDUxMjE3NDgzNVowLzEtMCsGA1UEAwwk
|
||||
Q0UzNkFGM0QtRkY5NC00M0VCLTk5MDgtN0VDOEZEMUQyOUZCMIIBIjANBgkqhkiG
|
||||
9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnAtbhjH01YmWv1U98kMj3epdpuZLE04pGXOR
|
||||
xfdBb1zX8Q75hy5SmIaHrsow7fTXfHsUzuJEmanllMbJGUpi46fLsb8Ijd4uQgXO
|
||||
wSDfIXrm34Buzpk6EKwEWmRMyORmfPwy0A+XdTHydDhEXndy1eGPJ1ZZnldVI8Ho
|
||||
ZF2MW35QBZDjlWZh3RppWNMksvlngrOX4PFfJ+DtOQUvNswbpyqVATMFBk9kShGM
|
||||
XHuieibzDlzxGNKSn3tDvutLBW5hm7iLqEuAeM7dwSac4C+N5FKWnXJndkN3k8AN
|
||||
nD0MHlErN1dLoJQqvAaCarZr8RSPhdanVOylMGkt97NLYZrLTQIDAQABo0YwRDAO
|
||||
BgNVHQ8BAf8EBAMCB4AwEwYDVR0lBAwwCgYIKwYBBQUHAwMwHQYDVR0OBBYEFJEL
|
||||
e4QaWs4H2djQ6nnnc/30sZ/nMA0GCSqGSIb3DQEBCwUAA4IBAQBYBXkl/vEsGUHI
|
||||
qogCfb/DxFlsm059sxHAIhaNjuoTlgwzgj6KSPbKsfnYVMHZFqkg4AaTuRs9iqTL
|
||||
TStM14OjG95gn+7fJ4zxqquEEytk9yb2xj9ZpLAvzZzUrw5qo1lmM7yPRso38l62
|
||||
9g1G1/MVP6pO03QWKzvSV+IlU3DIP3M2r74G8dexL5/Cut1LkOc/tn2ZYt3Ij95e
|
||||
RM2vqxzK2pw6IAVG3wdNGAyN9K8BATRuAXFV6RXkeEBHFNV3wpyq4W+H6hpsrMJM
|
||||
rMZUUqLa8BTUQAsZ1jmL+dRmj2rESeOaOO9jPks4J4c8+v8aJQBmZhvxRyjyMtdL
|
||||
pWHSCCgm
|
||||
-----END CERTIFICATE-----
|
28
Build/sideload.key
Normal file
@@ -0,0 +1,28 @@
|
||||
-----BEGIN PRIVATE KEY-----
|
||||
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCcC1uGMfTViZa/
|
||||
VT3yQyPd6l2m5ksTTikZc5HF90FvXNfxDvmHLlKYhoeuyjDt9Nd8exTO4kSZqeWU
|
||||
xskZSmLjp8uxvwiN3i5CBc7BIN8heubfgG7OmToQrARaZEzI5GZ8/DLQD5d1MfJ0
|
||||
OERed3LV4Y8nVlmeV1UjwehkXYxbflAFkOOVZmHdGmlY0ySy+WeCs5fg8V8n4O05
|
||||
BS82zBunKpUBMwUGT2RKEYxce6J6JvMOXPEY0pKfe0O+60sFbmGbuIuoS4B4zt3B
|
||||
JpzgL43kUpadcmd2Q3eTwA2cPQweUSs3V0uglCq8BoJqtmvxFI+F1qdU7KUwaS33
|
||||
s0thmstNAgMBAAECggEABS51XWPhmt5E5K6Pw4XKNkS207jC68MFJ1oIkE0bsvcf
|
||||
boWORe2vrW6OKSt/627dYZNJXMNI/tyUNIKooSUwr8QzGysE6DJlUSjrNXYszT+i
|
||||
VJqUU1o614c2unT+fbnj01OhMPp2OjHXOK0OTCAQQ/IySYlFqYssgbxJxgdl2+XX
|
||||
rDiSk5PvZ0Z8PUuG7EvNbRAnUmIQDVTd81My0kPk4M0w8Rg2p0sIN5klIDxTzC98
|
||||
5iUvS+53xch4f8jJOr8s7J/56R+tnIoqfVkIDI3Q4CUhq3s0DAC7GP4vpoynGXn0
|
||||
pLzHvOttFbqgcHkS2zrVOXKwl4Zym4p+kMCub6BCmwKBgQDcGzCvrMon4fIJrymG
|
||||
lmGZMeN8acjD0MKDT8JPgHkwXTz61AbOC2EGoOpWNqrYGOCv6xSMPiub1un6Y5X2
|
||||
KIuAJm+bY+py0Ed+EzZjrFkQpGt6xQ3FY2aFvA5uS3esgcF+OtcUrXEEq0dK9bZ6
|
||||
HB9P90QuND72bvfx9wjLon0dvwKBgQC1fcRbLpqA2lSGglcRoioA/okMPyMk7jH3
|
||||
n3IHjnpjsBu1FPrWH8Tqtop4vrEVS1cxM7P7FXWwWPqUH/2XbCk1R3T9ZD+i1kHi
|
||||
qvSqp4L0dfTk6ibZpywGXRnpQzT5kKJTrSSx9L7Ni00HcvCI1+p4XNdJZm7jNDSy
|
||||
dGSPg1ox8wKBgB6TaF//ENYZfRX7TzlzCnvNglx2FX2eMmcrXULOBgfB7AasDYXx
|
||||
7riNAgCX94OtcQj/DwusV0J+yGIQE3TujPJwZHChoJ/ybvwEjzmpZ3X4YTXcydzx
|
||||
wfwx848+zJEaNVbjtZ0Zuul7IZw4JfEwluj04HPKrjRtleP2/THMkLThAoGBAJYh
|
||||
BwB2OJBGCo2J3ARWJHDWHP/oamXuM58mYekmTs+PqhvM0wG1HesaPMlM1KdMvz+Q
|
||||
CV21jrjlocJOBDPx4NSV24yQFKPaoH2j9OgF0SnvOTjzCFgbFSveb8SpN3UJ031s
|
||||
SGJ8lijpBjsXNSm9kdMm2V96QFfpo33LEjQ077NJAoGARnnvnenmfwlu/5Oq2Ojs
|
||||
WWzOxXTpiGXLnbUNUvQMvqXxGygCGoA18vVveLr6eKfojM8iKtGF91S9NsUkBEkd
|
||||
VKOFnc9OQ5dtoBkN6XZBUCmJCzQZS20A3jq9oionsJlIWOgb/X3L1cS2SZ3ocgKS
|
||||
lCCN2IGaKiGJCPJprpFW7fg=
|
||||
-----END PRIVATE KEY-----
|
BIN
Build/sideload.pfx
Normal file
112
CHANGELOG.md
Normal file
@@ -0,0 +1,112 @@
|
||||
## 4.1.1
|
||||
|
||||
- Add built-in ThumbnailViewer plugin [#1662](https://github.com/QL-Win/QuickLook/issues/1662)
|
||||
- Add built-in HelixViewer for 3d models [#1662](https://github.com/QL-Win/QuickLook/issues/1662)
|
||||
- Add FBX model support using AssimpNet [#1479](https://github.com/QL-Win/QuickLook/issues/1479)
|
||||
- Add `SVGA` and `Lottie Files` animation preview support
|
||||
- Add MathJax inline math support to Markdown [#1640](https://github.com/QL-Win/QuickLook/issues/1640)
|
||||
- Add `SubRip Subtitle (.srt) files`, `Protobuf`, `NSIS`, `.gitmodules`, `.dotsettings`, `.gitignore`, `.gitattributes`, `Markdown`, `reStructuredText`, `simple QML syntax`, `.env`, `Configuration (.conf;.config;.cfg)` highlighting [#1002](https://github.com/QL-Win/QuickLook/issues/1002)
|
||||
- Add dark mode highlighting for `PowerShell`, `Registry`, `C`, `C++`, `Java`, `Rust`, `SQL`, `Ruby`, `R`, `PHP`, `Pascal`, `Objective-C`, `Lisp`, `Kotlin`, `Erlang`, `Dart`, `Swift`, `VisualSolution`, `CMake`
|
||||
- Add `MakefileDetector`, `CMakeListsDetector for CMakeLists.txt`, `DockerfileDetector`, `HostsDetector for hosts` for text viewer
|
||||
- Improve QuickLook initialization speed
|
||||
- Optimize JSONDetector with Span
|
||||
- Set RichTextBox background to transparent
|
||||
- Revert Add Sandbox detection from 4.1.0 which will call crash
|
||||
|
||||
## 4.1.0
|
||||
|
||||
- Add built-in AppViewer plugin for `.msi`, `.appx`, `.msix`, `.wgt`, `.wgtu`, `.apk`, `.ipa`, `.hap`, `.deb`, `.dmg`, `.appimage`, `.rpm`, `.aab`
|
||||
- Add built-in ELF viewer plugin for ELF-type files
|
||||
- Add reload feature by JSuttHoops but you should enable `AutoReload` option firstly
|
||||
- New option ProcessRenderMode
|
||||
- Use format detector feature for TextViewer, only `JSON` / `XML` available now
|
||||
- Add support more highlighting for `HLSL`, `XML`, `TXT`, `Properties`, `Lyric`, `Log`, `Python`, `JavaScript`, `Vue`, `CSS`, `Go`, `YAML`, `F#`, `INI`, `TypeScript`, `VB`, `SubStation Alpha` and `Lua`
|
||||
- No markdown resource extraction [#1661](https://github.com/QL-Win/QuickLook/issues/1661) [#1670](https://github.com/QL-Win/QuickLook/issues/1670)
|
||||
- Support X11 and more JPEG2000 image formats
|
||||
- Support JXR image but SDR only [#1680](https://github.com/QL-Win/QuickLook/issues/1680)
|
||||
- Enable window dragging in video viewer panel [#425](https://github.com/QL-Win/QuickLook/issues/425)
|
||||
- Add SVG support using WebView2 in ImageViewer
|
||||
- Support RTL for .txt file [#1612](https://github.com/QL-Win/QuickLook/issues/1612)
|
||||
- Add `Alt+Z` shortcut to toggle word wrap [#1487](https://github.com/QL-Win/QuickLook/issues/1487)
|
||||
- Improve startup speed [#1521](https://github.com/QL-Win/QuickLook/issues/1521)
|
||||
- Improve PDF magic detection
|
||||
- Improve GroupBox UI/UX
|
||||
- Attempt to fix the crash [#1648](https://github.com/QL-Win/QuickLook/issues/1648) `This is an experimental fix, the idea is to remove the tree to prevent the DUCE command`
|
||||
- Update font pangram for FontViewer
|
||||
- Update de translations by King3R
|
||||
- Manually resolve the assembly fails [#1618](https://github.com/QL-Win/QuickLook/issues/1618)
|
||||
- Merge OfficeViewer-Native plugin [#1662](https://github.com/QL-Win/QuickLook/issues/1662)
|
||||
- New option CheckPreviewHandler for OfficeViewer-Native
|
||||
- Add Sandbox detection
|
||||
- Revert the DataGrid style of CSV [#1664](https://github.com/QL-Win/QuickLook/issues/1664)
|
||||
- Remove the WoW64HookHelper from release [#1634](https://github.com/QL-Win/QuickLook/issues/1634)
|
||||
- Fix share button was not visible in win11
|
||||
- Fix generic theme resources [#1652](https://github.com/QL-Win/QuickLook/issues/1652)
|
||||
- Fix old version volume exception [#1653](https://github.com/QL-Win/QuickLook/issues/1653)
|
||||
- Fix CaptionTextButtonStyle not static anymore
|
||||
- Fix unsupported ColorContexts in Windows [#1671](https://github.com/QL-Win/QuickLook/issues/1671)
|
||||
- ~~Fix long path issue [#1643](https://github.com/QL-Win/QuickLook/issues/1643)~~
|
||||
|
||||
## 4.0.2
|
||||
|
||||
- Support .pcx image [#1638](https://github.com/QL-Win/QuickLook/issues/1638)
|
||||
- Improve PE parsing with extended buffer size
|
||||
- Fix flickering [#1628](https://github.com/QL-Win/QuickLook/issues/1628)
|
||||
- Fix DpiAwareness for PerMonitor [#1626](https://github.com/QL-Win/QuickLook/issues/1626)
|
||||
|
||||
- Hide PEViewer Title just like InfoPanel
|
||||
- Avoid audio cover null exception in xaml
|
||||
|
||||
## 4.0.1
|
||||
|
||||
- Support more Markdown file extensions [#1562](https://github.com/QL-Win/QuickLook/issues/1562), [#1601](https://github.com/QL-Win/QuickLook/issues/1601)
|
||||
- Support CLI options [#1620](https://github.com/QL-Win/QuickLook/issues/1620)
|
||||
- Update pt-BR translations in Translations.config
|
||||
- Delay initialization of MarkdownViewer
|
||||
- Make .exe installer use MSI path by default [#1596](https://github.com/QL-Win/QuickLook/issues/1596)
|
||||
- Fix style issues in the Search Panel [#1592](https://github.com/QL-Win/QuickLook/issues/1592)
|
||||
- Fix volume control not working [#1578](https://github.com/QL-Win/QuickLook/issues/1578)
|
||||
- Fix exception when checking for updates [#1577](https://github.com/QL-Win/QuickLook/issues/1577)
|
||||
|
||||
## 4.0.0
|
||||
|
||||
- Add built-in PE viewer plugin
|
||||
- Add built-in font viewer plugin
|
||||
- Update translations
|
||||
- Update dependent packages
|
||||
- Add support for Multi Commander
|
||||
- Add support for both Everything v1.4 and v1.5(a)
|
||||
- Add "Open Data Folder" and dark mode support to tray menu
|
||||
- Add "Restart QuickLook" option to tray menu [#1448](https://github.com/QL-Win/QuickLook/issues/1448)
|
||||
- Implement modern message box UI
|
||||
- Replace icons with Segoe Fluent Icons
|
||||
- Detect and auto-fix Windows blocking issues [#1495](https://github.com/QL-Win/QuickLook/issues/1495)
|
||||
- Adjust tray menu position
|
||||
- Use MicaSetup to create EXE installer
|
||||
- Fix plugin installer description length limit
|
||||
- Prevent crash when WMI fails [#1379](https://github.com/QL-Win/QuickLook/issues/1379)
|
||||
- Show toast when "Prevent Closing" cannot be cancelled [#1368](https://github.com/QL-Win/QuickLook/issues/1368)
|
||||
- Add support for multi-layer GIMP .xcf files [#1224](https://github.com/QL-Win/QuickLook/issues/1224) for ImageViewer
|
||||
- Fix .xcf file extension check [#1229](https://github.com/QL-Win/QuickLook/issues/1229) for ImageViewer
|
||||
- Fix HEIC preview rendering [#1470](https://github.com/QL-Win/QuickLook/issues/1470) for ImageViewer
|
||||
- Add support for .qoi, .icns, .dds, .svgz, .psb, .cur, and .ani formats for ImageViewer
|
||||
- Improve animated WebP support (x64 only) [#1024](https://github.com/QL-Win/QuickLook/issues/1024) [#1324](https://github.com/QL-Win/QuickLook/issues/1324) for ImageViewer
|
||||
- Improve GIF decoding performance [#993](https://github.com/QL-Win/QuickLook/issues/993) for ImageViewer
|
||||
- Add copy button to image viewer [#1399](https://github.com/QL-Win/QuickLook/issues/1399) for ImageViewer
|
||||
- Fix SVG rendering error [#1430](https://github.com/QL-Win/QuickLook/issues/1430) for ImageViewer
|
||||
- Add double-encoding detection [#471](https://github.com/QL-Win/QuickLook/issues/471) [#600](https://github.com/QL-Win/QuickLook/issues/600) for TextViewer
|
||||
- Improve dark mode rendering for TextViewer
|
||||
- Catch exceptions from XSHD loader for TextViewer
|
||||
- Add syntax highlighting for shell scripts [#668](https://github.com/QL-Win/QuickLook/issues/668) for TextViewer
|
||||
- Add dark mode support for C# syntax highlighting for TextViewer
|
||||
- Improve support for comic archive formats [#1276](https://github.com/QL-Win/QuickLook/issues/1276) for ArchiveViewer
|
||||
- Redesign file list with Fluent UI for ArchiveViewer
|
||||
- Change default background color to blue for CsvViewer
|
||||
- Fix issue with non-UTF8 CSV encoding for CsvViewer
|
||||
- Improve rendering and stability for MarkdownViewer
|
||||
- Add support for password-protected PDFs [#155](https://github.com/QL-Win/QuickLook/issues/155) for PDFViewer
|
||||
- Enable auto-resizing of the viewer window for PDFViewer
|
||||
- Fix audio cover parsing error for multiple embedded images for VideoViewer
|
||||
- Add lyric (.lrc) support for audio files [#1506](https://github.com/QL-Win/QuickLook/issues/1506) for VideoViewer
|
||||
- Add support for .mid audio format [#931](https://github.com/QL-Win/QuickLook/issues/931) for VideoViewer
|
||||
- Fix time label overflow in long videos for VideoViewer
|
90
CodeMaid.config
Normal file
@@ -0,0 +1,90 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<configuration>
|
||||
<configSections>
|
||||
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
|
||||
<section name="SteveCadwallader.CodeMaid.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
||||
</sectionGroup>
|
||||
</configSections>
|
||||
<userSettings>
|
||||
<SteveCadwallader.CodeMaid.Properties.Settings>
|
||||
<setting name="General_Theme" serializeAs="String">
|
||||
<value>1</value>
|
||||
</setting>
|
||||
<setting name="Cleaning_AutoCleanupOnFileSave" serializeAs="String">
|
||||
<value>True</value>
|
||||
</setting>
|
||||
<setting name="ThirdParty_UseXAMLStylerCleanup" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="Cleaning_RemoveEndOfFileTrailingNewLine" serializeAs="String">
|
||||
<value>True</value>
|
||||
</setting>
|
||||
<setting name="Cleaning_IncludeCPlusPlus" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="Cleaning_IncludeXAML" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="Cleaning_IncludeXML" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="Cleaning_IncludePHP" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="Cleaning_IncludeCSS" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="Cleaning_IncludeHTML" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="Cleaning_IncludeTypeScript" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="Cleaning_IncludeJSON" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="Cleaning_IncludeJavaScript" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="Cleaning_IncludeSCSS" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="Cleaning_IncludeLESS" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="Cleaning_IncludeR" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="Cleaning_IncludePowerShell" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="Cleaning_InsertEndOfFileTrailingNewLine" serializeAs="String">
|
||||
<value>True</value>
|
||||
</setting>
|
||||
<setting name="Cleaning_InsertExplicitAccessModifiersOnClasses"
|
||||
serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="Cleaning_InsertExplicitAccessModifiersOnDelegates"
|
||||
serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="Cleaning_InsertExplicitAccessModifiersOnEnumerations"
|
||||
serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="Cleaning_InsertExplicitAccessModifiersOnInterfaces"
|
||||
serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="Cleaning_InsertExplicitAccessModifiersOnStructs"
|
||||
serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="Cleaning_InsertExplicitAccessModifiersOnMethods"
|
||||
serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
</SteveCadwallader.CodeMaid.Properties.Settings>
|
||||
</userSettings>
|
||||
</configuration>
|
7
QuickLook.Appx/.gitignore
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
.vs/*
|
||||
[Bb]in/
|
||||
[Oo]bj/
|
||||
AppPackages/*
|
||||
BundleArtifacts/*
|
||||
*.user
|
||||
*.cache
|
BIN
QuickLook.Appx/Images/BadgeLogo.scale-100.png
Normal file
After Width: | Height: | Size: 232 B |
BIN
QuickLook.Appx/Images/BadgeLogo.scale-125.png
Normal file
After Width: | Height: | Size: 227 B |
BIN
QuickLook.Appx/Images/BadgeLogo.scale-150.png
Normal file
After Width: | Height: | Size: 299 B |
BIN
QuickLook.Appx/Images/BadgeLogo.scale-200.png
Normal file
After Width: | Height: | Size: 319 B |
BIN
QuickLook.Appx/Images/BadgeLogo.scale-400.png
Normal file
After Width: | Height: | Size: 577 B |
BIN
QuickLook.Appx/Images/LargeTile.scale-100.png
Normal file
After Width: | Height: | Size: 9.3 KiB |
BIN
QuickLook.Appx/Images/LargeTile.scale-125.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
QuickLook.Appx/Images/LargeTile.scale-150.png
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
QuickLook.Appx/Images/LargeTile.scale-200.png
Normal file
After Width: | Height: | Size: 25 KiB |
BIN
QuickLook.Appx/Images/LargeTile.scale-400.png
Normal file
After Width: | Height: | Size: 67 KiB |
BIN
QuickLook.Appx/Images/SmallTile.scale-100.png
Normal file
After Width: | Height: | Size: 2.2 KiB |
BIN
QuickLook.Appx/Images/SmallTile.scale-125.png
Normal file
After Width: | Height: | Size: 3.0 KiB |
BIN
QuickLook.Appx/Images/SmallTile.scale-150.png
Normal file
After Width: | Height: | Size: 3.8 KiB |
BIN
QuickLook.Appx/Images/SmallTile.scale-200.png
Normal file
After Width: | Height: | Size: 5.3 KiB |
BIN
QuickLook.Appx/Images/SmallTile.scale-400.png
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
QuickLook.Appx/Images/SplashScreen.scale-100.png
Normal file
After Width: | Height: | Size: 10 KiB |
BIN
QuickLook.Appx/Images/SplashScreen.scale-125.png
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
QuickLook.Appx/Images/SplashScreen.scale-150.png
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
QuickLook.Appx/Images/SplashScreen.scale-200.png
Normal file
After Width: | Height: | Size: 28 KiB |
BIN
QuickLook.Appx/Images/SplashScreen.scale-400.png
Normal file
After Width: | Height: | Size: 71 KiB |
BIN
QuickLook.Appx/Images/Square150x150Logo.scale-100.png
Normal file
After Width: | Height: | Size: 3.8 KiB |
BIN
QuickLook.Appx/Images/Square150x150Logo.scale-125.png
Normal file
After Width: | Height: | Size: 4.9 KiB |
BIN
QuickLook.Appx/Images/Square150x150Logo.scale-150.png
Normal file
After Width: | Height: | Size: 6.4 KiB |
BIN
QuickLook.Appx/Images/Square150x150Logo.scale-200.png
Normal file
After Width: | Height: | Size: 9.3 KiB |
BIN
QuickLook.Appx/Images/Square150x150Logo.scale-400.png
Normal file
After Width: | Height: | Size: 25 KiB |
After Width: | Height: | Size: 782 B |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 22 KiB |
After Width: | Height: | Size: 1.8 KiB |
After Width: | Height: | Size: 2.9 KiB |
After Width: | Height: | Size: 782 B |
After Width: | Height: | Size: 22 KiB |
After Width: | Height: | Size: 1.8 KiB |
After Width: | Height: | Size: 2.9 KiB |
BIN
QuickLook.Appx/Images/Square44x44Logo.scale-100.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
QuickLook.Appx/Images/Square44x44Logo.scale-125.png
Normal file
After Width: | Height: | Size: 2.5 KiB |
BIN
QuickLook.Appx/Images/Square44x44Logo.scale-150.png
Normal file
After Width: | Height: | Size: 3.2 KiB |
BIN
QuickLook.Appx/Images/Square44x44Logo.scale-200.png
Normal file
After Width: | Height: | Size: 4.6 KiB |
BIN
QuickLook.Appx/Images/Square44x44Logo.scale-400.png
Normal file
After Width: | Height: | Size: 11 KiB |
BIN
QuickLook.Appx/Images/Square44x44Logo.targetsize-16.png
Normal file
After Width: | Height: | Size: 607 B |
BIN
QuickLook.Appx/Images/Square44x44Logo.targetsize-24.png
Normal file
After Width: | Height: | Size: 951 B |
After Width: | Height: | Size: 1.2 KiB |
BIN
QuickLook.Appx/Images/Square44x44Logo.targetsize-256.png
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
QuickLook.Appx/Images/Square44x44Logo.targetsize-32.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
QuickLook.Appx/Images/Square44x44Logo.targetsize-48.png
Normal file
After Width: | Height: | Size: 2.1 KiB |
BIN
QuickLook.Appx/Images/StoreLogo.scale-100.png
Normal file
After Width: | Height: | Size: 3.1 KiB |
BIN
QuickLook.Appx/Images/StoreLogo.scale-125.png
Normal file
After Width: | Height: | Size: 4.2 KiB |
BIN
QuickLook.Appx/Images/StoreLogo.scale-150.png
Normal file
After Width: | Height: | Size: 5.3 KiB |
BIN
QuickLook.Appx/Images/StoreLogo.scale-200.png
Normal file
After Width: | Height: | Size: 7.8 KiB |
BIN
QuickLook.Appx/Images/StoreLogo.scale-400.png
Normal file
After Width: | Height: | Size: 20 KiB |
BIN
QuickLook.Appx/Images/Wide310x150Logo.scale-100.png
Normal file
After Width: | Height: | Size: 4.0 KiB |
BIN
QuickLook.Appx/Images/Wide310x150Logo.scale-125.png
Normal file
After Width: | Height: | Size: 5.2 KiB |
BIN
QuickLook.Appx/Images/Wide310x150Logo.scale-150.png
Normal file
After Width: | Height: | Size: 6.8 KiB |
BIN
QuickLook.Appx/Images/Wide310x150Logo.scale-200.png
Normal file
After Width: | Height: | Size: 10 KiB |
BIN
QuickLook.Appx/Images/Wide310x150Logo.scale-400.png
Normal file
After Width: | Height: | Size: 28 KiB |
51
QuickLook.Appx/Package.appxmanifest
Normal file
@@ -0,0 +1,51 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<Package
|
||||
xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
|
||||
xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
|
||||
xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
|
||||
IgnorableNamespaces="uap rescap">
|
||||
|
||||
<Identity
|
||||
Name="CE36AF3D-FF94-43EB-9908-7EC8FD1D29FB"
|
||||
Publisher="CN=CE36AF3D-FF94-43EB-9908-7EC8FD1D29FB"
|
||||
Version="4.0.2.0" />
|
||||
|
||||
<Properties>
|
||||
<DisplayName>QuickLook</DisplayName>
|
||||
<PublisherDisplayName>ema</PublisherDisplayName>
|
||||
<Logo>Images\StoreLogo.png</Logo>
|
||||
</Properties>
|
||||
|
||||
<Dependencies>
|
||||
<TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.0.0" MaxVersionTested="10.0.0.0" />
|
||||
<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.14393.0" MaxVersionTested="10.0.14393.0" />
|
||||
</Dependencies>
|
||||
|
||||
<Resources>
|
||||
<Resource Language="x-generate"/>
|
||||
</Resources>
|
||||
|
||||
<Applications>
|
||||
<Application Id="App"
|
||||
Executable="$targetnametoken$.exe"
|
||||
EntryPoint="$targetentrypoint$">
|
||||
<uap:VisualElements
|
||||
DisplayName="QuickLook"
|
||||
Description="Bring macOS “Quick Look” feature to Windows"
|
||||
BackgroundColor="transparent"
|
||||
Square150x150Logo="Images\Square150x150Logo.png"
|
||||
Square44x44Logo="Images\Square44x44Logo.png">
|
||||
<uap:DefaultTile Wide310x150Logo="Images\Wide310x150Logo.png" Square71x71Logo="Images\SmallTile.png" Square310x310Logo="Images\LargeTile.png"/>
|
||||
<uap:SplashScreen Image="Images\SplashScreen.png" />
|
||||
<uap:LockScreen BadgeLogo="Images\BadgeLogo.png" Notification="badgeAndTileText"/>
|
||||
<uap:InitialRotationPreference>
|
||||
<uap:Rotation Preference="landscape"/></uap:InitialRotationPreference>
|
||||
</uap:VisualElements>
|
||||
</Application>
|
||||
</Applications>
|
||||
|
||||
<Capabilities>
|
||||
<rescap:Capability Name="runFullTrust" />
|
||||
</Capabilities>
|
||||
</Package>
|
113
QuickLook.Appx/QuickLook.Appx.wapproj
Normal file
@@ -0,0 +1,113 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="15.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup Condition="'$(VisualStudioVersion)' == '' or '$(VisualStudioVersion)' < '15.0'">
|
||||
<VisualStudioVersion>15.0</VisualStudioVersion>
|
||||
</PropertyGroup>
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug|x64">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|x64">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup>
|
||||
<WapProjPath Condition="'$(WapProjPath)'==''">$(MSBuildExtensionsPath)\Microsoft\DesktopBridge\</WapProjPath>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(WapProjPath)\Microsoft.DesktopBridge.props" />
|
||||
<PropertyGroup>
|
||||
<ProjectGuid>0b2465a9-2dc4-41c6-9fd5-af357969b85c</ProjectGuid>
|
||||
<TargetPlatformVersion>10.0.26100.0</TargetPlatformVersion>
|
||||
<TargetPlatformMinVersion>10.0.18362.0</TargetPlatformMinVersion>
|
||||
<DefaultLanguage>en-US</DefaultLanguage>
|
||||
<AppxPackageSigningEnabled>True</AppxPackageSigningEnabled>
|
||||
<NoWarn>$(NoWarn);NU1702</NoWarn>
|
||||
<PackageCertificateThumbprint>2C4426FFCBF7BB78EA1856105CCAAC44F7D91F04</PackageCertificateThumbprint>
|
||||
<GenerateAppInstallerFile>False</GenerateAppInstallerFile>
|
||||
<AppxPackageSigningTimestampDigestAlgorithm>SHA256</AppxPackageSigningTimestampDigestAlgorithm>
|
||||
<AppxAutoIncrementPackageRevision>False</AppxAutoIncrementPackageRevision>
|
||||
<GenerateTestArtifacts>True</GenerateTestArtifacts>
|
||||
<AppxBundlePlatforms>x64</AppxBundlePlatforms>
|
||||
<HoursBetweenUpdateChecks>0</HoursBetweenUpdateChecks>
|
||||
<AppxSymbolPackageEnabled>True</AppxSymbolPackageEnabled>
|
||||
<EntryPointProjectUniqueName>..\QuickLook\QuickLook.csproj</EntryPointProjectUniqueName>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<AppxBundle>Always</AppxBundle>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<AppxBundle>Always</AppxBundle>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<AppxManifest Include="Package.appxmanifest">
|
||||
<SubType>Designer</SubType>
|
||||
</AppxManifest>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="Images\Wide310x150Logo.scale-400.png" />
|
||||
<Content Include="Images\BadgeLogo.scale-100.png" />
|
||||
<Content Include="Images\BadgeLogo.scale-125.png" />
|
||||
<Content Include="Images\BadgeLogo.scale-150.png" />
|
||||
<Content Include="Images\BadgeLogo.scale-200.png" />
|
||||
<Content Include="Images\BadgeLogo.scale-400.png" />
|
||||
<Content Include="Images\LargeTile.scale-100.png" />
|
||||
<Content Include="Images\LargeTile.scale-125.png" />
|
||||
<Content Include="Images\LargeTile.scale-150.png" />
|
||||
<Content Include="Images\LargeTile.scale-200.png" />
|
||||
<Content Include="Images\LargeTile.scale-400.png" />
|
||||
<Content Include="Images\SmallTile.scale-100.png" />
|
||||
<Content Include="Images\SmallTile.scale-125.png" />
|
||||
<Content Include="Images\SmallTile.scale-150.png" />
|
||||
<Content Include="Images\SmallTile.scale-200.png" />
|
||||
<Content Include="Images\SmallTile.scale-400.png" />
|
||||
<Content Include="Images\SplashScreen.scale-100.png" />
|
||||
<Content Include="Images\SplashScreen.scale-125.png" />
|
||||
<Content Include="Images\SplashScreen.scale-150.png" />
|
||||
<Content Include="Images\SplashScreen.scale-200.png" />
|
||||
<Content Include="Images\SplashScreen.scale-400.png" />
|
||||
<Content Include="Images\Square150x150Logo.scale-100.png" />
|
||||
<Content Include="Images\Square150x150Logo.scale-125.png" />
|
||||
<Content Include="Images\Square150x150Logo.scale-150.png" />
|
||||
<Content Include="Images\Square150x150Logo.scale-200.png" />
|
||||
<Content Include="Images\Square150x150Logo.scale-400.png" />
|
||||
<Content Include="Images\Square44x44Logo.altform-lightunplated_targetsize-16.png" />
|
||||
<Content Include="Images\Square44x44Logo.altform-lightunplated_targetsize-24.png" />
|
||||
<Content Include="Images\Square44x44Logo.altform-lightunplated_targetsize-256.png" />
|
||||
<Content Include="Images\Square44x44Logo.altform-lightunplated_targetsize-32.png" />
|
||||
<Content Include="Images\Square44x44Logo.altform-lightunplated_targetsize-48.png" />
|
||||
<Content Include="Images\Square44x44Logo.altform-unplated_targetsize-16.png" />
|
||||
<Content Include="Images\Square44x44Logo.altform-unplated_targetsize-256.png" />
|
||||
<Content Include="Images\Square44x44Logo.altform-unplated_targetsize-32.png" />
|
||||
<Content Include="Images\Square44x44Logo.altform-unplated_targetsize-48.png" />
|
||||
<Content Include="Images\Square44x44Logo.scale-100.png" />
|
||||
<Content Include="Images\Square44x44Logo.scale-125.png" />
|
||||
<Content Include="Images\Square44x44Logo.scale-150.png" />
|
||||
<Content Include="Images\Square44x44Logo.scale-200.png" />
|
||||
<Content Include="Images\Square44x44Logo.scale-400.png" />
|
||||
<Content Include="Images\Square44x44Logo.targetsize-16.png" />
|
||||
<Content Include="Images\Square44x44Logo.targetsize-24.png" />
|
||||
<Content Include="Images\Square44x44Logo.targetsize-24_altform-unplated.png" />
|
||||
<Content Include="Images\Square44x44Logo.targetsize-256.png" />
|
||||
<Content Include="Images\Square44x44Logo.targetsize-32.png" />
|
||||
<Content Include="Images\Square44x44Logo.targetsize-48.png" />
|
||||
<Content Include="Images\StoreLogo.scale-100.png" />
|
||||
<Content Include="Images\StoreLogo.scale-125.png" />
|
||||
<Content Include="Images\StoreLogo.scale-150.png" />
|
||||
<Content Include="Images\StoreLogo.scale-200.png" />
|
||||
<Content Include="Images\StoreLogo.scale-400.png" />
|
||||
<Content Include="Images\Wide310x150Logo.scale-100.png" />
|
||||
<Content Include="Images\Wide310x150Logo.scale-125.png" />
|
||||
<Content Include="Images\Wide310x150Logo.scale-150.png" />
|
||||
<Content Include="Images\Wide310x150Logo.scale-200.png" />
|
||||
<None Include="sideload.pfx" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(WapProjPath)\Microsoft.DesktopBridge.targets" />
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.Windows.SDK.BuildTools" Version="10.0.26100.1" PrivateAssets="all" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\QuickLook\QuickLook.csproj" />
|
||||
</ItemGroup>
|
||||
</Project>
|
@@ -2,7 +2,7 @@
|
||||
|
||||
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
|
||||
<Product Id="*" Name="QuickLook" Language="1033"
|
||||
Version="!(bind.FileVersion.fil22F7B7F07E63622AD2451459086A3CF2)" Manufacturer="Paddy Xu"
|
||||
Version="!(bind.FileVersion.fil22F7B7F07E63622AD2451459086A3CF2)" Manufacturer="QL-Win"
|
||||
UpgradeCode="c83b9c02-87d6-494e-9f5f-cf4c3900a54d">
|
||||
<Package InstallerVersion="500" Compressed="yes" Platform="x86" InstallScope="perUser" />
|
||||
|
||||
|
@@ -1,14 +1,15 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" DefaultTargets="Build" InitialTargets="EnsureWixToolsetInstalled" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<Project ToolsVersion="Current" DefaultTargets="Build" InitialTargets="EnsureWixToolsetInstalled" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
|
||||
<ProductVersion>3.10</ProductVersion>
|
||||
<ProductVersion>3.14</ProductVersion>
|
||||
<ProjectGuid>f0214fc2-efbe-426c-842d-b42bc37d9525</ProjectGuid>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<OutputName>QuickLook</OutputName>
|
||||
<OutputType>Package</OutputType>
|
||||
<OutputPath>..\Build\</OutputPath>
|
||||
<LangVersion>latest</LangVersion>
|
||||
<IntermediateOutputPath>obj\$(Configuration)\</IntermediateOutputPath>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
|
||||
@@ -32,9 +33,9 @@
|
||||
<Content Include="gpl.rtf" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(WixTargetsPath)" Condition=" '$(WixTargetsPath)' != '' " />
|
||||
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\Wix.targets" Condition=" '$(WixTargetsPath)' == '' AND Exists('$(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\Wix.targets') " />
|
||||
<Import Project="$(MSBuildExtensionsPath)\Microsoft\WiX\v3.x\Wix.targets" Condition=" '$(WixTargetsPath)' == '' AND Exists('$(MSBuildExtensionsPath)\Microsoft\WiX\v3.x\Wix.targets') " />
|
||||
<Target Name="EnsureWixToolsetInstalled" Condition=" '$(WixTargetsImported)' != 'true' ">
|
||||
<Error Text="The WiX Toolset v3.11 (or newer) build tools must be installed to build this project. To download the WiX Toolset, see http://wixtoolset.org/releases/" />
|
||||
<Error Text="The WiX Toolset v3.14 (or newer) build tools must be installed to build this project. To download the WiX Toolset, see http://wixtoolset.org/releases/" />
|
||||
</Target>
|
||||
<PropertyGroup>
|
||||
<PostBuildEvent>powershell -file "$(SolutionDir)Scripts\rename-msi.ps1"
|
||||
@@ -44,16 +45,16 @@ powershell -file "$(SolutionDir)Scripts\pack-zip.ps1"</PostBuildEvent>
|
||||
<PropertyGroup>
|
||||
<PreBuildEvent>rmdir /S /Q "$(SolutionDir)Build\Package"
|
||||
|
||||
robocopy "$(SolutionDir)Build\$(Configuration)" "$(SolutionDir)Build\Package" %2a.%2a /e /njh /njs /ndl /nfl /nc /ns /np /xf %2a.pdb /xf %2a.obj /xf %2a.ipdb /xf %2a.iobj /xf %2a.exp /xf %2a.lib /xf %2a.ilk /xf %2a.xml
|
||||
robocopy "$(SolutionDir)Build\$(Configuration)" "$(SolutionDir)Build\Package" *.* /e /njh /njs /ndl /nfl /nc /ns /np /xf *.pdb /xf *.obj /xf *.ipdb /xf *.iobj /xf *.exp /xf *.lib /xf *.ilk /xf *.xml
|
||||
|
||||
"$(WIX)bin\heat" dir "$(SolutionDir)Build\Package" -dr INSTALLFOLDER -cg QuickLookComponents -gg -g1 -sf -srd -sreg -var "var.PackageDir" -out "$(ProjectDir)C_QuickLookComponents.wxs"</PreBuildEvent>
|
||||
</PropertyGroup>
|
||||
<!--
|
||||
To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Wix.targets.
|
||||
<Target Name="BeforeBuild">
|
||||
</Target>
|
||||
<Target Name="AfterBuild">
|
||||
</Target>
|
||||
-->
|
||||
</Project>
|
||||
To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Wix.targets.
|
||||
<Target Name="BeforeBuild">
|
||||
</Target>
|
||||
<Target Name="AfterBuild">
|
||||
</Target>
|
||||
-->
|
||||
</Project>
|
||||
|
@@ -1,4 +1,4 @@
|
||||
// Copyright © 2017 Paddy Xu
|
||||
// Copyright © 2017-2025 QL-Win Contributors
|
||||
//
|
||||
// This file is part of QuickLook program.
|
||||
//
|
||||
@@ -34,111 +34,111 @@ PCHAR pXmlBuffer;
|
||||
|
||||
void DOpus::GetSelected(PWCHAR buffer)
|
||||
{
|
||||
/*
|
||||
* CPU Disasm
|
||||
* 6A44B588 |. 68 A839526A PUSH OFFSET 6A5239A8 ; /WindowName = "Directory Opus"
|
||||
* 6A44B58D |. 68 6459526A PUSH OFFSET 6A525964 ; |ClassName = "DOpus.ParentWindow"
|
||||
* 6A44B592 |. 894424 40 MOV DWORD PTR SS:[ESP+40],EAX ; |
|
||||
* 6A44B596 |. C74424 30 140 MOV DWORD PTR SS:[ESP+30],14 ; |
|
||||
* 6A44B59E |. FFD7 CALL EDI ; \USER32.FindWindowW
|
||||
* ...
|
||||
* 00BC2E9B |. 50 PUSH EAX ; /lParam = 12FE80C -> 15 ;
|
||||
* 00BC2E9C |. 57 PUSH EDI ; |wParam ; class = dopusrt.getinfo
|
||||
* 00BC2E9D |. 6A 4A PUSH 4A ; |Msg = WM_COPYDATA
|
||||
* 00BC2E9F |. FF75 FC PUSH DWORD PTR SS:[LOCAL.1] ; |hWnd => [LOCAL.1] ; class = DOpus.ParentWindow, text = Directory Opus
|
||||
* 00BC2EA2 |. FF15 0802C000 CALL DWORD PTR DS:[<&USER32.SendMessageW ; \USER32.SendMessageW
|
||||
*
|
||||
* CPU Stack
|
||||
* 012FE80C |00000015
|
||||
* 012FE810 |00000010
|
||||
* 012FE814 |013A26C0 ; UNICODE "listsel"
|
||||
*/
|
||||
/*
|
||||
* CPU Disasm
|
||||
* 6A44B588 |. 68 A839526A PUSH OFFSET 6A5239A8 ; /WindowName = "Directory Opus"
|
||||
* 6A44B58D |. 68 6459526A PUSH OFFSET 6A525964 ; |ClassName = "DOpus.ParentWindow"
|
||||
* 6A44B592 |. 894424 40 MOV DWORD PTR SS:[ESP+40],EAX ; |
|
||||
* 6A44B596 |. C74424 30 140 MOV DWORD PTR SS:[ESP+30],14 ; |
|
||||
* 6A44B59E |. FFD7 CALL EDI ; \USER32.FindWindowW
|
||||
* ...
|
||||
* 00BC2E9B |. 50 PUSH EAX ; /lParam = 12FE80C -> 15 ;
|
||||
* 00BC2E9C |. 57 PUSH EDI ; |wParam ; class = dopusrt.getinfo
|
||||
* 00BC2E9D |. 6A 4A PUSH 4A ; |Msg = WM_COPYDATA
|
||||
* 00BC2E9F |. FF75 FC PUSH DWORD PTR SS:[LOCAL.1] ; |hWnd => [LOCAL.1] ; class = DOpus.ParentWindow, text = Directory Opus
|
||||
* 00BC2EA2 |. FF15 0802C000 CALL DWORD PTR DS:[<&USER32.SendMessageW ; \USER32.SendMessageW
|
||||
*
|
||||
* CPU Stack
|
||||
* 012FE80C |00000015
|
||||
* 012FE810 |00000010
|
||||
* 012FE814 |013A26C0 ; UNICODE "listsel"
|
||||
*/
|
||||
|
||||
if (hMsgWnd == nullptr)
|
||||
PrepareMessageWindow();
|
||||
if (hMsgWnd == nullptr)
|
||||
return;
|
||||
if (hMsgWnd == nullptr)
|
||||
PrepareMessageWindow();
|
||||
if (hMsgWnd == nullptr)
|
||||
return;
|
||||
|
||||
PWCHAR data = DOPUS_IPC_LP_DATA;
|
||||
COPYDATASTRUCT cds;
|
||||
cds.dwData = DOPUS_IPC_LP_INFO;
|
||||
cds.cbData = static_cast<DWORD>(wcslen(data) + 1) * sizeof WCHAR;
|
||||
cds.lpData = data;
|
||||
PWCHAR data = DOPUS_IPC_LP_DATA;
|
||||
COPYDATASTRUCT cds;
|
||||
cds.dwData = DOPUS_IPC_LP_INFO;
|
||||
cds.cbData = static_cast<DWORD>(wcslen(data) + 1) * sizeof WCHAR;
|
||||
cds.lpData = data;
|
||||
|
||||
auto ret = SendMessage(FindWindow(DOPUS_CLASS, DOPUS_NAME), WM_COPYDATA, reinterpret_cast<WPARAM>(hMsgWnd),
|
||||
reinterpret_cast<LPARAM>(&cds));
|
||||
if (!ret)
|
||||
return;
|
||||
auto ret = SendMessage(FindWindow(DOPUS_CLASS, DOPUS_NAME), WM_COPYDATA, reinterpret_cast<WPARAM>(hMsgWnd),
|
||||
reinterpret_cast<LPARAM>(&cds));
|
||||
if (!ret)
|
||||
return;
|
||||
|
||||
WaitForSingleObject(hGetResultEvent, 2000);
|
||||
WaitForSingleObject(hGetResultEvent, 2000);
|
||||
|
||||
ParseXmlBuffer(buffer);
|
||||
ParseXmlBuffer(buffer);
|
||||
|
||||
delete[] pXmlBuffer;
|
||||
delete[] pXmlBuffer;
|
||||
}
|
||||
|
||||
void DOpus::ParseXmlBuffer(PWCHAR buffer)
|
||||
{
|
||||
/*
|
||||
* <?xml version="1.0" encoding="UTF-8"?>
|
||||
* <results command="listsel" result="1">
|
||||
* <items display_path="C:\folder" lister="0x707f6" path="C:\folder" tab="0xb0844">
|
||||
* <item id="11" name="1.jpg" path="C:\folder\1.jpg" type="0" />
|
||||
* <item id="12" name="2.zip" path="C:\folder\2.zip" type="1" />
|
||||
* ...
|
||||
*/
|
||||
/*
|
||||
* <?xml version="1.0" encoding="UTF-8"?>
|
||||
* <results command="listsel" result="1">
|
||||
* <items display_path="C:\folder" lister="0x707f6" path="C:\folder" tab="0xb0844">
|
||||
* <item id="11" name="1.jpg" path="C:\folder\1.jpg" type="0" />
|
||||
* <item id="12" name="2.zip" path="C:\folder\2.zip" type="1" />
|
||||
* ...
|
||||
*/
|
||||
|
||||
using namespace rapidxml;
|
||||
using namespace rapidxml;
|
||||
|
||||
xml_document<> doc;
|
||||
doc.parse<0>(pXmlBuffer);
|
||||
xml_document<> doc;
|
||||
doc.parse<0>(pXmlBuffer);
|
||||
|
||||
auto results = doc.first_node("results");
|
||||
auto items = results->first_node("items");
|
||||
for (auto item = items->first_node("item"); item; item = item->next_sibling("item"))
|
||||
{
|
||||
auto path = item->first_attribute("path")->value();
|
||||
auto results = doc.first_node("results");
|
||||
auto items = results->first_node("items");
|
||||
for (auto item = items->first_node("item"); item; item = item->next_sibling("item"))
|
||||
{
|
||||
auto path = item->first_attribute("path")->value();
|
||||
|
||||
auto size = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, path, -1, nullptr, 0);
|
||||
auto b = new WCHAR[size];
|
||||
MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, path, -1, b, size);
|
||||
auto size = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, path, -1, nullptr, 0);
|
||||
auto b = new WCHAR[size];
|
||||
MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, path, -1, b, size);
|
||||
|
||||
wcscpy_s(buffer, wcslen(b) + 1, b); // DOpus supports Long Path
|
||||
wcscpy_s(buffer, wcslen(b) + 1, b); // DOpus supports Long Path
|
||||
|
||||
delete[] b;
|
||||
return; // we now cares only the first result
|
||||
}
|
||||
delete[] b;
|
||||
return; // we now cares only the first result
|
||||
}
|
||||
}
|
||||
|
||||
void DOpus::PrepareMessageWindow()
|
||||
{
|
||||
WNDCLASSEX wx = {sizeof wx};
|
||||
wx.cbSize = sizeof(WNDCLASSEX);
|
||||
wx.lpfnWndProc = msgWindowProc;
|
||||
wx.lpszClassName = MSGWINDOW_CLASS;
|
||||
WNDCLASSEX wx = {sizeof wx};
|
||||
wx.cbSize = sizeof(WNDCLASSEX);
|
||||
wx.lpfnWndProc = msgWindowProc;
|
||||
wx.lpszClassName = MSGWINDOW_CLASS;
|
||||
|
||||
if (RegisterClassEx(&wx))
|
||||
hMsgWnd = CreateWindowEx(0, MSGWINDOW_CLASS, L"", 0, 0, 0, 0, 0, HWND_MESSAGE, nullptr, nullptr, nullptr);
|
||||
if (RegisterClassEx(&wx))
|
||||
hMsgWnd = CreateWindowEx(0, MSGWINDOW_CLASS, L"", 0, 0, 0, 0, 0, HWND_MESSAGE, nullptr, nullptr, nullptr);
|
||||
|
||||
hGetResultEvent = CreateEvent(nullptr, FALSE, FALSE, nullptr);
|
||||
hGetResultEvent = CreateEvent(nullptr, FALSE, FALSE, nullptr);
|
||||
}
|
||||
|
||||
LRESULT CALLBACK DOpus::msgWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
switch (uMsg)
|
||||
{
|
||||
case WM_COPYDATA:
|
||||
{
|
||||
auto cds = reinterpret_cast<PCOPYDATASTRUCT>(lParam);
|
||||
auto buf = static_cast<PCHAR>(cds->lpData);
|
||||
switch (uMsg)
|
||||
{
|
||||
case WM_COPYDATA:
|
||||
{
|
||||
auto cds = reinterpret_cast<PCOPYDATASTRUCT>(lParam);
|
||||
auto buf = static_cast<PCHAR>(cds->lpData);
|
||||
|
||||
pXmlBuffer = new CHAR[cds->cbData + 1]{'\0'};
|
||||
memcpy(pXmlBuffer, buf, cds->cbData);
|
||||
pXmlBuffer = new CHAR[cds->cbData + 1]{'\0'};
|
||||
memcpy(pXmlBuffer, buf, cds->cbData);
|
||||
|
||||
SetEvent(hGetResultEvent);
|
||||
return 0;
|
||||
}
|
||||
default:
|
||||
return DefWindowProc(hWnd, uMsg, wParam, lParam);
|
||||
}
|
||||
SetEvent(hGetResultEvent);
|
||||
return 0;
|
||||
}
|
||||
default:
|
||||
return DefWindowProc(hWnd, uMsg, wParam, lParam);
|
||||
}
|
||||
}
|
||||
|
@@ -1,4 +1,4 @@
|
||||
// Copyright © 2017 Paddy Xu
|
||||
// Copyright © 2017-2025 QL-Win Contributors
|
||||
//
|
||||
// This file is part of QuickLook program.
|
||||
//
|
||||
@@ -19,9 +19,9 @@
|
||||
class DOpus
|
||||
{
|
||||
public:
|
||||
static void PrepareMessageWindow();
|
||||
static void GetSelected(PWCHAR buffer);
|
||||
static void PrepareMessageWindow();
|
||||
static void GetSelected(PWCHAR buffer);
|
||||
private:
|
||||
static void ParseXmlBuffer(PWCHAR buffer);
|
||||
static LRESULT CALLBACK msgWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
||||
static void ParseXmlBuffer(PWCHAR buffer);
|
||||
static LRESULT CALLBACK msgWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
||||
};
|
||||
|
@@ -1,4 +1,4 @@
|
||||
// Copyright © 2017 Paddy Xu
|
||||
// Copyright © 2017-2025 QL-Win Contributors
|
||||
//
|
||||
// This file is part of QuickLook program.
|
||||
//
|
||||
@@ -34,122 +34,122 @@ static WCHAR filePathBuffer[MAX_PATH] = {'\0'};
|
||||
|
||||
void DialogHook::GetSelected(PWCHAR buffer)
|
||||
{
|
||||
if (HelperMethods::IsUWP())
|
||||
return;
|
||||
if (HelperMethods::IsUWP())
|
||||
return;
|
||||
|
||||
auto hwndfg = GetForegroundWindow();
|
||||
DWORD pid = 0;
|
||||
auto tid = GetWindowThreadProcessId(hwndfg, &pid);
|
||||
auto hwndfg = GetForegroundWindow();
|
||||
DWORD pid = 0;
|
||||
auto tid = GetWindowThreadProcessId(hwndfg, &pid);
|
||||
|
||||
auto hProc = OpenProcess(PROCESS_QUERY_INFORMATION, false, pid);
|
||||
if (hProc == nullptr)
|
||||
return;
|
||||
auto hProc = OpenProcess(PROCESS_QUERY_INFORMATION, false, pid);
|
||||
if (hProc == nullptr)
|
||||
return;
|
||||
|
||||
if (WM_HOOK_NOTIFY == 0)
|
||||
WM_HOOK_NOTIFY = RegisterWindowMessage(L"WM_QUICKLOOK_HOOK_NOTIFY_MSG");
|
||||
if (WM_HOOK_NOTIFY == 0)
|
||||
WM_HOOK_NOTIFY = RegisterWindowMessage(L"WM_QUICKLOOK_HOOK_NOTIFY_MSG");
|
||||
|
||||
BOOL isTargetWoW64 = false;
|
||||
if (!IsWow64Process(hProc, &isTargetWoW64))
|
||||
return;
|
||||
BOOL isTargetWoW64 = false;
|
||||
if (!IsWow64Process(hProc, &isTargetWoW64))
|
||||
return;
|
||||
|
||||
CloseHandle(hProc);
|
||||
CloseHandle(hProc);
|
||||
|
||||
BOOL isSelfWoW64 = false;
|
||||
if (!IsWow64Process(GetCurrentProcess(), &isSelfWoW64))
|
||||
return;
|
||||
BOOL isSelfWoW64 = false;
|
||||
if (!IsWow64Process(GetCurrentProcess(), &isSelfWoW64))
|
||||
return;
|
||||
|
||||
// if QuickLook is 64bit and target is 32bit, obtain result from the helper
|
||||
if (isTargetWoW64 && !isSelfWoW64)
|
||||
{
|
||||
GetSelectedFromWoW64HookHelper(buffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (ghHook != nullptr)
|
||||
UnhookWindowsHookEx(ghHook);
|
||||
ghHook = SetWindowsHookEx(WH_CALLWNDPROC, static_cast<HOOKPROC>(MsgHookProc), ModuleFromAddress(MsgHookProc), tid);
|
||||
if (ghHook == nullptr)
|
||||
return;
|
||||
// if QuickLook is 64bit and target is 32bit, obtain result from the helper
|
||||
if (isTargetWoW64 && !isSelfWoW64)
|
||||
{
|
||||
GetSelectedFromWoW64HookHelper(buffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (ghHook != nullptr)
|
||||
UnhookWindowsHookEx(ghHook);
|
||||
ghHook = SetWindowsHookEx(WH_CALLWNDPROC, static_cast<HOOKPROC>(MsgHookProc), ModuleFromAddress(MsgHookProc), tid);
|
||||
if (ghHook == nullptr)
|
||||
return;
|
||||
|
||||
SendMessage(hwndfg, WM_HOOK_NOTIFY, 0, 0);
|
||||
|
||||
GetLongPathName(filePathBuffer, buffer, MAX_PATH_EX);
|
||||
}
|
||||
SendMessage(hwndfg, WM_HOOK_NOTIFY, 0, 0);
|
||||
|
||||
GetLongPathName(filePathBuffer, buffer, MAX_PATH_EX);
|
||||
}
|
||||
}
|
||||
|
||||
void DialogHook::getSelectedInternal(CComPtr<IShellBrowser> psb, PWCHAR buffer)
|
||||
{
|
||||
CComPtr<IShellView> psv;
|
||||
if (FAILED(psb->QueryActiveShellView(&psv)))
|
||||
return;
|
||||
CComPtr<IShellView> psv;
|
||||
if (FAILED(psb->QueryActiveShellView(&psv)))
|
||||
return;
|
||||
|
||||
CComPtr<IDataObject> dao;
|
||||
if (FAILED(psv->GetItemObject(SVGIO_SELECTION, IID_IDataObject, reinterpret_cast<void**>(&dao))))
|
||||
return;
|
||||
CComPtr<IDataObject> dao;
|
||||
if (FAILED(psv->GetItemObject(SVGIO_SELECTION, IID_IDataObject, reinterpret_cast<void**>(&dao))))
|
||||
return;
|
||||
|
||||
return HelperMethods::ObtainFirstItem(dao, buffer);
|
||||
return HelperMethods::ObtainFirstItem(dao, buffer);
|
||||
}
|
||||
|
||||
void DialogHook::GetSelectedFromWoW64HookHelper(PWCHAR buffer)
|
||||
{
|
||||
if (!WoW64HookHelper::CheckStatus())
|
||||
if (!WoW64HookHelper::Launch())
|
||||
return;
|
||||
if (!WoW64HookHelper::CheckStatus())
|
||||
if (!WoW64HookHelper::Launch())
|
||||
return;
|
||||
|
||||
auto hHelperWnd = FindWindowEx(HWND_MESSAGE, nullptr, WoW64HookHelper::GetMsgWindowClassName(), nullptr);
|
||||
if (hHelperWnd == nullptr)
|
||||
return;
|
||||
auto hHelperWnd = FindWindowEx(HWND_MESSAGE, nullptr, WoW64HookHelper::GetMsgWindowClassName(), nullptr);
|
||||
if (hHelperWnd == nullptr)
|
||||
return;
|
||||
|
||||
auto hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, nullptr, PAGE_READWRITE, 0, MAX_PATH * sizeof WCHAR,
|
||||
SHARED_MEM_NAME);
|
||||
if (hMapFile == nullptr)
|
||||
return;
|
||||
auto hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, nullptr, PAGE_READWRITE, 0, MAX_PATH * sizeof WCHAR,
|
||||
SHARED_MEM_NAME);
|
||||
if (hMapFile == nullptr)
|
||||
return;
|
||||
|
||||
auto sharedBuffer = static_cast<PWCHAR>(MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, MAX_PATH * sizeof WCHAR));
|
||||
if (sharedBuffer == nullptr)
|
||||
{
|
||||
CloseHandle(hMapFile);
|
||||
return;
|
||||
}
|
||||
auto sharedBuffer = static_cast<PWCHAR>(MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, MAX_PATH * sizeof WCHAR));
|
||||
if (sharedBuffer == nullptr)
|
||||
{
|
||||
CloseHandle(hMapFile);
|
||||
return;
|
||||
}
|
||||
|
||||
SendMessage(hHelperWnd, WM_HOOK_NOTIFY, 0, 0);
|
||||
SendMessage(hHelperWnd, WM_HOOK_NOTIFY, 0, 0);
|
||||
|
||||
// the sharedBuffer should now ready
|
||||
GetLongPathName(sharedBuffer, buffer, MAX_PATH_EX);
|
||||
// the sharedBuffer should now ready
|
||||
GetLongPathName(sharedBuffer, buffer, MAX_PATH_EX);
|
||||
|
||||
UnmapViewOfFile(sharedBuffer);
|
||||
CloseHandle(hMapFile);
|
||||
UnmapViewOfFile(sharedBuffer);
|
||||
CloseHandle(hMapFile);
|
||||
}
|
||||
|
||||
HMODULE DialogHook::ModuleFromAddress(PVOID pv)
|
||||
{
|
||||
MEMORY_BASIC_INFORMATION mbi;
|
||||
return VirtualQuery(pv, &mbi, sizeof mbi) != 0 ? static_cast<HMODULE>(mbi.AllocationBase) : nullptr;
|
||||
MEMORY_BASIC_INFORMATION mbi;
|
||||
return VirtualQuery(pv, &mbi, sizeof mbi) != 0 ? static_cast<HMODULE>(mbi.AllocationBase) : nullptr;
|
||||
}
|
||||
|
||||
LRESULT DialogHook::MsgHookProc(int nCode, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
if (nCode < 0)
|
||||
goto CONTINUE;
|
||||
if (nCode < 0)
|
||||
goto CONTINUE;
|
||||
|
||||
auto pMSG = reinterpret_cast<CWPSTRUCT*>(lParam);
|
||||
auto pMSG = reinterpret_cast<CWPSTRUCT*>(lParam);
|
||||
|
||||
// only response to WM_HOOK_NOTIFY
|
||||
if (pMSG->message != WM_HOOK_NOTIFY)
|
||||
goto CONTINUE;
|
||||
// only response to WM_HOOK_NOTIFY
|
||||
if (pMSG->message != WM_HOOK_NOTIFY)
|
||||
goto CONTINUE;
|
||||
|
||||
UnhookWindowsHookEx(ghHook);
|
||||
ghHook = nullptr;
|
||||
UnhookWindowsHookEx(ghHook);
|
||||
ghHook = nullptr;
|
||||
|
||||
// get current selected item
|
||||
auto psb = reinterpret_cast<IShellBrowser*>(SendMessage(GetForegroundWindow(), WM_USER + 7, 0, 0));
|
||||
if (psb == nullptr)
|
||||
goto CONTINUE;
|
||||
// get current selected item
|
||||
auto psb = reinterpret_cast<IShellBrowser*>(SendMessage(GetForegroundWindow(), WM_USER + 7, 0, 0));
|
||||
if (psb == nullptr)
|
||||
goto CONTINUE;
|
||||
|
||||
getSelectedInternal(psb, filePathBuffer);
|
||||
getSelectedInternal(psb, filePathBuffer);
|
||||
|
||||
return 0;
|
||||
return 0;
|
||||
|
||||
CONTINUE:
|
||||
return CallNextHookEx(ghHook, nCode, wParam, lParam);
|
||||
return CallNextHookEx(ghHook, nCode, wParam, lParam);
|
||||
}
|
||||
|
@@ -1,4 +1,4 @@
|
||||
// Copyright © 2017 Paddy Xu
|
||||
// Copyright © 2017-2025 QL-Win Contributors
|
||||
//
|
||||
// This file is part of QuickLook program.
|
||||
//
|
||||
@@ -19,11 +19,11 @@
|
||||
class DialogHook
|
||||
{
|
||||
public:
|
||||
static void GetSelected(PWCHAR buffer);
|
||||
static void GetSelected(PWCHAR buffer);
|
||||
|
||||
private:
|
||||
static void getSelectedInternal(CComPtr<IShellBrowser> psb, PWCHAR buffer);
|
||||
static void GetSelectedFromWoW64HookHelper(PWCHAR buffer);
|
||||
static HMODULE ModuleFromAddress(PVOID pv);
|
||||
static LRESULT CALLBACK MsgHookProc(int nCode, WPARAM wParam, LPARAM lParam);
|
||||
static void getSelectedInternal(CComPtr<IShellBrowser> psb, PWCHAR buffer);
|
||||
static void GetSelectedFromWoW64HookHelper(PWCHAR buffer);
|
||||
static HMODULE ModuleFromAddress(PVOID pv);
|
||||
static LRESULT CALLBACK MsgHookProc(int nCode, WPARAM wParam, LPARAM lParam);
|
||||
};
|
||||
|
@@ -1,4 +1,4 @@
|
||||
// Copyright © 2017 Paddy Xu
|
||||
// Copyright © 2017-2025 QL-Win Contributors
|
||||
//
|
||||
// This file is part of QuickLook program.
|
||||
//
|
||||
@@ -20,23 +20,25 @@
|
||||
#include "Shell32.h"
|
||||
#include "WoW64HookHelper.h"
|
||||
#include "DOpus.h"
|
||||
#include "MultiCommander.h"
|
||||
|
||||
#define EXPORT extern "C" __declspec(dllexport)
|
||||
|
||||
EXPORT void Init()
|
||||
{
|
||||
#ifdef WIN64
|
||||
WoW64HookHelper::Launch();
|
||||
WoW64HookHelper::Launch();
|
||||
#endif
|
||||
DOpus::PrepareMessageWindow();
|
||||
DOpus::PrepareMessageWindow();
|
||||
MultiCommander::PrepareMessageWindow();
|
||||
}
|
||||
|
||||
EXPORT Shell32::FocusedWindowType GetFocusedWindowType()
|
||||
{
|
||||
return Shell32::GetFocusedWindowType();
|
||||
return Shell32::GetFocusedWindowType();
|
||||
}
|
||||
|
||||
EXPORT void GetCurrentSelection(PWCHAR buffer)
|
||||
{
|
||||
Shell32::GetCurrentSelection(buffer);
|
||||
Shell32::GetCurrentSelection(buffer);
|
||||
}
|
||||
|
@@ -1,4 +1,4 @@
|
||||
// Copyright © 2017 Paddy Xu
|
||||
// Copyright © 2017-2025 QL-Win Contributors
|
||||
//
|
||||
// This file is part of QuickLook program.
|
||||
//
|
||||
@@ -18,44 +18,68 @@
|
||||
#include "stdafx.h"
|
||||
#include "Everything.h"
|
||||
|
||||
#define EVERYTHING_IPC_SEARCH_CLIENT_WNDCLASSW L"EVERYTHING"
|
||||
#define EVERYTHING_IPC_ID_FILE_COPY_FULL_PATH_AND_NAME 41007
|
||||
|
||||
void Everything::GetSelected(PWCHAR buffer)
|
||||
{
|
||||
if (SendMessage(
|
||||
FindWindow(EVERYTHING_IPC_SEARCH_CLIENT_WNDCLASSW, nullptr),
|
||||
WM_COMMAND,
|
||||
MAKEWPARAM(EVERYTHING_IPC_ID_FILE_COPY_FULL_PATH_AND_NAME, 0),
|
||||
0))
|
||||
return;
|
||||
auto hWinFG = GetForegroundWindow();
|
||||
|
||||
// Everything v1.5 IPC via hidden window.
|
||||
HWND hWinI = FindWindowExW(hWinFG, NULL, EVERYTHING_IPC_HIDDEN_WIN_CLASS, NULL);
|
||||
|
||||
if (hWinI != nullptr) {
|
||||
int pLength = GetWindowTextLength(hWinI);
|
||||
wchar_t* pText = new wchar_t[pLength + 1];
|
||||
GetWindowText(hWinI, pText, pLength + 1);
|
||||
wcsncpy_s(buffer, MAX_PATH_EX, pText, pLength);
|
||||
return; // Success. Clipboard access unnecessary.
|
||||
}
|
||||
|
||||
if (!OpenClipboard(nullptr))
|
||||
return;
|
||||
HWND hWin = FindWindowW(EVERYTHING_IPC_WINDOW_CLASS, NULL);
|
||||
|
||||
auto hData = GetClipboardData(CF_UNICODETEXT);
|
||||
if (hData == nullptr)
|
||||
return;
|
||||
if (hWin != nullptr) {
|
||||
// Everything IPC Clipboard
|
||||
SendMessageW(
|
||||
hWin,
|
||||
WM_COMMAND,
|
||||
MAKEWPARAM(EVERYTHING_IPC_COPY_TO_CLIPBOARD, 0),
|
||||
0);
|
||||
|
||||
auto pText = static_cast<PWCHAR>(GlobalLock(hData));
|
||||
if (pText == nullptr)
|
||||
return;
|
||||
Sleep(100);
|
||||
|
||||
if (!OpenClipboard(nullptr))
|
||||
return;
|
||||
|
||||
auto hData = GetClipboardData(CF_UNICODETEXT);
|
||||
if (hData == nullptr)
|
||||
return;
|
||||
|
||||
auto p = wcsstr(pText, L"\r\n");
|
||||
auto l = p == nullptr ? wcslen(pText) : p - pText;
|
||||
wcsncpy_s(buffer, MAX_PATH_EX, pText, l); // Everything supports Long Path
|
||||
auto pText = static_cast<PWCHAR>(GlobalLock(hData));
|
||||
if (pText == nullptr)
|
||||
return;
|
||||
|
||||
GlobalUnlock(hData);
|
||||
auto p = wcsstr(pText, L"\r\n");
|
||||
auto l = p == nullptr ? wcslen(pText) : p - pText;
|
||||
wcsncpy_s(buffer, MAX_PATH_EX, pText, l); // Everything supports Long Path
|
||||
|
||||
GlobalUnlock(hData);
|
||||
CloseClipboard();
|
||||
}
|
||||
}
|
||||
|
||||
CloseClipboard();
|
||||
bool Everything::MatchClass(PWCHAR classBuffer)
|
||||
{
|
||||
WCHAR sMatchC[256] = { '\0' };
|
||||
WCHAR sMatchS[256] = EVERYTHING_IPC_WINDOW_CLASS;
|
||||
size_t iLen = wcslen(sMatchS);
|
||||
wcsncpy_s(sMatchC, classBuffer, iLen);
|
||||
return (0 == wcscmp(sMatchC, sMatchS));
|
||||
}
|
||||
|
||||
void Everything::backupClipboard()
|
||||
{
|
||||
// TODO
|
||||
// TODO
|
||||
}
|
||||
|
||||
void Everything::restoreClipboard()
|
||||
{
|
||||
// TODO
|
||||
// TODO
|
||||
}
|
||||
|
@@ -1,4 +1,4 @@
|
||||
// Copyright © 2017 Paddy Xu
|
||||
// Copyright © 2017-2025 QL-Win Contributors
|
||||
//
|
||||
// This file is part of QuickLook program.
|
||||
//
|
||||
@@ -15,13 +15,18 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
#define EVERYTHING_IPC_HIDDEN_WIN_CLASS L"EVERYTHING_RESULT_LIST_FOCUS"
|
||||
#define EVERYTHING_IPC_WINDOW_CLASS L"EVERYTHING"
|
||||
#define EVERYTHING_IPC_COPY_TO_CLIPBOARD 41007
|
||||
|
||||
#pragma once
|
||||
class Everything
|
||||
{
|
||||
public:
|
||||
static void GetSelected(PWCHAR buffer);
|
||||
static void GetSelected(PWCHAR buffer);
|
||||
static bool MatchClass(PWCHAR classBuffer);
|
||||
|
||||
private:
|
||||
static void backupClipboard();
|
||||
static void restoreClipboard();
|
||||
static void backupClipboard();
|
||||
static void restoreClipboard();
|
||||
};
|
||||
|
@@ -1,4 +1,4 @@
|
||||
// Copyright © 2017 Paddy Xu
|
||||
// Copyright © 2017-2025 QL-Win Contributors
|
||||
//
|
||||
// This file is part of QuickLook program.
|
||||
//
|
||||
@@ -16,126 +16,169 @@
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
#include "stdafx.h"
|
||||
#include "strsafe.h"
|
||||
|
||||
#include "HelperMethods.h"
|
||||
|
||||
void HelperMethods::GetSelectedInternal(CComQIPtr<IWebBrowserApp> pwba, PWCHAR buffer)
|
||||
void HelperMethods::GetSelectedInternal(CComPtr<IShellBrowser> psb, PWCHAR buffer)
|
||||
{
|
||||
CComQIPtr<IServiceProvider> psp;
|
||||
if (FAILED(pwba->QueryInterface(IID_IServiceProvider, reinterpret_cast<void**>(&psp))))
|
||||
return;
|
||||
CComPtr<IShellView> psv;
|
||||
if (FAILED(psb->QueryActiveShellView(&psv)))
|
||||
return;
|
||||
|
||||
CComPtr<IShellBrowser> psb;
|
||||
if (FAILED(psp->QueryService(SID_STopLevelBrowser, IID_IShellBrowser, reinterpret_cast<LPVOID*>(&psb))))
|
||||
return;
|
||||
CComPtr<IDataObject> dao;
|
||||
if (FAILED(psv->GetItemObject(SVGIO_SELECTION, IID_IDataObject, reinterpret_cast<void**>(&dao))))
|
||||
return;
|
||||
|
||||
CComPtr<IShellView> psv;
|
||||
if (FAILED(psb->QueryActiveShellView(&psv)))
|
||||
return;
|
||||
|
||||
CComPtr<IDataObject> dao;
|
||||
if (FAILED(psv->GetItemObject(SVGIO_SELECTION, IID_IDataObject, reinterpret_cast<void**>(&dao))))
|
||||
return;
|
||||
|
||||
return ObtainFirstItem(dao, buffer);
|
||||
return ObtainFirstItem(dao, buffer);
|
||||
}
|
||||
|
||||
void HelperMethods::ObtainFirstItem(CComPtr<IDataObject> dao, PWCHAR buffer)
|
||||
{
|
||||
FORMATETC formatetc;
|
||||
STGMEDIUM medium = {sizeof medium};
|
||||
if (!dao || !buffer)
|
||||
return;
|
||||
|
||||
formatetc.cfFormat = CF_HDROP;
|
||||
formatetc.ptd = nullptr;
|
||||
formatetc.dwAspect = DVASPECT_CONTENT;
|
||||
formatetc.lindex = -1;
|
||||
formatetc.tymed = TYMED_HGLOBAL;
|
||||
FORMATETC formatetc = {};
|
||||
STGMEDIUM medium = {};
|
||||
|
||||
medium.tymed = TYMED_HGLOBAL;
|
||||
formatetc.cfFormat = CF_HDROP;
|
||||
formatetc.ptd = nullptr;
|
||||
formatetc.dwAspect = DVASPECT_CONTENT;
|
||||
formatetc.lindex = -1;
|
||||
formatetc.tymed = TYMED_HGLOBAL;
|
||||
|
||||
if (FAILED(dao->GetData(&formatetc, &medium)))
|
||||
return;
|
||||
medium.tymed = TYMED_HGLOBAL;
|
||||
|
||||
int n = DragQueryFile(HDROP(medium.hGlobal), 0xFFFFFFFF, nullptr, 0);
|
||||
// Try CF_HDROP first
|
||||
// If the file path is too long, the call might fail but CFSTR_SHELLIDLIST will do it
|
||||
// https://github.com/QL-Win/QuickLook/issues/1643
|
||||
if (SUCCEEDED(dao->GetData(&formatetc, &medium)))
|
||||
{
|
||||
HDROP hDrop = HDROP(medium.hGlobal);
|
||||
int count = DragQueryFile(hDrop, 0xFFFFFFFF, nullptr, 0);
|
||||
if (count >= 1)
|
||||
{
|
||||
WCHAR localBuffer[MAX_PATH] = { '\0' };
|
||||
if (DragQueryFileW(hDrop, 0, localBuffer, MAX_PATH) > 0)
|
||||
{
|
||||
GetLongPathName(localBuffer, buffer, MAX_PATH_EX);
|
||||
ReleaseStgMedium(&medium);
|
||||
return;
|
||||
}
|
||||
ReleaseStgMedium(&medium);
|
||||
}
|
||||
}
|
||||
|
||||
if (n < 1)
|
||||
return;
|
||||
// If CF_HDROP fails, try CFSTR_SHELLIDLIST
|
||||
// Support Desktop Icons (This PC, Recycle Bin and so on)
|
||||
// https://github.com/QL-Win/QuickLook/issues/1610
|
||||
static const CLIPFORMAT cfShellIDList = (CLIPFORMAT)RegisterClipboardFormatW(CFSTR_SHELLIDLIST);
|
||||
formatetc.cfFormat = cfShellIDList;
|
||||
|
||||
WCHAR localBuffer[MAX_PATH] = { '\0' };
|
||||
DragQueryFile(HDROP(medium.hGlobal), 0, localBuffer, MAX_PATH);
|
||||
|
||||
GetLongPathName(localBuffer, buffer, MAX_PATH_EX);
|
||||
if (SUCCEEDED(dao->GetData(&formatetc, &medium)))
|
||||
{
|
||||
CIDA* pida = (CIDA*)GlobalLock(medium.hGlobal);
|
||||
if (!pida)
|
||||
{
|
||||
ReleaseStgMedium(&medium);
|
||||
return;
|
||||
}
|
||||
|
||||
ITEMIDLIST* pidlFolder = (ITEMIDLIST*)((BYTE*)pida + pida->aoffset[0]);
|
||||
ITEMIDLIST* pidlItem = (ITEMIDLIST*)((BYTE*)pida + pida->aoffset[1]);
|
||||
PIDLIST_ABSOLUTE pidlFull = ILCombine(pidlFolder, pidlItem);
|
||||
GlobalUnlock(medium.hGlobal);
|
||||
ReleaseStgMedium(&medium);
|
||||
|
||||
if (!pidlFull)
|
||||
return;
|
||||
|
||||
// Convert to IShellItem to get canonical parsing path
|
||||
CComPtr<IShellItem> shellItem;
|
||||
if (SUCCEEDED(SHCreateItemFromIDList(pidlFull, IID_PPV_ARGS(&shellItem))))
|
||||
{
|
||||
PWSTR pszPath = nullptr;
|
||||
if (SUCCEEDED(shellItem->GetDisplayName(SIGDN_DESKTOPABSOLUTEPARSING, &pszPath)))
|
||||
{
|
||||
StringCchCopyW(buffer, MAX_PATH_EX, pszPath); // returns e.g., ::{645FF040-5081-101B-9F08-00AA002F954E}
|
||||
CoTaskMemFree(pszPath);
|
||||
}
|
||||
}
|
||||
|
||||
ILFree(pidlFull);
|
||||
}
|
||||
}
|
||||
|
||||
bool HelperMethods::IsListaryToolbarVisible()
|
||||
{
|
||||
auto CALLBACK findListaryWindowProc = [](__in HWND hwnd, __in LPARAM lParam)-> BOOL
|
||||
{
|
||||
WCHAR classBuffer[MAX_PATH] = {'\0'};
|
||||
if (FAILED(GetClassName(hwnd, classBuffer, MAX_PATH)))
|
||||
return TRUE;
|
||||
auto CALLBACK findListaryWindowProc = [](__in HWND hwnd, __in LPARAM lParam)-> BOOL
|
||||
{
|
||||
WCHAR classBuffer[MAX_PATH] = {'\0'};
|
||||
if (FAILED(GetClassName(hwnd, classBuffer, MAX_PATH)))
|
||||
return TRUE;
|
||||
|
||||
if (wcsncmp(classBuffer, L"Listary_WidgetWin_", 18) == 0)
|
||||
{
|
||||
if (IsWindowVisible(hwnd))
|
||||
{
|
||||
*reinterpret_cast<bool*>(lParam) = true;
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
};
|
||||
if (wcsncmp(classBuffer, L"Listary_WidgetWin_", 18) == 0)
|
||||
{
|
||||
if (IsWindowVisible(hwnd))
|
||||
{
|
||||
*reinterpret_cast<bool*>(lParam) = true;
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
};
|
||||
|
||||
auto found = false;
|
||||
EnumWindows(findListaryWindowProc, reinterpret_cast<LPARAM>(&found));
|
||||
auto found = false;
|
||||
EnumWindows(findListaryWindowProc, reinterpret_cast<LPARAM>(&found));
|
||||
|
||||
return found;
|
||||
return found;
|
||||
}
|
||||
|
||||
// Windows 10 1909 replaced the search box in the File Explorer by a UWP control.
|
||||
// gti.flags is always 0 for UWP applications.
|
||||
bool HelperMethods::IsExplorerSearchBoxFocused()
|
||||
{
|
||||
auto* hwnd = GetFocusedControl();
|
||||
auto* hwnd = GetFocusedControl();
|
||||
|
||||
WCHAR classBuffer[MAX_PATH] = { '\0' };
|
||||
if (FAILED(GetClassName(hwnd, classBuffer, MAX_PATH)))
|
||||
return false;
|
||||
WCHAR classBuffer[MAX_PATH] = { '\0' };
|
||||
if (FAILED(GetClassName(hwnd, classBuffer, MAX_PATH)))
|
||||
return false;
|
||||
|
||||
return wcscmp(classBuffer, L"Windows.UI.Core.CoreWindow") == 0;
|
||||
return wcscmp(classBuffer, L"Windows.UI.Core.CoreWindow") == 0;
|
||||
}
|
||||
|
||||
bool HelperMethods::IsCursorActivated(HWND hwnd)
|
||||
{
|
||||
auto tId = GetWindowThreadProcessId(hwnd, nullptr);
|
||||
auto tId = GetWindowThreadProcessId(hwnd, nullptr);
|
||||
|
||||
GUITHREADINFO gti = { sizeof gti };
|
||||
GetGUIThreadInfo(tId, >i);
|
||||
GUITHREADINFO gti = { sizeof gti };
|
||||
GetGUIThreadInfo(tId, >i);
|
||||
|
||||
return gti.flags || gti.hwndCaret || IsListaryToolbarVisible();
|
||||
return gti.flags || gti.hwndCaret || IsListaryToolbarVisible();
|
||||
}
|
||||
|
||||
bool HelperMethods::IsUWP()
|
||||
{
|
||||
auto pGCPFN = decltype(&GetCurrentPackageFullName)(
|
||||
GetProcAddress(GetModuleHandle(L"kernel32.dll"), "GetCurrentPackageFullName"));
|
||||
auto pGCPFN = decltype(&GetCurrentPackageFullName)(
|
||||
GetProcAddress(GetModuleHandle(L"kernel32.dll"), "GetCurrentPackageFullName"));
|
||||
|
||||
if (!pGCPFN)
|
||||
return false;
|
||||
if (!pGCPFN)
|
||||
return false;
|
||||
|
||||
UINT32 pn = 0;
|
||||
return pGCPFN(&pn, nullptr) == ERROR_INSUFFICIENT_BUFFER;
|
||||
UINT32 pn = 0;
|
||||
return pGCPFN(&pn, nullptr) == ERROR_INSUFFICIENT_BUFFER;
|
||||
}
|
||||
|
||||
HWND HelperMethods::GetFocusedControl()
|
||||
{
|
||||
auto tid = GetWindowThreadProcessId(GetForegroundWindow(), nullptr);
|
||||
auto tid = GetWindowThreadProcessId(GetForegroundWindow(), nullptr);
|
||||
|
||||
if (0 == AttachThreadInput(GetCurrentThreadId(), tid, TRUE))
|
||||
return nullptr;
|
||||
if (0 == AttachThreadInput(GetCurrentThreadId(), tid, TRUE))
|
||||
return nullptr;
|
||||
|
||||
auto* hwnd = GetFocus();
|
||||
auto* hwnd = GetFocus();
|
||||
|
||||
AttachThreadInput(GetCurrentThreadId(), tid, FALSE);
|
||||
AttachThreadInput(GetCurrentThreadId(), tid, FALSE);
|
||||
|
||||
return hwnd;
|
||||
return hwnd;
|
||||
}
|
||||
|
@@ -1,4 +1,4 @@
|
||||
// Copyright © 2017 Paddy Xu
|
||||
// Copyright © 2017-2025 QL-Win Contributors
|
||||
//
|
||||
// This file is part of QuickLook program.
|
||||
//
|
||||
@@ -19,13 +19,13 @@
|
||||
class HelperMethods
|
||||
{
|
||||
public:
|
||||
static void GetSelectedInternal(CComQIPtr<IWebBrowserApp> pWebBrowserApp, PWCHAR buffer);
|
||||
static void ObtainFirstItem(CComPtr<IDataObject> dao, PWCHAR buffer);
|
||||
static bool IsCursorActivated(HWND hwndfg);
|
||||
static bool IsExplorerSearchBoxFocused();
|
||||
static bool HelperMethods::IsUWP();
|
||||
static void GetSelectedInternal(CComPtr<IShellBrowser> psb, PWCHAR buffer);
|
||||
static void ObtainFirstItem(CComPtr<IDataObject> dao, PWCHAR buffer);
|
||||
static bool IsCursorActivated(HWND hwndfg);
|
||||
static bool IsExplorerSearchBoxFocused();
|
||||
static bool HelperMethods::IsUWP();
|
||||
|
||||
private:
|
||||
static bool IsListaryToolbarVisible();
|
||||
static HWND GetFocusedControl();
|
||||
static bool IsListaryToolbarVisible();
|
||||
static HWND GetFocusedControl();
|
||||
};
|
||||
|
100
QuickLook.Native/QuickLook.Native32/MultiCommander.cpp
Normal file
@@ -0,0 +1,100 @@
|
||||
// Copyright © 2017-2025 QL-Win Contributors
|
||||
//
|
||||
// This file is part of QuickLook program.
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
#include "stdafx.h"
|
||||
#include "MultiCommander.h"
|
||||
|
||||
HWND MultiCommander::hMsgWnd = nullptr;
|
||||
HANDLE MultiCommander::hGetResultEvent = nullptr;
|
||||
PCHAR MultiCommander::pCurrentItemPath = nullptr;
|
||||
|
||||
void MultiCommander::GetSelected(PWCHAR buffer)
|
||||
{
|
||||
if (false == PrepareMessageWindow()) {
|
||||
return;
|
||||
}
|
||||
|
||||
COPYDATASTRUCT cds;
|
||||
cds.dwData = MULTICMD_CPF_GETCURITEMFULL | MULTICMD_CPF_SOURCE;
|
||||
cds.cbData = 0;
|
||||
cds.lpData = nullptr;
|
||||
|
||||
ResetEvent(hGetResultEvent);
|
||||
|
||||
auto ret = SendMessage(
|
||||
FindWindow(MULTICMD_CLASS, nullptr),
|
||||
WM_COPYDATA,
|
||||
reinterpret_cast<WPARAM>(hMsgWnd),
|
||||
reinterpret_cast<LPARAM>(&cds)
|
||||
);
|
||||
|
||||
if (!ret || WAIT_OBJECT_0 != WaitForSingleObject(hGetResultEvent, 2000)) {
|
||||
return;
|
||||
}
|
||||
|
||||
auto path = reinterpret_cast<PWCHAR>(pCurrentItemPath);
|
||||
wcscpy_s(buffer, wcslen(path) + 1, path);
|
||||
|
||||
delete[] pCurrentItemPath;
|
||||
pCurrentItemPath = nullptr;
|
||||
}
|
||||
|
||||
bool MultiCommander::PrepareMessageWindow()
|
||||
{
|
||||
if (nullptr == hMsgWnd) {
|
||||
WNDCLASSEX wx = {};
|
||||
|
||||
wx.cbSize = sizeof(WNDCLASSEX);
|
||||
wx.lpfnWndProc = msgWindowProc;
|
||||
wx.lpszClassName = MULTICMD_MSGWINDOW_CLASS;
|
||||
|
||||
if (RegisterClassEx(&wx))
|
||||
hMsgWnd = CreateWindowEx(0, MULTICMD_MSGWINDOW_CLASS, L"", 0, 0, 0, 0, 0, HWND_MESSAGE, nullptr, nullptr, nullptr);
|
||||
|
||||
if (nullptr == hMsgWnd) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (nullptr == hGetResultEvent) {
|
||||
hGetResultEvent = CreateEvent(nullptr, TRUE, FALSE, nullptr);
|
||||
}
|
||||
|
||||
return (nullptr != hGetResultEvent);
|
||||
}
|
||||
|
||||
LRESULT CALLBACK MultiCommander::msgWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
switch (uMsg)
|
||||
{
|
||||
case WM_COPYDATA:
|
||||
{
|
||||
delete[] pCurrentItemPath;
|
||||
|
||||
auto cds = reinterpret_cast<PCOPYDATASTRUCT>(lParam);
|
||||
auto buf = static_cast<PCHAR>(cds->lpData);
|
||||
|
||||
pCurrentItemPath = new CHAR[cds->cbData + 1]{ '\0' };
|
||||
memcpy(pCurrentItemPath, buf, cds->cbData);
|
||||
|
||||
SetEvent(hGetResultEvent);
|
||||
return 0;
|
||||
}
|
||||
default:
|
||||
return DefWindowProc(hWnd, uMsg, wParam, lParam);
|
||||
}
|
||||
}
|
39
QuickLook.Native/QuickLook.Native32/MultiCommander.h
Normal file
@@ -0,0 +1,39 @@
|
||||
// Copyright © 2017-2025 QL-Win Contributors
|
||||
//
|
||||
// This file is part of QuickLook program.
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
#pragma once
|
||||
|
||||
#define MULTICMD_CPF_GETCURITEMFULL 0x00000010L // Get full path of current item (file or folder) in focus
|
||||
#define MULTICMD_CPF_SOURCE 0x00000400L // Go to the new path in the source panel side
|
||||
|
||||
#define MULTICMD_CLASS L"MultiCommander MainWnd"
|
||||
#define MULTICMD_MSGWINDOW_CLASS L"QuickLook.Native.MultiCmd.MsgWindow"
|
||||
|
||||
class MultiCommander
|
||||
{
|
||||
public:
|
||||
static void GetSelected(PWCHAR buffer);
|
||||
static bool PrepareMessageWindow();
|
||||
MultiCommander() = delete;
|
||||
private:
|
||||
static HWND hMsgWnd;
|
||||
static HANDLE hGetResultEvent;
|
||||
static PCHAR pCurrentItemPath;
|
||||
|
||||
static LRESULT CALLBACK msgWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
||||
};
|
||||
|
@@ -22,13 +22,13 @@
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<PlatformToolset>v143</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<PlatformToolset>v143</PlatformToolset>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
@@ -86,6 +86,7 @@
|
||||
<ClInclude Include="DOpus.h" />
|
||||
<ClInclude Include="Everything.h" />
|
||||
<ClInclude Include="HelperMethods.h" />
|
||||
<ClInclude Include="MultiCommander.h" />
|
||||
<ClInclude Include="rapidxml.hpp" />
|
||||
<ClInclude Include="WoW64HookHelper.h" />
|
||||
<ClInclude Include="Shell32.h" />
|
||||
@@ -106,6 +107,7 @@
|
||||
<ClCompile Include="Everything.cpp" />
|
||||
<ClCompile Include="HelperMethods.cpp" />
|
||||
<ClCompile Include="DllExport.cpp" />
|
||||
<ClCompile Include="MultiCommander.cpp" />
|
||||
<ClCompile Include="Shell32.cpp" />
|
||||
<ClCompile Include="stdafx.cpp">
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
|
||||
@@ -116,4 +118,4 @@
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
||||
</Project>
|
||||
|
@@ -42,6 +42,9 @@
|
||||
<ClInclude Include="rapidxml.hpp">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="MultiCommander.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="stdafx.cpp">
|
||||
@@ -71,5 +74,8 @@
|
||||
<ClCompile Include="DOpus.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="MultiCommander.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
</Project>
|
||||
|
@@ -1,4 +1,4 @@
|
||||
// Copyright © 2017 Paddy Xu
|
||||
// Copyright © 2017-2025 QL-Win Contributors
|
||||
//
|
||||
// This file is part of QuickLook program.
|
||||
//
|
||||
@@ -22,138 +22,163 @@
|
||||
#include "DialogHook.h"
|
||||
#include "Everything.h"
|
||||
#include "DOpus.h"
|
||||
#include "MultiCommander.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
Shell32::FocusedWindowType Shell32::GetFocusedWindowType()
|
||||
{
|
||||
auto hwndfg = GetForegroundWindow();
|
||||
auto hwndfg = GetForegroundWindow();
|
||||
|
||||
if (HelperMethods::IsCursorActivated(hwndfg))
|
||||
return INVALID;
|
||||
if (HelperMethods::IsCursorActivated(hwndfg))
|
||||
return INVALID;
|
||||
|
||||
WCHAR classBuffer[MAX_PATH] = { '\0' };
|
||||
if (FAILED(GetClassName(hwndfg, classBuffer, MAX_PATH)))
|
||||
return INVALID;
|
||||
WCHAR classBuffer[MAX_PATH] = { '\0' };
|
||||
if (FAILED(GetClassName(hwndfg, classBuffer, MAX_PATH)))
|
||||
return INVALID;
|
||||
|
||||
if (wcscmp(classBuffer, L"dopus.lister") == 0)
|
||||
{
|
||||
return DOPUS;
|
||||
}
|
||||
if (wcscmp(classBuffer, L"EVERYTHING") == 0 || wcscmp(classBuffer, L"EVERYTHING_SHELL_EXECUTE") == 0)
|
||||
{
|
||||
return EVERYTHING;
|
||||
}
|
||||
if (wcscmp(classBuffer, L"WorkerW") == 0 || wcscmp(classBuffer, L"Progman") == 0)
|
||||
{
|
||||
if (FindWindowEx(hwndfg, nullptr, L"SHELLDLL_DefView", nullptr) != nullptr)
|
||||
{
|
||||
return DESKTOP;
|
||||
}
|
||||
}
|
||||
if (wcscmp(classBuffer, L"ExploreWClass") == 0 || wcscmp(classBuffer, L"CabinetWClass") == 0)
|
||||
{
|
||||
if (!HelperMethods::IsExplorerSearchBoxFocused())
|
||||
{
|
||||
return EXPLORER;
|
||||
}
|
||||
}
|
||||
if (wcscmp(classBuffer, L"#32770") == 0)
|
||||
{
|
||||
if (FindWindowEx(hwndfg, nullptr, L"DUIViewWndClassName", nullptr) != nullptr)
|
||||
{
|
||||
if (!HelperMethods::IsExplorerSearchBoxFocused())
|
||||
{
|
||||
return DIALOG;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (wcscmp(classBuffer, MULTICMD_CLASS) == 0)
|
||||
{
|
||||
return MULTICOMMANDER;
|
||||
}
|
||||
if (wcscmp(classBuffer, L"dopus.lister") == 0)
|
||||
{
|
||||
return DOPUS;
|
||||
}
|
||||
if (Everything::MatchClass(classBuffer))
|
||||
{
|
||||
return EVERYTHING;
|
||||
}
|
||||
if (wcscmp(classBuffer, L"WorkerW") == 0 || wcscmp(classBuffer, L"Progman") == 0)
|
||||
{
|
||||
if (FindWindowEx(hwndfg, nullptr, L"SHELLDLL_DefView", nullptr) != nullptr)
|
||||
{
|
||||
return DESKTOP;
|
||||
}
|
||||
}
|
||||
if (wcscmp(classBuffer, L"ExploreWClass") == 0 || wcscmp(classBuffer, L"CabinetWClass") == 0)
|
||||
{
|
||||
if (!HelperMethods::IsExplorerSearchBoxFocused())
|
||||
{
|
||||
return EXPLORER;
|
||||
}
|
||||
}
|
||||
if (wcscmp(classBuffer, L"#32770") == 0)
|
||||
{
|
||||
if (FindWindowEx(hwndfg, nullptr, L"DUIViewWndClassName", nullptr) != nullptr)
|
||||
{
|
||||
if (!HelperMethods::IsExplorerSearchBoxFocused())
|
||||
{
|
||||
return DIALOG;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return INVALID;
|
||||
return INVALID;
|
||||
}
|
||||
|
||||
void Shell32::GetCurrentSelection(PWCHAR buffer)
|
||||
{
|
||||
switch (GetFocusedWindowType())
|
||||
{
|
||||
case DESKTOP:
|
||||
getSelectedFromDesktop(buffer);
|
||||
break;
|
||||
case EXPLORER:
|
||||
getSelectedFromExplorer(buffer);
|
||||
break;
|
||||
case DIALOG:
|
||||
DialogHook::GetSelected(buffer);
|
||||
break;
|
||||
case EVERYTHING:
|
||||
Everything::GetSelected(buffer);
|
||||
break;
|
||||
case DOPUS:
|
||||
DOpus::GetSelected(buffer);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
switch (GetFocusedWindowType())
|
||||
{
|
||||
case DESKTOP:
|
||||
getSelectedFromDesktop(buffer);
|
||||
break;
|
||||
case EXPLORER:
|
||||
getSelectedFromExplorer(buffer);
|
||||
break;
|
||||
case DIALOG:
|
||||
DialogHook::GetSelected(buffer);
|
||||
break;
|
||||
case EVERYTHING:
|
||||
Everything::GetSelected(buffer);
|
||||
break;
|
||||
case DOPUS:
|
||||
DOpus::GetSelected(buffer);
|
||||
break;
|
||||
case MULTICOMMANDER:
|
||||
MultiCommander::GetSelected(buffer);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void Shell32::getSelectedFromExplorer(PWCHAR buffer)
|
||||
{
|
||||
CoInitialize(nullptr);
|
||||
CoInitialize(nullptr);
|
||||
|
||||
CComPtr<IShellWindows> psw;
|
||||
if (FAILED(psw.CoCreateInstance(CLSID_ShellWindows)))
|
||||
return;
|
||||
CComPtr<IShellWindows> psw;
|
||||
if (FAILED(psw.CoCreateInstance(CLSID_ShellWindows)))
|
||||
return;
|
||||
|
||||
auto hwndfg = GetForegroundWindow();
|
||||
auto hwndfgw = GetForegroundWindow();
|
||||
auto hwndfgt = FindWindowEx(hwndfgw, nullptr, L"ShellTabWindowClass", nullptr);
|
||||
|
||||
auto count = 0L;
|
||||
psw->get_Count(&count);
|
||||
auto count = 0L;
|
||||
psw->get_Count(&count);
|
||||
|
||||
for (auto i = 0; i < count; i++)
|
||||
{
|
||||
VARIANT vi;
|
||||
VariantInit(&vi);
|
||||
V_VT(&vi) = VT_I4;
|
||||
V_I4(&vi) = i;
|
||||
for (auto i = 0; i < count; i++)
|
||||
{
|
||||
VARIANT vi;
|
||||
VariantInit(&vi);
|
||||
V_VT(&vi) = VT_I4;
|
||||
V_I4(&vi) = i;
|
||||
|
||||
CComPtr<IDispatch> pdisp;
|
||||
if (S_OK != psw->Item(vi, &pdisp))
|
||||
continue;
|
||||
CComPtr<IDispatch> pdisp;
|
||||
if (S_OK != psw->Item(vi, &pdisp))
|
||||
continue;
|
||||
|
||||
CComQIPtr<IWebBrowserApp> pwba;
|
||||
if (FAILED(pdisp->QueryInterface(IID_IWebBrowserApp, reinterpret_cast<void**>(&pwba))))
|
||||
continue;
|
||||
CComPtr<IServiceProvider> psp;
|
||||
if (FAILED(pdisp->QueryInterface(IID_IServiceProvider, reinterpret_cast<void**>(&psp))))
|
||||
continue;
|
||||
|
||||
HWND hwndwba;
|
||||
if (FAILED(pwba->get_HWND(reinterpret_cast<LONG_PTR*>(&hwndwba))))
|
||||
continue;
|
||||
CComPtr<IShellBrowser> psb;
|
||||
if (FAILED(psp->QueryService(IID_IShellBrowser, IID_IShellBrowser, reinterpret_cast<LPVOID*>(&psb))))
|
||||
continue;
|
||||
|
||||
if (hwndwba != hwndfg || HelperMethods::IsCursorActivated(hwndwba))
|
||||
continue;
|
||||
HWND phwnd;
|
||||
if (FAILED(psb->GetWindow(&phwnd)))
|
||||
continue;
|
||||
|
||||
HelperMethods::GetSelectedInternal(pwba, buffer);
|
||||
}
|
||||
if (hwndfgw != phwnd && (hwndfgt != nullptr && hwndfgt != phwnd))
|
||||
continue;
|
||||
|
||||
if (HelperMethods::IsCursorActivated(0))
|
||||
continue;
|
||||
|
||||
HelperMethods::GetSelectedInternal(psb, buffer);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void Shell32::getSelectedFromDesktop(PWCHAR buffer)
|
||||
{
|
||||
CoInitialize(nullptr);
|
||||
CoInitialize(nullptr);
|
||||
|
||||
CComPtr<IShellWindows> psw;
|
||||
CComQIPtr<IWebBrowserApp> pwba;
|
||||
CComPtr<IShellWindows> psw;
|
||||
CComPtr<IWebBrowserApp> pwba;
|
||||
|
||||
if (FAILED(psw.CoCreateInstance(CLSID_ShellWindows)))
|
||||
return;
|
||||
if (FAILED(psw.CoCreateInstance(CLSID_ShellWindows)))
|
||||
return;
|
||||
|
||||
VARIANT pvarLoc;
|
||||
VariantInit(&pvarLoc);
|
||||
long phwnd;
|
||||
if (FAILED(psw->FindWindowSW(&pvarLoc, &pvarLoc, SWC_DESKTOP, &phwnd, SWFO_NEEDDISPATCH, reinterpret_cast<IDispatch**>(
|
||||
&pwba))))
|
||||
return;
|
||||
VARIANT pvarLoc;
|
||||
VariantInit(&pvarLoc);
|
||||
long phwnd;
|
||||
if (FAILED(psw->FindWindowSW(&pvarLoc, &pvarLoc, SWC_DESKTOP, &phwnd, SWFO_NEEDDISPATCH, reinterpret_cast<IDispatch**>(
|
||||
&pwba))))
|
||||
return;
|
||||
|
||||
if (HelperMethods::IsCursorActivated(reinterpret_cast<HWND>(LongToHandle(phwnd))))
|
||||
return;
|
||||
if (HelperMethods::IsCursorActivated(reinterpret_cast<HWND>(LongToHandle(phwnd))))
|
||||
return;
|
||||
|
||||
HelperMethods::GetSelectedInternal(pwba, buffer);
|
||||
CComPtr<IServiceProvider> psp;
|
||||
if (FAILED(pwba->QueryInterface(IID_IServiceProvider, reinterpret_cast<void**>(&psp))))
|
||||
return;
|
||||
|
||||
CComPtr<IShellBrowser> psb;
|
||||
if (FAILED(psp->QueryService(IID_IShellBrowser, IID_IShellBrowser, reinterpret_cast<LPVOID*>(&psb))))
|
||||
return;
|
||||
|
||||
HelperMethods::GetSelectedInternal(psb, buffer);
|
||||
}
|
||||
|
@@ -1,4 +1,4 @@
|
||||
// Copyright © 2017 Paddy Xu
|
||||
// Copyright © 2017-2025 QL-Win Contributors
|
||||
//
|
||||
// This file is part of QuickLook program.
|
||||
//
|
||||
@@ -22,20 +22,21 @@
|
||||
class Shell32
|
||||
{
|
||||
public:
|
||||
enum FocusedWindowType
|
||||
{
|
||||
INVALID,
|
||||
DESKTOP,
|
||||
EXPLORER,
|
||||
DIALOG,
|
||||
EVERYTHING,
|
||||
DOPUS,
|
||||
};
|
||||
enum FocusedWindowType
|
||||
{
|
||||
INVALID,
|
||||
DESKTOP,
|
||||
EXPLORER,
|
||||
DIALOG,
|
||||
EVERYTHING,
|
||||
DOPUS,
|
||||
MULTICOMMANDER,
|
||||
};
|
||||
|
||||
static FocusedWindowType GetFocusedWindowType();
|
||||
static void GetCurrentSelection(PWCHAR buffer);
|
||||
static FocusedWindowType GetFocusedWindowType();
|
||||
static void GetCurrentSelection(PWCHAR buffer);
|
||||
|
||||
private:
|
||||
static void getSelectedFromDesktop(PWCHAR buffer);
|
||||
static void getSelectedFromExplorer(PWCHAR buffer);
|
||||
static void getSelectedFromDesktop(PWCHAR buffer);
|
||||
static void getSelectedFromExplorer(PWCHAR buffer);
|
||||
};
|
||||
|
@@ -1,4 +1,4 @@
|
||||
// Copyright © 2017 Paddy Xu
|
||||
// Copyright © 2017-2025 QL-Win Contributors
|
||||
//
|
||||
// This file is part of QuickLook program.
|
||||
//
|
||||
@@ -27,54 +27,54 @@ HANDLE hJob = nullptr;
|
||||
|
||||
bool WoW64HookHelper::CheckStatus()
|
||||
{
|
||||
DWORD running = -1;
|
||||
GetExitCodeProcess(hHelper, &running);
|
||||
return running == STILL_ACTIVE;
|
||||
DWORD running = -1;
|
||||
GetExitCodeProcess(hHelper, &running);
|
||||
return running == STILL_ACTIVE;
|
||||
}
|
||||
|
||||
bool WoW64HookHelper::Launch()
|
||||
{
|
||||
#ifndef WIN64
|
||||
return true;
|
||||
return true;
|
||||
#endif
|
||||
|
||||
if (HelperMethods::IsUWP())
|
||||
return true;
|
||||
if (HelperMethods::IsUWP())
|
||||
return true;
|
||||
|
||||
if (CheckStatus())
|
||||
return true;
|
||||
if (CheckStatus())
|
||||
return true;
|
||||
|
||||
createJob();
|
||||
createJob();
|
||||
|
||||
WCHAR fullPath[MAX_PATH] = {'\0'};
|
||||
GetModuleFileName(nullptr, fullPath, MAX_PATH - 1);
|
||||
auto p = wcsrchr(fullPath, L'\\');
|
||||
memcpy(p, HELPER_FILE, wcslen(HELPER_FILE) * sizeof WCHAR);
|
||||
WCHAR fullPath[MAX_PATH] = {'\0'};
|
||||
GetModuleFileName(nullptr, fullPath, MAX_PATH - 1);
|
||||
auto p = wcsrchr(fullPath, L'\\');
|
||||
memcpy(p, HELPER_FILE, wcslen(HELPER_FILE) * sizeof WCHAR);
|
||||
|
||||
STARTUPINFO si = {sizeof si};
|
||||
PROCESS_INFORMATION pi = {nullptr};
|
||||
si.cb = sizeof si;
|
||||
STARTUPINFO si = {sizeof si};
|
||||
PROCESS_INFORMATION pi = {nullptr};
|
||||
si.cb = sizeof si;
|
||||
|
||||
CreateProcess(fullPath, RUN_ARG, nullptr, nullptr, false, 0, nullptr, nullptr, &si, &pi);
|
||||
hHelper = pi.hProcess;
|
||||
CreateProcess(fullPath, RUN_ARG, nullptr, nullptr, false, 0, nullptr, nullptr, &si, &pi);
|
||||
hHelper = pi.hProcess;
|
||||
|
||||
AssignProcessToJobObject(hJob, hHelper);
|
||||
AssignProcessToJobObject(hJob, hHelper);
|
||||
|
||||
return CheckStatus();
|
||||
return CheckStatus();
|
||||
}
|
||||
|
||||
void WoW64HookHelper::createJob()
|
||||
{
|
||||
if (hJob != nullptr)
|
||||
return;
|
||||
if (hJob != nullptr)
|
||||
return;
|
||||
|
||||
hJob = CreateJobObject(nullptr, nullptr);
|
||||
hJob = CreateJobObject(nullptr, nullptr);
|
||||
|
||||
JOBOBJECT_BASIC_LIMIT_INFORMATION BasicLimitInformation = {sizeof BasicLimitInformation};
|
||||
BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE;
|
||||
JOBOBJECT_EXTENDED_LIMIT_INFORMATION lpJobObjectInfo = {sizeof lpJobObjectInfo};
|
||||
lpJobObjectInfo.BasicLimitInformation = BasicLimitInformation;
|
||||
JOBOBJECT_BASIC_LIMIT_INFORMATION BasicLimitInformation = {sizeof BasicLimitInformation};
|
||||
BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE;
|
||||
JOBOBJECT_EXTENDED_LIMIT_INFORMATION lpJobObjectInfo = {sizeof lpJobObjectInfo};
|
||||
lpJobObjectInfo.BasicLimitInformation = BasicLimitInformation;
|
||||
|
||||
SetInformationJobObject(hJob, JobObjectExtendedLimitInformation, &lpJobObjectInfo,
|
||||
sizeof JOBOBJECT_EXTENDED_LIMIT_INFORMATION);
|
||||
SetInformationJobObject(hJob, JobObjectExtendedLimitInformation, &lpJobObjectInfo,
|
||||
sizeof JOBOBJECT_EXTENDED_LIMIT_INFORMATION);
|
||||
}
|
||||
|
@@ -1,4 +1,4 @@
|
||||
// Copyright © 2017 Paddy Xu
|
||||
// Copyright © 2017-2025 QL-Win Contributors
|
||||
//
|
||||
// This file is part of QuickLook program.
|
||||
//
|
||||
@@ -22,14 +22,14 @@
|
||||
class WoW64HookHelper
|
||||
{
|
||||
public:
|
||||
static PWCHAR GetMsgWindowClassName()
|
||||
{
|
||||
return L"QUICKLOOK_WOW64HOOKHELPER_MSG_CLASS";
|
||||
}
|
||||
static PWCHAR GetMsgWindowClassName()
|
||||
{
|
||||
return L"QUICKLOOK_WOW64HOOKHELPER_MSG_CLASS";
|
||||
}
|
||||
|
||||
static bool CheckStatus();
|
||||
static bool Launch();
|
||||
static bool CheckStatus();
|
||||
static bool Launch();
|
||||
|
||||
private:
|
||||
static void createJob();
|
||||
static void createJob();
|
||||
};
|
||||
|