Compare commits
548 Commits
3.6.7
...
copilot/fi
Author | SHA1 | Date | |
---|---|---|---|
![]() |
4742908983 | ||
![]() |
ccbe1c297a | ||
![]() |
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 | ||
![]() |
f726841d99 | ||
![]() |
e640a8b98a | ||
![]() |
fe6dae67ce | ||
![]() |
eaa918079c | ||
![]() |
69d6aa0f0a | ||
![]() |
51ddd18c34 | ||
![]() |
c10773249f | ||
![]() |
cbaf636173 | ||
![]() |
4a476aff4b | ||
![]() |
28b9552dcd | ||
![]() |
971285fc95 | ||
![]() |
1ad78c9f4b | ||
![]() |
237b99b305 | ||
![]() |
2b8b0e5c6d | ||
![]() |
49bb96e92d | ||
![]() |
1e5de83f62 | ||
![]() |
df66c425e3 | ||
![]() |
f32536f51e | ||
![]() |
3ef980bb17 | ||
![]() |
885b3ed53f | ||
![]() |
8c8ade0bf9 | ||
![]() |
9478f9d4d7 | ||
![]() |
0dd8e919ca | ||
![]() |
a5763e460e | ||
![]() |
dc0d275015 | ||
![]() |
9fc90ae479 | ||
![]() |
b6dc1cafcb | ||
![]() |
b683ce0fd1 | ||
![]() |
a91261435a | ||
![]() |
9f426326ba | ||
![]() |
7377b4f2ab | ||
![]() |
36e9d97509 | ||
![]() |
929dbe9d14 | ||
![]() |
dc87c32af0 | ||
![]() |
f5971373a2 | ||
![]() |
826cda0a0e | ||
![]() |
cd2f4bb5e8 | ||
![]() |
aeee21a85a | ||
![]() |
6b0f9df088 | ||
![]() |
a10ffd06e3 | ||
![]() |
f40bf17c01 | ||
![]() |
2408c094ae | ||
![]() |
3232f0b098 | ||
![]() |
8ee6c770c4 | ||
![]() |
26f9044c6c | ||
![]() |
6a0c116bd4 | ||
![]() |
14394eb1ce | ||
![]() |
88fa00f05a | ||
![]() |
ed9334b4b6 | ||
![]() |
6d81d61cc5 | ||
![]() |
7cf0d0affb | ||
![]() |
9c384be49c | ||
![]() |
6af2a5ec0d | ||
![]() |
bcef51f848 | ||
![]() |
9ab3f2e4bc | ||
![]() |
2cda4606e3 | ||
![]() |
ada998d8f2 | ||
![]() |
0243636b6e | ||
![]() |
8043863412 | ||
![]() |
7326a7c153 | ||
![]() |
03da30b59a | ||
![]() |
38a989fe06 | ||
![]() |
2e93171205 | ||
![]() |
f05096c209 | ||
![]() |
91a3a99fbf | ||
![]() |
1a0cc02443 | ||
![]() |
ed66ec7f48 | ||
![]() |
c0ca430883 | ||
![]() |
1d857ccc0f | ||
![]() |
7e29ddad46 | ||
![]() |
9428bf68a0 | ||
![]() |
dd025757d4 | ||
![]() |
80d95dbe20 | ||
![]() |
eae1caa875 | ||
![]() |
41b42d81e9 | ||
![]() |
7fc6e03ffa | ||
![]() |
a41a7bd24d | ||
![]() |
6e08a15066 | ||
![]() |
408949d1b4 | ||
![]() |
44f66cde4c | ||
![]() |
b26d00bac1 | ||
![]() |
fe44021590 | ||
![]() |
cbd137d075 | ||
![]() |
a6f9d4e73d | ||
![]() |
bd16583fa1 | ||
![]() |
a7115f60b6 | ||
![]() |
f8416ba79b | ||
![]() |
5a02558ebe | ||
![]() |
3f587c7b79 | ||
![]() |
021ff268f6 | ||
![]() |
56ffe382f5 | ||
![]() |
e5d094ac3b | ||
![]() |
69f0b39712 | ||
![]() |
e8a89d6776 | ||
![]() |
61c39fdd2a | ||
![]() |
2441552b91 | ||
![]() |
f9eaf7a365 | ||
![]() |
99ce6c02f0 | ||
![]() |
0d8d405cc2 | ||
![]() |
452574e299 | ||
![]() |
b2fdd05e84 | ||
![]() |
8faa152960 | ||
![]() |
1cd5019706 | ||
![]() |
5c96abd1cb | ||
![]() |
af608dc9d9 | ||
![]() |
472ccc1175 | ||
![]() |
8881c1c774 | ||
![]() |
748d9109b2 | ||
![]() |
aeba5bddfe | ||
![]() |
567ed0c79c | ||
![]() |
de105500c8 | ||
![]() |
38cffa1874 | ||
![]() |
25e6d6b9cb | ||
![]() |
94724104b3 | ||
![]() |
63126887eb | ||
![]() |
b98f8e5ec6 | ||
![]() |
8e801d9fa4 | ||
![]() |
cf29484208 |
@@ -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,12 +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:
|
||||
branch: master
|
||||
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
|
||||
|
4
.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 `%APPDATA%\pooi.moe\QuickLook\QuickLook.Exception.log` (`.msi` or `.zip` version) or `%LOCALAPPDATA%\Packages\21090PaddyXu.QuickLook_egxr34yet59cg\LocalCache\Roaming\pooi.moe\QuickLook\QuickLook.Exception.log` (Windows Store version).
|
||||
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 |
45
Build/micasetup.json
Normal file
@@ -0,0 +1,45 @@
|
||||
{
|
||||
"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,
|
||||
"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>
|
23
PRIVACY.md
Normal file
@@ -0,0 +1,23 @@
|
||||
# QuickLook Privacy Policy
|
||||
|
||||
## Website
|
||||
|
||||
When accessing our Website, QuickLook website will learn certain information about you during your visit. How we will handle information we learn about you depends upon what you do when visiting our site.
|
||||
|
||||
If you visit our site to read or download information on our pages, we collect and store only the following information about you:
|
||||
|
||||
* The name of the domain from which you access the Internet
|
||||
* The date and time you access our site
|
||||
* The Internet address of the website you used to link directly to our site.
|
||||
* Third party vendors, including Google and GitHub, use cookies to serve ads based on a user’s prior visits to your website.
|
||||
* If you identify yourself by sending us an e-mail containing personal information, then the information collected will be solely used to respond to your message.
|
||||
|
||||
The information collected is for statistical purposes. QuickLook website may use software programs to create summary statistics, which are used for such purposes as assessing the number of visitors to the different sections of our site, what information is of most and least interest, determining technical design specifications, and identifying system performance or problem areas.
|
||||
|
||||
QuickLook website will not obtain personally-identifying information about you when you visit our site, unless you choose to provide such information to us, nor will such information be sold or otherwise transferred to unaffiliated third parties without the approval of the user at the time of collection.
|
||||
|
||||
## Desktop
|
||||
|
||||
The software application doesn’t collect anything personal information from you.
|
||||
|
||||
The software application exchange data only with https://github.com using the GitHub Releases API. If you are viewing a remote content via the software, data exchange will happen between you and the remote content.
|
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, MAX_PATH, b);
|
||||
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,121 +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 (isTargetWoW64 && !isSelfWoW64)
|
||||
{
|
||||
// if self is 64bit and target is 32bit, do this
|
||||
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);
|
||||
wcscpy_s(buffer, MAX_PATH, filePathBuffer);
|
||||
}
|
||||
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
|
||||
wcscpy_s(buffer, MAX_PATH, sharedBuffer);
|
||||
// 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, pText, l);
|
||||
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,95 +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;
|
||||
|
||||
DragQueryFile(HDROP(medium.hGlobal), 0, buffer, MAX_PATH - 1);
|
||||
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();
|
||||
|
||||
WCHAR classBuffer[MAX_PATH] = { '\0' };
|
||||
if (FAILED(GetClassName(hwnd, classBuffer, MAX_PATH)))
|
||||
return false;
|
||||
|
||||
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 gui = {sizeof gui};
|
||||
GetGUIThreadInfo(tId, &gui);
|
||||
return gui.flags || gui.hwndCaret || IsListaryToolbarVisible();
|
||||
GUITHREADINFO gti = { sizeof gti };
|
||||
GetGUIThreadInfo(tId, >i);
|
||||
|
||||
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);
|
||||
|
||||
if (0 == AttachThreadInput(GetCurrentThreadId(), tid, TRUE))
|
||||
return nullptr;
|
||||
|
||||
auto* hwnd = GetFocus();
|
||||
|
||||
AttachThreadInput(GetCurrentThreadId(), tid, FALSE);
|
||||
|
||||
return hwnd;
|
||||
}
|
||||
|
@@ -1,4 +1,4 @@
|
||||
// Copyright © 2017 Paddy Xu
|
||||
// Copyright © 2017-2025 QL-Win Contributors
|
||||
//
|
||||
// This file is part of QuickLook program.
|
||||
//
|
||||
@@ -19,11 +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 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 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,132 +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)
|
||||
{
|
||||
return EXPLORER;
|
||||
}
|
||||
if (wcscmp(classBuffer, L"#32770") == 0)
|
||||
{
|
||||
if (FindWindowEx(hwndfg, nullptr, L"DUIViewWndClassName", nullptr) != nullptr)
|
||||
{
|
||||
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);
|
||||
}
|
||||
|