Compare commits

..

299 Commits

Author SHA1 Message Date
copilot-swe-agent[bot]
19bba7f229 Fix illegal path characters error in InfoPanel with defensive programming
Co-authored-by: emako <24737061+emako@users.noreply.github.com>
2025-08-08 15:07:53 +00:00
copilot-swe-agent[bot]
7a05793bf7 Initial plan 2025-08-08 15:00:33 +00:00
ema
3dbc9fc763 Remove unimportant UnobservedTaskException #1691
Some checks failed
MSBuild / build (push) Has been cancelled
MSBuild / publish (push) Has been cancelled
2025-08-06 00:19:47 +08:00
ema
139cb873f2 Revert SVG default background to transparent
Some checks failed
MSBuild / build (push) Has been cancelled
MSBuild / publish (push) Has been cancelled
2025-08-05 01:19:42 +08:00
ema
fd1004e6d3 Set default background color for SVG panel 2025-08-05 01:11:37 +08:00
ema
b0dceffa94 Add Exporter class for MediaInfo integration 2025-08-05 00:58:48 +08:00
ema
2246c5a361 Fix style changed from MediaInfoViewer 2025-08-05 00:53:21 +08:00
ema
5a5cce93b4 Add built-in plugin MediaInfoViewer
1. Merged from forked repo https://github.com/emako/QuickLook/tree/master/QuickLook.Plugin/QuickLook.Plugin.MediaInfoViewer
2. Use TextBox instead of AvalonEdit and prepare for new feature
2025-08-05 00:43:47 +08:00
ema
8d7df24798 Remove configuration ModernMessageBox
Some checks failed
MSBuild / build (push) Has been cancelled
MSBuild / publish (push) Has been cancelled
2025-08-04 21:17:25 +08:00
ema
3ae4eeb26d Improve CLI performance
Some checks failed
MSBuild / build (push) Has been cancelled
MSBuild / publish (push) Has been cancelled
2025-08-04 00:17:07 +08:00
ema
da0033b52a Improve CLI performance #1706 #1731 2025-08-03 22:20:35 +08:00
ema
2e941f468e Make exe-installer no forked relaunching
Some checks failed
MSBuild / build (push) Has been cancelled
MSBuild / publish (push) Has been cancelled
Since MicaSetup v2.4.0
2025-08-03 02:39:19 +08:00
ema
fbfd2484df Refactor thumbnail handlers into provider classes 2025-08-02 23:58:55 +08:00
ema
e342cd0851 Refactor AnimationProvider to use primary constructor 2025-08-02 23:58:23 +08:00
ema
d90993817d Refactor DependencyProperty registration 2025-08-02 21:58:08 +08:00
ema
5cedcff912 Support .pdn in ThumbnailViewer #1708
Some checks failed
MSBuild / build (push) Has been cancelled
MSBuild / publish (push) Has been cancelled
Implementation still under adjustment.
2025-08-02 02:34:32 +08:00
Copilot
9fe37520d3 Support Mermaid diagram rendering in MarkdownViewer (#1730)
* Implement Mermaid diagram support for MarkdownViewer

Co-authored-by: emako <24737061+emako@users.noreply.github.com>

* Replace the mermaid.min.js

https://cdn.jsdelivr.net/npm/mermaid@11.4.1/dist/mermaid.min.js

* Fix Mermaid diagram rendering by updating markdown-it highlight function

Co-authored-by: emako <24737061+emako@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: emako <24737061+emako@users.noreply.github.com>
Co-authored-by: ema <mccoy39082@163.com>
2025-08-02 02:09:52 +08:00
ema
67b5dbf310 Add UseNativeProvider option #1726
Use following option in `QuickLook.Plugin.ImageViewer.config` to fix the issue:
```xml
<?xml version="1.0" encoding="utf-8"?>
<Settings>
  <UseColorProfile>false</UseColorProfile>
  <UseNativeProvider>false</UseNativeProvider>
</Settings>
```
2025-08-02 01:36:13 +08:00
Piteriuz
efe47ff43b Update Polish translation file (#1727)
- Add missing translations for MW_OpenWithMenu and InfoPanel_CantPreventClosing
- Remove duplicate entry for MW_BrowseFolder
2025-08-01 22:21:44 +08:00
ema
417876edd2 Prepare support for .pdn
Some checks failed
MSBuild / build (push) Has been cancelled
MSBuild / publish (push) Has been cancelled
2025-07-31 01:27:43 +08:00
ema
03b1ca557f Fix image .jxr error reading from UseColorProfile 2025-07-31 01:22:13 +08:00
ema
f39b53a5c6 Support Point Cloud Data (.pcd) for 3D spatial
Some checks failed
MSBuild / build (push) Has been cancelled
MSBuild / publish (push) Has been cancelled
1. Only support PCD files with PointXYZ format.
2. Not supported for Color or Intensity formats.
2025-07-28 16:48:13 +08:00
ema
68cb555bad Unsupported .pmx incorrectly handled in advance 2025-07-28 16:19:30 +08:00
dependabot[bot]
d88c8ab8de Bump Magick.NET-Q8-AnyCPU from 14.6.0 to 14.7.0
Some checks failed
MSBuild / build (push) Has been cancelled
MSBuild / publish (push) Has been cancelled
---
updated-dependencies:
- dependency-name: Magick.NET-Q8-AnyCPU
  dependency-version: 14.7.0
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-24 16:35:58 +08:00
copilot-swe-agent[bot]
a38b7a450a Fix code alignment by adding space to align .Replace method calls
Some checks failed
MSBuild / build (push) Has been cancelled
MSBuild / publish (push) Has been cancelled
Co-authored-by: emako <24737061+emako@users.noreply.github.com>
2025-07-23 23:57:13 +08:00
copilot-swe-agent[bot]
8ad5f39eab Add missing using System.Linq to fix compile error
Co-authored-by: emako <24737061+emako@users.noreply.github.com>
2025-07-23 23:57:13 +08:00
copilot-swe-agent[bot]
83cfd2a3d8 Remove unnecessary Translations.config and simplify RTL detection code
Co-authored-by: emako <24737061+emako@users.noreply.github.com>
2025-07-23 23:57:13 +08:00
copilot-swe-agent[bot]
4840a87858 Add RTL support for markdown files
Co-authored-by: emako <24737061+emako@users.noreply.github.com>
2025-07-23 23:57:13 +08:00
VenusGirl❤
a4d118e11f Update Korean (#1710)
Some checks failed
MSBuild / build (push) Has been cancelled
MSBuild / publish (push) Has been cancelled
2025-07-23 15:07:39 +08:00
ema
79b002c0b3 Unified changelog style
Some checks failed
MSBuild / build (push) Has been cancelled
MSBuild / publish (push) Has been cancelled
2025-07-20 23:00:53 +08:00
ema
b26575581a Update changelog for 4.1.1 release 2025-07-20 22:55:20 +08:00
ema
8c95a42a64 Refactor tray icon to use TrayIconHost 2025-07-20 21:54:32 +08:00
ema
55a069046f Refactor HelixViewer extend format support
Some checks failed
MSBuild / build (push) Has been cancelled
MSBuild / publish (push) Has been cancelled
2025-07-12 03:47:49 +08:00
ema
0714574374 Improve file extension checks in CanHandle methods 2025-07-12 03:39:37 +08:00
ema
10ce29e836 Refactor JSON detection to use Regex field
Some checks failed
MSBuild / build (push) Has been cancelled
MSBuild / publish (push) Has been cancelled
2025-07-10 07:38:21 +08:00
ema
8d66dfac54 Add hosts file syntax highlighting 2025-07-10 07:33:57 +08:00
ema
d06abf461e Enable Dockerfile detection 2025-07-10 07:10:48 +08:00
ema
4c4375612e Add configuration syntax highlighting
File extension: .conf;.config;.cfg
2025-07-10 07:01:15 +08:00
ema
8dcb09cf84 Add syntax highlighting for .env files 2025-07-10 06:46:54 +08:00
ema
b27ff01eff Add syntax highlighting for .gitattributes files 2025-07-10 06:29:42 +08:00
ema
befdb17718 Remove unused settings from GitIgnore 2025-07-10 06:26:57 +08:00
ema
d60b10a8cf Refactor thumbnail extraction 2025-07-10 06:16:10 +08:00
ema
2ee54695e7 Set RichTextBox background to transparent 2025-07-10 05:37:58 +08:00
ema
4a72e1ed8e Optimize file name comparison in detectors 2025-07-10 04:11:00 +08:00
ema
0bb6e622f6 Refactor confused format detection method names
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-07-09 04:27:50 +08:00
ema
345b061a8d Add dark mode CMake syntax highlighting 2025-07-09 04:20:18 +08:00
ema
67dc0ce10d Add CMake syntax highlighting and format detection 2025-07-09 04:16:19 +08:00
ema
631fd91219 Prepare hosts format detector 2025-07-09 03:55:45 +08:00
ema
cf6dd5cdf3 Prepare Dockerfile format detector 2025-07-09 03:50:50 +08:00
ema
7a11127b09 Prepare CMakeLists.txt format detector 2025-07-09 03:47:10 +08:00
ema
e035153642 Add .editorconfig to INI syntax highlighting 2025-07-09 03:37:55 +08:00
ema
78b695a170 Improve fallback logic for highlighting themes 2025-07-09 03:34:14 +08:00
ema
ed4169d6fe Add light mode Makefile syntax highlighting 2025-07-09 03:29:16 +08:00
ema
0a79d59c79 Add MakefileDetector for text viewer 2025-07-09 03:24:42 +08:00
ema
d6cc984267 Optimize JSONDetector with Span 2025-07-09 03:03:56 +08:00
ema
484acddba3 Add reStructuredText syntax highlighting
Just a simple highlighting solution for `.rst` files
2025-07-09 00:12:52 +08:00
ema
18634f15be Add Markdown syntax highlighting
Add from https://github.com/cuiliang/AvalonEditHighlightingThemes
2025-07-09 00:04:44 +08:00
ema
5869cc6670 Add FBX model support using AssimpNet #1479 2025-07-08 23:46:37 +08:00
ema
09a3cc3ea5 Add dark mode and unify naming for .sln syntax 2025-07-08 23:18:55 +08:00
ema
f9586be3ec Add Sketch file support to ThumbnailViewer plugin 2025-07-08 22:57:02 +08:00
ema
a6c077fbbb Add Pixso (.pip, .pix) support to ThumbnailViewer
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-07-08 22:28:08 +08:00
ema
c47d9f3c9b Move resource dictionary initialization 2025-07-08 22:04:34 +08:00
ema
06d9ed2a85 Add Protobuf syntax highlighting
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-07-08 04:44:35 +08:00
ema
37ed56ff34 Keep svga.proto 2025-07-08 04:17:07 +08:00
ema
87e04dca9d Improve the rendering effect of the Model 2025-07-08 04:06:05 +08:00
ema
3fd444102d Revert Add Sandbox detection 2025-07-08 03:42:39 +08:00
ema
b5773fc721 Add built-in HelixViewer for 3d models
Some checks failed
MSBuild / build (push) Has been cancelled
MSBuild / publish (push) Has been cancelled
2025-07-05 13:26:51 +08:00
ema
32ce27e447 Add MathJax inline math support to Markdown #1640
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-07-05 11:58:41 +08:00
ema
95f1c5bca2 Remove System.Text.Json dependency 2025-07-05 11:30:22 +08:00
ema
f6ca3a62e2 Add support for svgaplayerweb in SVGA viewer 2025-07-05 11:24:02 +08:00
ema
efba55b8d5 Implement SVGA MetaProvider 2025-07-05 10:21:15 +08:00
ema
4c3bf23e67 Use lottie-web and svga instead of npmjs 2025-07-05 09:50:54 +08:00
ema
007b960019 Rename SvgViewer.init to render and update usage 2025-07-05 09:33:46 +08:00
ema
a14b22d762 Update comments for LottieViewer and clarify usage 2025-07-05 09:28:12 +08:00
ema
3fce8b4f53 Add Lottie Files animation preview support 2025-07-05 09:25:22 +08:00
ema
5e459e35e5 Add comment clarifying SVGA version support 2025-07-05 06:55:48 +08:00
ema
b3570d1215 Handle .svga files separately in image viewer 2025-07-05 06:55:38 +08:00
ema
eecb56db14 Add SVGA animation preview support 2025-07-05 06:46:52 +08:00
ema
3858e142e2 Fix packaging target to run only in Release builds 2025-07-05 05:08:31 +08:00
ema
d7f482511f Update package versions in plugin projects 2025-07-05 05:07:26 +08:00
ema
9cca8c3c0b Add GPL license header to Helper.cs 2025-07-05 05:03:05 +08:00
ema
22e8838ce3 Add support for .kra and .cdr previews #1662 2025-07-05 04:58:24 +08:00
ema
63f516b504 Add Figma & XMind support to ThumbnailViewer #1662 2025-07-05 04:39:18 +08:00
ema
08587186c2 Fix ImagePanel button layout 2025-07-05 04:28:32 +08:00
ema
f99a786510 Add built-in ThumbnailViewer plugin 2025-07-05 04:22:25 +08:00
ema
3de93386cc Add NSIS syntax highlighting
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-07-05 03:31:33 +08:00
ema
b42b7ce4e8 Add syntax highlighting for SubRip Subtitle (.srt) files 2025-07-05 03:20:56 +08:00
ema
89571b1431 Add Swift dark mode syntax highlighting 2025-07-05 03:00:55 +08:00
ema
a7e26519ed Add Dart dark mode syntax highlighting 2025-07-05 02:59:08 +08:00
ema
c1e6362440 Add Erlang dark mode syntax highlighting 2025-07-05 02:57:12 +08:00
ema
25f7df52bd Add Kotlin dark mode syntax highlighting 2025-07-05 02:56:16 +08:00
ema
04247db107 Add Lisp dark mode syntax highlighting 2025-07-05 02:53:24 +08:00
ema
7456cbc3a5 Add Objective-C dark mode highlighting 2025-07-05 02:52:17 +08:00
ema
99caca2dfd Add dark mode Pascal syntax highlighting 2025-07-05 02:50:21 +08:00
ema
dc2d722f0a Add dark mode PHP syntax highlighting 2025-07-05 02:47:22 +08:00
ema
267b37c526 Improve QuickLook initialization speed 2025-07-05 02:46:00 +08:00
ema
913474f7ad Add dark mode R syntax highlighting 2025-07-05 02:41:58 +08:00
ema
c979ed0254 Add dark mode Ruby syntax highlighting 2025-07-05 02:40:08 +08:00
ema
71904ebac5 Add dark mode SQL syntax highlighting 2025-07-05 02:37:45 +08:00
ema
a8746dd3ef Add dark mode Rust syntax highlighting 2025-07-05 02:37:01 +08:00
ema
93be5681d3 Add dark mode Java syntax highlighting 2025-07-05 02:32:18 +08:00
ema
2fd3a15071 Add dark mode C++ syntax highlighting 2025-07-05 02:26:57 +08:00
ema
6e9d86457c Add dark mode C syntax highlighting 2025-07-05 02:24:12 +08:00
ema
1df89d69a9 Add dark mode syntax highlighting for Registry 2025-07-05 02:13:09 +08:00
ema
8850f52f3a Add simple QML syntax highlighting #1002 2025-07-05 02:10:10 +08:00
ema
cb4aa2e9d9 Add PowerShell syntax highlighting for dark mode 2025-07-05 01:52:09 +08:00
ema
db3af0580d Add .gitignore syntax highlighting 2025-07-05 01:44:44 +08:00
ema
469f955208 Add .dotsettings to XML syntax highlighting 2025-07-05 01:40:04 +08:00
ema
ea077af8a2 Add .gitmodules to INI syntax highlighting 2025-07-05 01:39:42 +08:00
ema
33030780ff Create CHANGELOG.md
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-07-04 04:18:11 +08:00
ema
9319ca7213 Bump WPF-UI.Violeta package to version 4.0.3
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-07-04 01:50:15 +08:00
ema
b1a2387203 Add dark mode Lua syntax highlighting
Some checks failed
MSBuild / build (push) Has been cancelled
MSBuild / publish (push) Has been cancelled
2025-07-01 05:04:51 +08:00
ema
12a6b35c6c Remove boolean value type from ASS highlighting 2025-07-01 04:46:39 +08:00
ema
1f13aa6678 Fix PDF thumbnail rendering crash #1531 2025-07-01 04:30:08 +08:00
ema
72c8e567cd Increase SVG viewer max zoom level to 100x 2025-07-01 03:40:30 +08:00
ema
fe13f5d45e Remove cursor style changes during SVG panning 2025-07-01 03:38:34 +08:00
ema
e76c882d49 Prevent dragdrop and context menu in SVG viewer 2025-07-01 03:36:10 +08:00
ema
667815e360 Conditionally include Svg.Skia and SVG provider 2025-07-01 03:27:22 +08:00
ema
13bcc4b1d4 Set custom WebView2 user data folder for SVG panel 2025-07-01 03:23:47 +08:00
ema
fa61b1e68f Code Cleanup 2025-07-01 03:18:48 +08:00
ema
2750cb75dd Fix exception from SVG WebView2 2025-07-01 03:10:33 +08:00
ema
f1237aa86f Add JSDoc comments and clarify SvgViewer usage 2025-07-01 02:23:38 +08:00
ema
2a94fa155d Enhance SVG viewer with pan feature 2025-07-01 02:11:31 +08:00
ema
682801a8bb Refactor SVG viewer to use inline SVG
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-07-01 01:57:36 +08:00
ema
f9b075dfa3 Add pan and zoom support to SVG image viewer
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-06-30 07:32:46 +08:00
ema
0a8039d962 Render SVG as base64 image and improve scaling 2025-06-30 07:22:03 +08:00
ema
0dc8c03446 Fix image viewer content assignment and cursor check 2025-06-30 06:48:32 +08:00
ema
9cef4d9830 Officially enable SVG web viewer 2025-06-30 06:38:52 +08:00
ema
e9306329ee Add double-click to reset zoom in SVG viewer 2025-06-30 06:07:09 +08:00
ema
7ca7d2783e Beautify the background color of Svg Web2 2025-06-30 06:00:29 +08:00
ema
98dd96283d Add SVG support using WebView2 in ImageViewer
It's still an experimental function
2025-06-30 05:45:21 +08:00
ema
21071a62d1 Update package dependencies 2025-06-30 02:02:53 +08:00
ema
a65a453390 Support JXR image but SDR only #1680 2025-06-30 01:49:43 +08:00
ema
856f7f137c Add light mode highlighting for SubStation Alpha 2025-06-30 01:23:07 +08:00
ema
3878dd0049 Add dark mode highlighting for SubStation Alpha 2025-06-30 01:10:04 +08:00
ema
9a04232e84 Add .toml extension to INI syntax highlighting
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-06-29 21:38:53 +08:00
ema
ff25bedcae Add .vsix support to archive viewer
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-06-29 10:40:31 +08:00
ema
7ca15b5e1e Add dark mode highlighting for VB.NET and VBScript 2025-06-29 10:21:32 +08:00
ema
b2a7b22f20 Add TypeScript dark mode highlighting 2025-06-29 10:14:13 +08:00
ema
ae7633e1e7 Add dark mode syntax highlighting for INI files 2025-06-29 10:11:11 +08:00
ema
ebb90d5586 Add dark mode F# highlighting 2025-06-29 10:07:25 +08:00
ema
ac7a08cbf3 Add YAML syntax highlighting 2025-06-29 09:56:18 +08:00
ema
e16a89f979 Refactor properties highlighting for consistency and clarity 2025-06-29 09:04:25 +08:00
ema
9a17d5fa0f Skip empty lines in properties highlighting 2025-06-29 06:49:22 +08:00
ema
caf301f3f5 Refactor property key highlighting logic
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-06-29 06:36:05 +08:00
ema
9d42da53c0 Support .fx with HLSL 2025-06-29 05:34:47 +08:00
ema
1632b207db Fix .apk extension handling 2025-06-29 05:34:20 +08:00
ema
3ec576968e Update package and remove binding redirect 2025-06-29 05:17:56 +08:00
ema
84222e3188 Add dark mode syntax highlighting for Go
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-06-28 01:00:49 +08:00
ema
6b7fc303e0 Add dark mode CSS syntax highlighting 2025-06-28 00:55:23 +08:00
ema
e113030dce Skip primary for comment lines in properties files
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-06-27 22:49:28 +08:00
ema
12046220c1 Add support for Android App Bundle (.aab) files
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-06-27 07:30:10 +08:00
ema
6943ed5cb4 Read ABIs from QuickLook.ApkReader 2.1.0 2025-06-27 07:20:55 +08:00
ema
4ff7cd53c4 Add Alt+Z shortcut to toggle word wrap #1487
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
Introduced a keyboard shortcut (Alt+Z) to toggle the WordWrap property in the TextViewerPanel for improved usability.
2025-06-27 07:03:11 +08:00
ema
a7c89d7e69 Add keyboard shortcuts for text direction #1612
Implemented Ctrl+LShift and Ctrl+RShift shortcuts to switch text flow direction between LTR and RTL in TextViewerPanel
2025-06-27 06:56:43 +08:00
ema
32e45da1d6 Use verbatim string literals for MediaInfo path 2025-06-27 03:34:27 +08:00
ema
6ad73eddea Add option IsSupportRTL to control the RTL #1612 2025-06-27 03:33:35 +08:00
ema
a796cdbdf0 Support RTL for .txt file #1612 2025-06-27 03:28:08 +08:00
ema
1db667e32f Add .vpy extension to Python syntax highlighting 2025-06-27 03:15:11 +08:00
ema
d858840183 Enable window dragging in video viewer panel #425 2025-06-27 02:38:17 +08:00
ema
aef35d748e Fix apk icon can not be found from resource id 2025-06-27 02:12:49 +08:00
ema
2bf6387b8f Support X11 and more JPEG2000 image formats
Some checks failed
MSBuild / build (push) Has been cancelled
MSBuild / publish (push) Has been cancelled
In addition, Magick Image File Format (.miff) is supported now
2025-06-25 02:44:14 +08:00
ema
b96619c244 Fix Android API level mapping name 2025-06-25 02:22:29 +08:00
ema
3fff4c1b2b Add Android API level mapping and improve APK info 2025-06-25 02:17:12 +08:00
ema
f3c08d5b76 Display supported ABIs in APK info panel 2025-06-25 01:58:32 +08:00
ema
1c1f6d55e7 No web font resource extraction
Some checks failed
MSBuild / build (push) Has been cancelled
MSBuild / publish (push) Has been cancelled
Fix WebView2 resources not being released in FontViewer
2025-06-24 02:05:04 +08:00
ema
2c330a0136 Chore of disable nullable in MarkdownViewer 2025-06-24 01:45:52 +08:00
ema
83ae611af1 No markdown resource extraction #1661 #1670 2025-06-24 01:33:07 +08:00
ema
741d9967d1 Support highlighting .uts
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-06-23 16:38:35 +08:00
ema
01f92b0b3a Revise the hint of UCEERR_RENDERTHREADFAILURE
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-06-23 10:44:20 +08:00
ema
c959e649a0 Try catch DMG exception
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-06-23 02:35:02 +08:00
ema
869a134587 Support highlighting .nvue 2025-06-23 02:10:40 +08:00
ema
75841d241f Support highlighting .vue 2025-06-23 02:07:49 +08:00
ema
273b2fc893 Support dark mode JavaScript 2025-06-23 01:54:45 +08:00
ema
e5b45a7c01 Support dark mode Python #1675 2025-06-23 01:46:33 +08:00
ema
4d3d216d78 Support dark mode Log
https://github.com/Dirkster99/AvalonEditHighlightingThemes/blob/master/source/HL/Resources/Themes/VS2019_Dark.xshtd
2025-06-23 01:43:30 +08:00
ema
879ec689a9 Support highlighting .dos 2025-06-23 01:41:31 +08:00
ema
a4d2aea98d Support light mode Log
https://github.com/Dirkster99/AvalonEditHighlightingThemes/blob/master/source/HL/Resources/Light/Log.xshd
2025-06-23 01:39:23 +08:00
ema
68b0a928b6 Support light mode Lyric 2025-06-23 01:26:09 +08:00
ema
8d9c1e3f6e Add Sandbox detection 2025-06-23 00:58:28 +08:00
ema
b3ed13f16a Initial custom highlighting via reflection 2025-06-22 23:53:01 +08:00
ema
e86716fc54 Support .properties 2025-06-22 23:31:59 +08:00
ema
cf0c8529a0 Support dark mode TXT #1675 2025-06-22 21:53:49 +08:00
ema
ce5adc6801 Support dark mode XML 2025-06-22 21:36:11 +08:00
ema
44ba8b1436 Support dark mode HLSL 2025-06-22 21:29:17 +08:00
ema
0168318f39 Improve PDF magic detection 2025-06-22 21:12:35 +08:00
ema
f0d55455e4 Add built-in ELF viewer plugin
Support for binary ELF, UImage, Mach-O files
2025-06-22 20:47:29 +08:00
ema
17091056de Use english as default resource culture
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
74ae24cf44
2025-06-22 04:40:56 +08:00
ema
a60fafdd38 Support .rpm 2025-06-22 04:12:46 +08:00
ema
54031a166a Update issue template
Some checks failed
MSBuild / build (push) Has been cancelled
MSBuild / publish (push) Has been cancelled
2025-06-20 19:38:40 +08:00
ema
efc83b0669 Use format detector feature for TextViewer
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-06-19 17:03:20 +08:00
ema
a580926059 Add more file extensions for XML
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-06-19 11:08:26 +08:00
ema
21af7ad7ff Prepare support .rpm
Some checks failed
MSBuild / build (push) Has been cancelled
MSBuild / publish (push) Has been cancelled
2025-06-18 00:54:30 +08:00
ema
01faaa7ce0 Support .AppImage 2025-06-17 23:35:15 +08:00
ema
533e097a0c Fix spell
Some checks failed
MSBuild / build (push) Has been cancelled
MSBuild / publish (push) Has been cancelled
2025-06-16 09:57:03 +08:00
ema
c9fa5ff43b Support .dmg
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-06-15 07:04:00 +08:00
ema
679b00fe71 Revert the DataGrid style of CSV #1664
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-06-14 16:28:24 +08:00
ema
04c7ed931f New option CheckPreviewHandler
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-06-14 12:54:54 +08:00
ema
781f270824 Fix unsupported ColorContexts in Windows #1671 2025-06-14 12:15:13 +08:00
ema
5aa0cf06a8 New option ProcessRenderMode
Some checks failed
MSBuild / build (push) Has been cancelled
MSBuild / publish (push) Has been cancelled
2025-06-12 16:24:10 +08:00
ema
7eabaff36a Resort the codes of office extensions 2025-06-12 15:34:26 +08:00
ema
f897ce46ea Show office exception instead of crash 2025-06-12 15:31:28 +08:00
ema
e2e5885fd5 Automatically fix Office preview handler registry
This function requires QuickLook to run with administrator privileges and preview the corresponding Office file once
2025-06-12 15:25:18 +08:00
ema
9a3591e6f6 Safely check office preview handler
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-06-11 18:12:31 +08:00
ema
5fd2d8a88a Merge OfficeViewer-Native plugin #1662
Repo URL: https://github.com/QL-Win/QuickLook.Plugin.OfficeViewer-Native
2025-06-11 17:58:07 +08:00
ema
4fd8c14b98 Supplement AutoReload features
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-06-10 11:40:20 +08:00
ema
1b3d2e518d Merge pull request #1666 from JSuttHoops/jsutt
Add Reload + Customization
2025-06-10 10:45:35 +08:00
ema
c686c373ba Fix generic theme resources #1652
Some checks failed
MSBuild / build (push) Has been cancelled
MSBuild / publish (push) Has been cancelled
2025-06-09 11:44:03 +08:00
JSuttHoops
555b801fe6 Merge pull request #1 from JSuttHoops/codex/add-reload-button-with-preserved-window-properties
Summary

Introduced a new “Reload” button in the viewer window toolbar for quickly refreshing the current preview without closing the window

Added the “MW_Reload” string to the translations so the Reload button text can be localized

Implemented a ReloadPreview method in ViewWindowManager to refresh the plugin content in-place

Hooked the Reload button and added optional file monitoring for auto-reload in ViewerWindow code-behind

Allowed custom window background colors via the WindowBackgroundColor setting
2025-06-07 19:12:40 -05:00
JSuttHoops
2624989a75 Add reload feature and customizable background 2025-06-07 19:12:14 -05:00
ema
220ab789a5 Remove x86 from sln
Some checks failed
MSBuild / build (push) Has been cancelled
MSBuild / publish (push) Has been cancelled
2025-06-07 00:47:02 +08:00
ema
9f20a6d646 Remove appx from sln 2025-06-07 00:34:23 +08:00
ema
a9d4fb1a9b Add appx debug project 2025-06-06 23:54:31 +08:00
ema
500a78f7ec Merge pull request #1663 from King3R/translation-german
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
Update existing and add missing German translation
2025-06-06 18:07:16 +08:00
King3R
c1e4f32bb3 Update QuickLook/Translations.config 2025-06-06 10:01:32 +02:00
King3R
bbed9223ef Update QuickLook.Plugin.PEViewer/Translations.config 2025-06-06 09:32:18 +02:00
King3R
d190980e12 Update QuickLook.Plugin.PDFViewer/Translations.config 2025-06-06 09:30:51 +02:00
King3R
7b8e89d09e Update QuickLook.Plugin.FontViewer/Translations.config 2025-06-06 09:27:30 +02:00
King3R
e7d3250d2b Update QuickLook.Plugin.AppViewer/Translations.config 2025-06-06 09:24:26 +02:00
ema
a64aeada91 Show deb architecture
Some checks failed
MSBuild / build (push) Has been cancelled
MSBuild / publish (push) Has been cancelled
2025-06-05 14:57:33 +08:00
ema
b31de49da1 Not support deb with LZMA algorithm 2025-06-05 14:46:19 +08:00
ema
576cb5814d Fix deb reader gz error 2025-06-05 12:02:16 +08:00
ema
5bc7fecdcf Improve App/PE titlebar UI/UX
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-06-04 17:37:22 +08:00
ema
743079c5bf Update wgt logo 2025-06-04 17:30:35 +08:00
ema
3153f7b279 Revert the exception handling for Show() 2025-06-04 16:59:20 +08:00
ema
efe28423e9 Support .deb 2025-06-04 16:42:38 +08:00
ema
3bd1239457 Restruct AppViewer codes 2025-06-04 15:13:43 +08:00
ema
59124967d2 Attempt to fix the crash #1648
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
This is an experimental fix, the idea is to remove the tree to prevent the DUCE command
2025-06-04 13:53:49 +08:00
ema
376ed30dc5 Improve GroupBox UI/UX 2025-06-04 10:45:41 +08:00
ema
2b38b2c946 Use IsVisible instead of Visibility
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-06-03 14:54:38 +08:00
ema
05e9f43ba4 Remove the WoW64HookHelper from sln 2025-06-03 14:40:20 +08:00
ema
e5b04ed07a Update PackageReference 2025-06-03 14:39:51 +08:00
ema
cc1e126101 Support .hap and .hap.1
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-06-03 07:55:06 +08:00
ema
22a5d69ac8 Remove the WoW64HookHelper from release #1634
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
Use https://github.com/QL-Win/QuickLook.Plugin.WoW64HookHelper instead
2025-06-02 18:59:17 +08:00
ema
8b6ab6b037 Fix old version volume exception #1653
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-06-02 13:17:41 +08:00
ema
d18b33a18e Speed up the apk reader
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-06-01 14:07:57 +08:00
ema
1a83848c2c Use app fallback logo 2025-06-01 13:32:33 +08:00
ema
fdb602b9ed Support .ipa 2025-06-01 12:37:02 +08:00
ema
00829ec21b Support .apk and .apk.1
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-05-31 17:30:35 +08:00
ema
53d76cb0f8 Support .wgt and .wgtu 2025-05-31 13:10:34 +08:00
ema
8a5d640572 Support .appx and .msix 2025-05-31 12:16:31 +08:00
ema
833222507b Update font pangram
Some checks failed
MSBuild / build (push) Has been cancelled
MSBuild / publish (push) Has been cancelled
2025-05-29 18:48:24 +08:00
ema
2fb23a94bf Fix CaptionTextButtonStyle not static anymore
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-05-29 18:00:23 +08:00
ema
ef55a3eaff Update due to MS Store policy change
Some checks failed
MSBuild / build (push) Has been cancelled
MSBuild / publish (push) Has been cancelled
Due to the updated Microsoft Store policy, certain keywords were cleaned.
2025-05-26 22:35:24 +08:00
ema
05c967e582 Manually resolve the assembly fails #1618 2025-05-26 15:49:24 +08:00
ema
645edf2439 Optimize highlight name fetching
Some checks failed
MSBuild / build (push) Has been cancelled
MSBuild / publish (push) Has been cancelled
2025-05-26 09:48:22 +08:00
ema
6deadf9d73 Fix highlighting name
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-05-26 05:42:27 +08:00
ema
b81b2f9ef8 Improve startup speed #1521
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-05-25 03:45:17 +08:00
ema
eed0c53e9c Code Cleanup 2025-05-25 03:45:07 +08:00
ema
51a46155d7 Fix unsupported CLSID was not shown 2025-05-25 01:59:31 +08:00
ema
2e8fd2bae7 Code Cleanup 2025-05-25 01:32:38 +08:00
ema
05a2a819b7 Add branding images
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-05-24 15:05:20 +08:00
ema
86e7803cd7 New AppViewer plugin for .msi 2025-05-24 15:03:54 +08:00
ema
77c332d825 Fix share button was not visible in win11
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-05-24 13:20:51 +08:00
ema
d20eb71f2b Remove MSI from PEViewer
Actually MSI does not belong to the PE format
2025-05-24 09:21:56 +08:00
ema
1ce2fc2f89 Fix Scripts\pack-all.ps1 2025-05-24 06:00:47 +08:00
ema
c2acdaa182 Avoid audio cover null exception in xaml
Can slightly increase the opening speed of audio file
2025-05-24 05:41:38 +08:00
ema
eff9d795f0 Fix long path issue #1643
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-05-24 03:51:18 +08:00
ema
27c2257feb Show Repository Trending
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-05-23 17:25:36 +08:00
ema
9803f5d6a8 Use PureSharpCompress instead of SharpCompress
Some checks are pending
MSBuild / build (push) Waiting to run
MSBuild / publish (push) Blocked by required conditions
2025-05-23 03:18:51 +08:00
ema
00ef7d1e01 Improve PE parsing with extended buffer size 2025-05-23 03:03:36 +08:00
ema
06e7dbaae7 Code Cleanup 2025-05-23 02:39:26 +08:00
ema
34f69cc4f4 Add community group link 2025-05-22 11:16:18 +08:00
ema
74e8394b07 Update PackageReference 2025-05-21 11:06:05 +08:00
ema
0370876a3f Support .pcx image #1638 2025-05-20 22:39:27 +08:00
ema
dd322ac7e9 Update exception catcher 2025-05-18 01:40:20 +08:00
ema
6e8c0ce593 Update README.md #1622 2025-05-15 01:56:15 +08:00
ema
75c45f96c2 Fix DPI jump on window close in net462 #1626 2025-05-15 01:33:41 +08:00
ema
f7b22fb600 Avoid flickering #1628 2025-05-14 03:33:45 +08:00
ema
4170dc7a16 Rollback SharpCompress before clear dependencies 2025-05-14 02:41:10 +08:00
ema
47f4106b5d Update README.md #1622 2025-05-14 02:37:21 +08:00
ema
b28fcbb398 Update the build scripts 2025-05-14 02:18:01 +08:00
ema
97f8232767 Fix DpiAwareness for PerMonitor #1626 2025-05-13 22:07:39 +08:00
ema
8fa4f6cc5b Update PackageReferences 2025-05-13 17:36:22 +08:00
ema
ebcb223ef0 Update Title Immediately 2025-05-13 17:24:42 +08:00
ema
90b23cd1f8 Hide PEViewer Title just like InfoPanel 2025-05-13 17:16:10 +08:00
ema
beca7d06ca Fix flickering #1628 2025-05-13 11:52:23 +08:00
ema
e4ea156a20 Fix some errors from cli options
Error is from this commit a95b050
2025-05-11 03:53:39 +08:00
ema
8279c55526 Fix check update exception #1577 2025-05-11 03:39:24 +08:00
ema
a95b050ae5 Support cli options #1620
https://github.com/QL-Win/QuickLook/wiki/Command-Line
2025-05-11 03:16:33 +08:00
ema
5bf422a17f Delay the initialization of the MarkdownViewer 2025-05-10 08:28:16 +08:00
ema
d51c8bb25e Improve UI: Refine Recycle Bin icon display #1610 2025-05-10 07:53:31 +08:00
ema
1903687137 Fix window title update with ShowInTaskbar false 2025-05-10 06:47:09 +08:00
ema
ee884f1c7d Replace FontViewer source with DLL reference 2025-05-10 02:26:30 +08:00
ema
e0f581e149 Implement RecycleBinPanel #1610 2025-05-07 03:41:11 +08:00
ema
a0a46832ed Update copyright information 2025-05-06 21:04:58 +08:00
ema
19373a28a7 First commit CLSIDViewer #1610 2025-05-06 02:52:31 +08:00
ema
1bc82c8b81 Native Support for Desktop Icons #1610 2025-05-05 02:58:39 +08:00
ema
34a361e84a Run code cleanup 2025-05-04 14:26:27 +08:00
ema
ff4c9df9a2 Merge pull request #1607 from JNylson/master
Update pt-BR string in all Translations.config
2025-04-30 15:36:13 +08:00
JNylson
9be4df34e7 Update pt-BR string in all Translations.config 2025-04-29 22:59:32 -03:00
ema
cb40018d52 Run code cleanup 2025-04-30 01:15:05 +08:00
ema
30861cc40f Make exe installer uses msi path by default #1596
Request MicaSetup v2.3.7
2025-04-30 01:08:29 +08:00
ema
abc781d340 Fix the Volume control does not work #1578 2025-04-29 21:28:29 +08:00
ema
41fa5ed1ed Support more Markdown file extension #1562 #1601 2025-04-28 19:12:04 +08:00
ema
00212531fb Merge pull request #1604 from JNylson/master
Update pt-BR string in Translations.config
2025-04-27 18:27:52 +08:00
JNylson
1f85226297 Update pt-BR string in Translations.config 2025-04-26 23:53:55 -03:00
ema
b6c4ad5ac7 Fix styling issues in the Search Panel #1592 2025-04-23 22:38:14 +08:00
ema
fd01082a3d Add VisualCommander 2025-04-23 22:35:31 +08:00
609 changed files with 46795 additions and 40737 deletions

View File

@@ -23,7 +23,7 @@ A clear and concise description of what you expected to happen.
**Desktop (please complete the following information):**
- OS Version: [e.g. Windows 10 1803]
- QuickLook Version: [e.g. 0.3.3 from Windows Store]
- QuickLook Version: [e.g. 4.0.2 from Microsoft Store or from MSI installer]
**Screenshots and Exception Log**
If applicable, add screenshots and logs to help explain your problem. The log file is located in [one of several locations](https://github.com/QL-Win/QuickLook/wiki/Differences-Between-Distributions#user-data-location).

6
.gitignore vendored
View File

@@ -290,7 +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

View File

@@ -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 &#8220;Quick Look&#8221; 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 &#8220;Quick Look&#8221; 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>

View File

@@ -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 &#8220;Quick Look&#8221; 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 569 KiB

BIN
Build/Assets/Branding/2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

BIN
Build/Assets/Branding/3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 970 KiB

BIN
Build/Assets/Branding/4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

BIN
Build/Assets/Branding/5.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 288 KiB

BIN
Build/Assets/Branding/6.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 383 KiB

BIN
Build/Assets/Branding/7.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 206 KiB

View File

@@ -28,12 +28,15 @@
"AutoRunLaunchCommand": "/autostart",
"IsUseFolderPickerPreferClassic": false,
"IsUseInstallPathPreferX86": false,
"IsUseInstallPathPreferAppDataLocalPrograms": true,
"IsUseInstallPathPreferAppDataRoaming": false,
"IsUseRegistryPreferX86": null,
"IsAllowFullFolderSecurity": true,
"IsAllowFirewall": true,
"IsRefreshExplorer": true,
"IsInstallCertificate": false,
"IsEnableUninstallDelayUntilReboot": true,
"IsUseTempPathFork": false,
"IsEnvironmentVariable": false,
"OverlayInstallRemoveExt": "exe,dll,pdb,config,winmd,txt,bat,ax,manifest,xshd",
"UnpackingPassword": null,

13
Build/openssl-sign.cnf Normal file
View 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
View 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
View 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

Binary file not shown.

112
CHANGELOG.md Normal file
View 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

7
QuickLook.Appx/.gitignore vendored Normal file
View File

@@ -0,0 +1,7 @@
.vs/*
[Bb]in/
[Oo]bj/
AppPackages/*
BundleArtifacts/*
*.user
*.cache

Binary file not shown.

After

Width:  |  Height:  |  Size: 232 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 227 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 299 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 319 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 577 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 782 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 782 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 607 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 951 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

View 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>

View 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)' &lt; '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>

View File

@@ -1,4 +1,4 @@
// Copyright © 2017 Paddy Xu
// Copyright © 2017-2025 QL-Win Contributors
//
// This file is part of QuickLook program.
//
@@ -34,111 +34,111 @@ PCHAR pXmlBuffer;
void DOpus::GetSelected(PWCHAR buffer)
{
/*
* CPU Disasm
* 6A44B588 |. 68 A839526A PUSH OFFSET 6A5239A8 ; /WindowName = "Directory Opus"
* 6A44B58D |. 68 6459526A PUSH OFFSET 6A525964 ; |ClassName = "DOpus.ParentWindow"
* 6A44B592 |. 894424 40 MOV DWORD PTR SS:[ESP+40],EAX ; |
* 6A44B596 |. C74424 30 140 MOV DWORD PTR SS:[ESP+30],14 ; |
* 6A44B59E |. FFD7 CALL EDI ; \USER32.FindWindowW
* ...
* 00BC2E9B |. 50 PUSH EAX ; /lParam = 12FE80C -> 15 ;
* 00BC2E9C |. 57 PUSH EDI ; |wParam ; class = dopusrt.getinfo
* 00BC2E9D |. 6A 4A PUSH 4A ; |Msg = WM_COPYDATA
* 00BC2E9F |. FF75 FC PUSH DWORD PTR SS:[LOCAL.1] ; |hWnd => [LOCAL.1] ; class = DOpus.ParentWindow, text = Directory Opus
* 00BC2EA2 |. FF15 0802C000 CALL DWORD PTR DS:[<&USER32.SendMessageW ; \USER32.SendMessageW
*
* CPU Stack
* 012FE80C |00000015 
* 012FE810 |00000010
* 012FE814 |013A26C0 ; UNICODE "listsel"
*/
/*
* CPU Disasm
* 6A44B588 |. 68 A839526A PUSH OFFSET 6A5239A8 ; /WindowName = "Directory Opus"
* 6A44B58D |. 68 6459526A PUSH OFFSET 6A525964 ; |ClassName = "DOpus.ParentWindow"
* 6A44B592 |. 894424 40 MOV DWORD PTR SS:[ESP+40],EAX ; |
* 6A44B596 |. C74424 30 140 MOV DWORD PTR SS:[ESP+30],14 ; |
* 6A44B59E |. FFD7 CALL EDI ; \USER32.FindWindowW
* ...
* 00BC2E9B |. 50 PUSH EAX ; /lParam = 12FE80C -> 15 ;
* 00BC2E9C |. 57 PUSH EDI ; |wParam ; class = dopusrt.getinfo
* 00BC2E9D |. 6A 4A PUSH 4A ; |Msg = WM_COPYDATA
* 00BC2E9F |. FF75 FC PUSH DWORD PTR SS:[LOCAL.1] ; |hWnd => [LOCAL.1] ; class = DOpus.ParentWindow, text = Directory Opus
* 00BC2EA2 |. FF15 0802C000 CALL DWORD PTR DS:[<&USER32.SendMessageW ; \USER32.SendMessageW
*
* CPU Stack
* 012FE80C |00000015 
* 012FE810 |00000010
* 012FE814 |013A26C0 ; UNICODE "listsel"
*/
if (hMsgWnd == nullptr)
PrepareMessageWindow();
if (hMsgWnd == nullptr)
return;
if (hMsgWnd == nullptr)
PrepareMessageWindow();
if (hMsgWnd == nullptr)
return;
PWCHAR data = DOPUS_IPC_LP_DATA;
COPYDATASTRUCT cds;
cds.dwData = DOPUS_IPC_LP_INFO;
cds.cbData = static_cast<DWORD>(wcslen(data) + 1) * sizeof WCHAR;
cds.lpData = data;
PWCHAR data = DOPUS_IPC_LP_DATA;
COPYDATASTRUCT cds;
cds.dwData = DOPUS_IPC_LP_INFO;
cds.cbData = static_cast<DWORD>(wcslen(data) + 1) * sizeof WCHAR;
cds.lpData = data;
auto ret = SendMessage(FindWindow(DOPUS_CLASS, DOPUS_NAME), WM_COPYDATA, reinterpret_cast<WPARAM>(hMsgWnd),
reinterpret_cast<LPARAM>(&cds));
if (!ret)
return;
auto ret = SendMessage(FindWindow(DOPUS_CLASS, DOPUS_NAME), WM_COPYDATA, reinterpret_cast<WPARAM>(hMsgWnd),
reinterpret_cast<LPARAM>(&cds));
if (!ret)
return;
WaitForSingleObject(hGetResultEvent, 2000);
WaitForSingleObject(hGetResultEvent, 2000);
ParseXmlBuffer(buffer);
ParseXmlBuffer(buffer);
delete[] pXmlBuffer;
delete[] pXmlBuffer;
}
void DOpus::ParseXmlBuffer(PWCHAR buffer)
{
/*
* <?xml version="1.0" encoding="UTF-8"?>
* <results command="listsel" result="1">
* <items display_path="C:\folder" lister="0x707f6" path="C:\folder" tab="0xb0844">
* <item id="11" name="1.jpg" path="C:\folder\1.jpg" type="0" />
* <item id="12" name="2.zip" path="C:\folder\2.zip" type="1" />
* ...
*/
/*
* <?xml version="1.0" encoding="UTF-8"?>
* <results command="listsel" result="1">
* <items display_path="C:\folder" lister="0x707f6" path="C:\folder" tab="0xb0844">
* <item id="11" name="1.jpg" path="C:\folder\1.jpg" type="0" />
* <item id="12" name="2.zip" path="C:\folder\2.zip" type="1" />
* ...
*/
using namespace rapidxml;
using namespace rapidxml;
xml_document<> doc;
doc.parse<0>(pXmlBuffer);
xml_document<> doc;
doc.parse<0>(pXmlBuffer);
auto results = doc.first_node("results");
auto items = results->first_node("items");
for (auto item = items->first_node("item"); item; item = item->next_sibling("item"))
{
auto path = item->first_attribute("path")->value();
auto results = doc.first_node("results");
auto items = results->first_node("items");
for (auto item = items->first_node("item"); item; item = item->next_sibling("item"))
{
auto path = item->first_attribute("path")->value();
auto size = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, path, -1, nullptr, 0);
auto b = new WCHAR[size];
MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, path, -1, b, size);
auto size = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, path, -1, nullptr, 0);
auto b = new WCHAR[size];
MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, path, -1, b, size);
wcscpy_s(buffer, wcslen(b) + 1, b); // DOpus supports Long Path
wcscpy_s(buffer, wcslen(b) + 1, b); // DOpus supports Long Path
delete[] b;
return; // we now cares only the first result
}
delete[] b;
return; // we now cares only the first result
}
}
void DOpus::PrepareMessageWindow()
{
WNDCLASSEX wx = {sizeof wx};
wx.cbSize = sizeof(WNDCLASSEX);
wx.lpfnWndProc = msgWindowProc;
wx.lpszClassName = MSGWINDOW_CLASS;
WNDCLASSEX wx = {sizeof wx};
wx.cbSize = sizeof(WNDCLASSEX);
wx.lpfnWndProc = msgWindowProc;
wx.lpszClassName = MSGWINDOW_CLASS;
if (RegisterClassEx(&wx))
hMsgWnd = CreateWindowEx(0, MSGWINDOW_CLASS, L"", 0, 0, 0, 0, 0, HWND_MESSAGE, nullptr, nullptr, nullptr);
if (RegisterClassEx(&wx))
hMsgWnd = CreateWindowEx(0, MSGWINDOW_CLASS, L"", 0, 0, 0, 0, 0, HWND_MESSAGE, nullptr, nullptr, nullptr);
hGetResultEvent = CreateEvent(nullptr, FALSE, FALSE, nullptr);
hGetResultEvent = CreateEvent(nullptr, FALSE, FALSE, nullptr);
}
LRESULT CALLBACK DOpus::msgWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_COPYDATA:
{
auto cds = reinterpret_cast<PCOPYDATASTRUCT>(lParam);
auto buf = static_cast<PCHAR>(cds->lpData);
switch (uMsg)
{
case WM_COPYDATA:
{
auto cds = reinterpret_cast<PCOPYDATASTRUCT>(lParam);
auto buf = static_cast<PCHAR>(cds->lpData);
pXmlBuffer = new CHAR[cds->cbData + 1]{'\0'};
memcpy(pXmlBuffer, buf, cds->cbData);
pXmlBuffer = new CHAR[cds->cbData + 1]{'\0'};
memcpy(pXmlBuffer, buf, cds->cbData);
SetEvent(hGetResultEvent);
return 0;
}
default:
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
SetEvent(hGetResultEvent);
return 0;
}
default:
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
}

View File

@@ -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);
};

View File

@@ -1,4 +1,4 @@
// Copyright © 2017 Paddy Xu
// Copyright © 2017-2025 QL-Win Contributors
//
// This file is part of QuickLook program.
//
@@ -34,122 +34,122 @@ static WCHAR filePathBuffer[MAX_PATH] = {'\0'};
void DialogHook::GetSelected(PWCHAR buffer)
{
if (HelperMethods::IsUWP())
return;
if (HelperMethods::IsUWP())
return;
auto hwndfg = GetForegroundWindow();
DWORD pid = 0;
auto tid = GetWindowThreadProcessId(hwndfg, &pid);
auto hwndfg = GetForegroundWindow();
DWORD pid = 0;
auto tid = GetWindowThreadProcessId(hwndfg, &pid);
auto hProc = OpenProcess(PROCESS_QUERY_INFORMATION, false, pid);
if (hProc == nullptr)
return;
auto hProc = OpenProcess(PROCESS_QUERY_INFORMATION, false, pid);
if (hProc == nullptr)
return;
if (WM_HOOK_NOTIFY == 0)
WM_HOOK_NOTIFY = RegisterWindowMessage(L"WM_QUICKLOOK_HOOK_NOTIFY_MSG");
if (WM_HOOK_NOTIFY == 0)
WM_HOOK_NOTIFY = RegisterWindowMessage(L"WM_QUICKLOOK_HOOK_NOTIFY_MSG");
BOOL isTargetWoW64 = false;
if (!IsWow64Process(hProc, &isTargetWoW64))
return;
BOOL isTargetWoW64 = false;
if (!IsWow64Process(hProc, &isTargetWoW64))
return;
CloseHandle(hProc);
CloseHandle(hProc);
BOOL isSelfWoW64 = false;
if (!IsWow64Process(GetCurrentProcess(), &isSelfWoW64))
return;
BOOL isSelfWoW64 = false;
if (!IsWow64Process(GetCurrentProcess(), &isSelfWoW64))
return;
// if QuickLook is 64bit and target is 32bit, obtain result from the helper
if (isTargetWoW64 && !isSelfWoW64)
{
GetSelectedFromWoW64HookHelper(buffer);
}
else
{
if (ghHook != nullptr)
UnhookWindowsHookEx(ghHook);
ghHook = SetWindowsHookEx(WH_CALLWNDPROC, static_cast<HOOKPROC>(MsgHookProc), ModuleFromAddress(MsgHookProc), tid);
if (ghHook == nullptr)
return;
// if QuickLook is 64bit and target is 32bit, obtain result from the helper
if (isTargetWoW64 && !isSelfWoW64)
{
GetSelectedFromWoW64HookHelper(buffer);
}
else
{
if (ghHook != nullptr)
UnhookWindowsHookEx(ghHook);
ghHook = SetWindowsHookEx(WH_CALLWNDPROC, static_cast<HOOKPROC>(MsgHookProc), ModuleFromAddress(MsgHookProc), tid);
if (ghHook == nullptr)
return;
SendMessage(hwndfg, WM_HOOK_NOTIFY, 0, 0);
GetLongPathName(filePathBuffer, buffer, MAX_PATH_EX);
}
SendMessage(hwndfg, WM_HOOK_NOTIFY, 0, 0);
GetLongPathName(filePathBuffer, buffer, MAX_PATH_EX);
}
}
void DialogHook::getSelectedInternal(CComPtr<IShellBrowser> psb, PWCHAR buffer)
{
CComPtr<IShellView> psv;
if (FAILED(psb->QueryActiveShellView(&psv)))
return;
CComPtr<IShellView> psv;
if (FAILED(psb->QueryActiveShellView(&psv)))
return;
CComPtr<IDataObject> dao;
if (FAILED(psv->GetItemObject(SVGIO_SELECTION, IID_IDataObject, reinterpret_cast<void**>(&dao))))
return;
CComPtr<IDataObject> dao;
if (FAILED(psv->GetItemObject(SVGIO_SELECTION, IID_IDataObject, reinterpret_cast<void**>(&dao))))
return;
return HelperMethods::ObtainFirstItem(dao, buffer);
return HelperMethods::ObtainFirstItem(dao, buffer);
}
void DialogHook::GetSelectedFromWoW64HookHelper(PWCHAR buffer)
{
if (!WoW64HookHelper::CheckStatus())
if (!WoW64HookHelper::Launch())
return;
if (!WoW64HookHelper::CheckStatus())
if (!WoW64HookHelper::Launch())
return;
auto hHelperWnd = FindWindowEx(HWND_MESSAGE, nullptr, WoW64HookHelper::GetMsgWindowClassName(), nullptr);
if (hHelperWnd == nullptr)
return;
auto hHelperWnd = FindWindowEx(HWND_MESSAGE, nullptr, WoW64HookHelper::GetMsgWindowClassName(), nullptr);
if (hHelperWnd == nullptr)
return;
auto hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, nullptr, PAGE_READWRITE, 0, MAX_PATH * sizeof WCHAR,
SHARED_MEM_NAME);
if (hMapFile == nullptr)
return;
auto hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, nullptr, PAGE_READWRITE, 0, MAX_PATH * sizeof WCHAR,
SHARED_MEM_NAME);
if (hMapFile == nullptr)
return;
auto sharedBuffer = static_cast<PWCHAR>(MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, MAX_PATH * sizeof WCHAR));
if (sharedBuffer == nullptr)
{
CloseHandle(hMapFile);
return;
}
auto sharedBuffer = static_cast<PWCHAR>(MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, MAX_PATH * sizeof WCHAR));
if (sharedBuffer == nullptr)
{
CloseHandle(hMapFile);
return;
}
SendMessage(hHelperWnd, WM_HOOK_NOTIFY, 0, 0);
SendMessage(hHelperWnd, WM_HOOK_NOTIFY, 0, 0);
// the sharedBuffer should now ready
GetLongPathName(sharedBuffer, buffer, MAX_PATH_EX);
// the sharedBuffer should now ready
GetLongPathName(sharedBuffer, buffer, MAX_PATH_EX);
UnmapViewOfFile(sharedBuffer);
CloseHandle(hMapFile);
UnmapViewOfFile(sharedBuffer);
CloseHandle(hMapFile);
}
HMODULE DialogHook::ModuleFromAddress(PVOID pv)
{
MEMORY_BASIC_INFORMATION mbi;
return VirtualQuery(pv, &mbi, sizeof mbi) != 0 ? static_cast<HMODULE>(mbi.AllocationBase) : nullptr;
MEMORY_BASIC_INFORMATION mbi;
return VirtualQuery(pv, &mbi, sizeof mbi) != 0 ? static_cast<HMODULE>(mbi.AllocationBase) : nullptr;
}
LRESULT DialogHook::MsgHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode < 0)
goto CONTINUE;
if (nCode < 0)
goto CONTINUE;
auto pMSG = reinterpret_cast<CWPSTRUCT*>(lParam);
auto pMSG = reinterpret_cast<CWPSTRUCT*>(lParam);
// only response to WM_HOOK_NOTIFY
if (pMSG->message != WM_HOOK_NOTIFY)
goto CONTINUE;
// only response to WM_HOOK_NOTIFY
if (pMSG->message != WM_HOOK_NOTIFY)
goto CONTINUE;
UnhookWindowsHookEx(ghHook);
ghHook = nullptr;
UnhookWindowsHookEx(ghHook);
ghHook = nullptr;
// get current selected item
auto psb = reinterpret_cast<IShellBrowser*>(SendMessage(GetForegroundWindow(), WM_USER + 7, 0, 0));
if (psb == nullptr)
goto CONTINUE;
// get current selected item
auto psb = reinterpret_cast<IShellBrowser*>(SendMessage(GetForegroundWindow(), WM_USER + 7, 0, 0));
if (psb == nullptr)
goto CONTINUE;
getSelectedInternal(psb, filePathBuffer);
getSelectedInternal(psb, filePathBuffer);
return 0;
return 0;
CONTINUE:
return CallNextHookEx(ghHook, nCode, wParam, lParam);
return CallNextHookEx(ghHook, nCode, wParam, lParam);
}

View File

@@ -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);
};

View File

@@ -1,4 +1,4 @@
// Copyright © 2017 Paddy Xu
// Copyright © 2017-2025 QL-Win Contributors
//
// This file is part of QuickLook program.
//
@@ -27,18 +27,18 @@
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);
}

View File

@@ -1,4 +1,4 @@
// Copyright © 2017 Paddy Xu
// Copyright © 2017-2025 QL-Win Contributors
//
// This file is part of QuickLook program.
//
@@ -20,66 +20,66 @@
void Everything::GetSelected(PWCHAR buffer)
{
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.
}
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.
}
HWND hWin = FindWindowW(EVERYTHING_IPC_WINDOW_CLASS, NULL);
HWND hWin = FindWindowW(EVERYTHING_IPC_WINDOW_CLASS, NULL);
if (hWin != nullptr) {
// Everything IPC Clipboard
SendMessageW(
hWin,
WM_COMMAND,
MAKEWPARAM(EVERYTHING_IPC_COPY_TO_CLIPBOARD, 0),
0);
if (hWin != nullptr) {
// Everything IPC Clipboard
SendMessageW(
hWin,
WM_COMMAND,
MAKEWPARAM(EVERYTHING_IPC_COPY_TO_CLIPBOARD, 0),
0);
Sleep(100);
if (!OpenClipboard(nullptr))
return;
auto hData = GetClipboardData(CF_UNICODETEXT);
if (hData == nullptr)
return;
Sleep(100);
if (!OpenClipboard(nullptr))
return;
auto hData = GetClipboardData(CF_UNICODETEXT);
if (hData == nullptr)
return;
auto pText = static_cast<PWCHAR>(GlobalLock(hData));
if (pText == nullptr)
return;
auto pText = static_cast<PWCHAR>(GlobalLock(hData));
if (pText == nullptr)
return;
auto p = wcsstr(pText, L"\r\n");
auto l = p == nullptr ? wcslen(pText) : p - pText;
wcsncpy_s(buffer, MAX_PATH_EX, pText, l); // Everything supports Long Path
GlobalUnlock(hData);
CloseClipboard();
}
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();
}
}
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));
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
}

View File

@@ -1,4 +1,4 @@
// Copyright © 2017 Paddy Xu
// Copyright © 2017-2025 QL-Win Contributors
//
// This file is part of QuickLook program.
//
@@ -15,18 +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
#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 bool MatchClass(PWCHAR classBuffer);
static void GetSelected(PWCHAR buffer);
static bool MatchClass(PWCHAR classBuffer);
private:
static void backupClipboard();
static void restoreClipboard();
static void backupClipboard();
static void restoreClipboard();
};

View File

@@ -1,4 +1,4 @@
// Copyright © 2017 Paddy Xu
// Copyright © 2017-2025 QL-Win Contributors
//
// This file is part of QuickLook program.
//
@@ -16,118 +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(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 ObtainFirstItem(dao, buffer);
return ObtainFirstItem(dao, buffer);
}
void HelperMethods::ObtainFirstItem(CComPtr<IDataObject> dao, PWCHAR buffer)
{
FORMATETC formatetc;
STGMEDIUM medium = {sizeof medium};
if (!dao || !buffer)
return;
formatetc.cfFormat = CF_HDROP;
formatetc.ptd = nullptr;
formatetc.dwAspect = DVASPECT_CONTENT;
formatetc.lindex = -1;
formatetc.tymed = TYMED_HGLOBAL;
FORMATETC formatetc = {};
STGMEDIUM medium = {};
medium.tymed = TYMED_HGLOBAL;
formatetc.cfFormat = CF_HDROP;
formatetc.ptd = nullptr;
formatetc.dwAspect = DVASPECT_CONTENT;
formatetc.lindex = -1;
formatetc.tymed = TYMED_HGLOBAL;
if (FAILED(dao->GetData(&formatetc, &medium)))
return;
medium.tymed = TYMED_HGLOBAL;
int n = DragQueryFile(HDROP(medium.hGlobal), 0xFFFFFFFF, nullptr, 0);
// Try CF_HDROP first
// If the file path is too long, the call might fail but CFSTR_SHELLIDLIST will do it
// https://github.com/QL-Win/QuickLook/issues/1643
if (SUCCEEDED(dao->GetData(&formatetc, &medium)))
{
HDROP hDrop = HDROP(medium.hGlobal);
int count = DragQueryFile(hDrop, 0xFFFFFFFF, nullptr, 0);
if (count >= 1)
{
WCHAR localBuffer[MAX_PATH] = { '\0' };
if (DragQueryFileW(hDrop, 0, localBuffer, MAX_PATH) > 0)
{
GetLongPathName(localBuffer, buffer, MAX_PATH_EX);
ReleaseStgMedium(&medium);
return;
}
ReleaseStgMedium(&medium);
}
}
if (n < 1)
return;
// If CF_HDROP fails, try CFSTR_SHELLIDLIST
// Support Desktop Icons (This PC, Recycle Bin and so on)
// https://github.com/QL-Win/QuickLook/issues/1610
static const CLIPFORMAT cfShellIDList = (CLIPFORMAT)RegisterClipboardFormatW(CFSTR_SHELLIDLIST);
formatetc.cfFormat = cfShellIDList;
WCHAR localBuffer[MAX_PATH] = { '\0' };
DragQueryFile(HDROP(medium.hGlobal), 0, localBuffer, MAX_PATH);
GetLongPathName(localBuffer, buffer, MAX_PATH_EX);
if (SUCCEEDED(dao->GetData(&formatetc, &medium)))
{
CIDA* pida = (CIDA*)GlobalLock(medium.hGlobal);
if (!pida)
{
ReleaseStgMedium(&medium);
return;
}
ITEMIDLIST* pidlFolder = (ITEMIDLIST*)((BYTE*)pida + pida->aoffset[0]);
ITEMIDLIST* pidlItem = (ITEMIDLIST*)((BYTE*)pida + pida->aoffset[1]);
PIDLIST_ABSOLUTE pidlFull = ILCombine(pidlFolder, pidlItem);
GlobalUnlock(medium.hGlobal);
ReleaseStgMedium(&medium);
if (!pidlFull)
return;
// Convert to IShellItem to get canonical parsing path
CComPtr<IShellItem> shellItem;
if (SUCCEEDED(SHCreateItemFromIDList(pidlFull, IID_PPV_ARGS(&shellItem))))
{
PWSTR pszPath = nullptr;
if (SUCCEEDED(shellItem->GetDisplayName(SIGDN_DESKTOPABSOLUTEPARSING, &pszPath)))
{
StringCchCopyW(buffer, MAX_PATH_EX, pszPath); // returns e.g., ::{645FF040-5081-101B-9F08-00AA002F954E}
CoTaskMemFree(pszPath);
}
}
ILFree(pidlFull);
}
}
bool HelperMethods::IsListaryToolbarVisible()
{
auto CALLBACK findListaryWindowProc = [](__in HWND hwnd, __in LPARAM lParam)-> BOOL
{
WCHAR classBuffer[MAX_PATH] = {'\0'};
if (FAILED(GetClassName(hwnd, classBuffer, MAX_PATH)))
return TRUE;
auto CALLBACK findListaryWindowProc = [](__in HWND hwnd, __in LPARAM lParam)-> BOOL
{
WCHAR classBuffer[MAX_PATH] = {'\0'};
if (FAILED(GetClassName(hwnd, classBuffer, MAX_PATH)))
return TRUE;
if (wcsncmp(classBuffer, L"Listary_WidgetWin_", 18) == 0)
{
if (IsWindowVisible(hwnd))
{
*reinterpret_cast<bool*>(lParam) = true;
return FALSE;
}
}
return TRUE;
};
if (wcsncmp(classBuffer, L"Listary_WidgetWin_", 18) == 0)
{
if (IsWindowVisible(hwnd))
{
*reinterpret_cast<bool*>(lParam) = true;
return FALSE;
}
}
return TRUE;
};
auto found = false;
EnumWindows(findListaryWindowProc, reinterpret_cast<LPARAM>(&found));
auto found = false;
EnumWindows(findListaryWindowProc, reinterpret_cast<LPARAM>(&found));
return found;
return found;
}
// Windows 10 1909 replaced the search box in the File Explorer by a UWP control.
// gti.flags is always 0 for UWP applications.
bool HelperMethods::IsExplorerSearchBoxFocused()
{
auto* hwnd = GetFocusedControl();
auto* hwnd = GetFocusedControl();
WCHAR classBuffer[MAX_PATH] = { '\0' };
if (FAILED(GetClassName(hwnd, classBuffer, MAX_PATH)))
return false;
WCHAR classBuffer[MAX_PATH] = { '\0' };
if (FAILED(GetClassName(hwnd, classBuffer, MAX_PATH)))
return false;
return wcscmp(classBuffer, L"Windows.UI.Core.CoreWindow") == 0;
return wcscmp(classBuffer, L"Windows.UI.Core.CoreWindow") == 0;
}
bool HelperMethods::IsCursorActivated(HWND hwnd)
{
auto tId = GetWindowThreadProcessId(hwnd, nullptr);
auto tId = GetWindowThreadProcessId(hwnd, nullptr);
GUITHREADINFO gti = { sizeof gti };
GetGUIThreadInfo(tId, &gti);
GUITHREADINFO gti = { sizeof gti };
GetGUIThreadInfo(tId, &gti);
return gti.flags || gti.hwndCaret || IsListaryToolbarVisible();
return gti.flags || gti.hwndCaret || IsListaryToolbarVisible();
}
bool HelperMethods::IsUWP()
{
auto pGCPFN = decltype(&GetCurrentPackageFullName)(
GetProcAddress(GetModuleHandle(L"kernel32.dll"), "GetCurrentPackageFullName"));
auto pGCPFN = decltype(&GetCurrentPackageFullName)(
GetProcAddress(GetModuleHandle(L"kernel32.dll"), "GetCurrentPackageFullName"));
if (!pGCPFN)
return false;
if (!pGCPFN)
return false;
UINT32 pn = 0;
return pGCPFN(&pn, nullptr) == ERROR_INSUFFICIENT_BUFFER;
UINT32 pn = 0;
return pGCPFN(&pn, nullptr) == ERROR_INSUFFICIENT_BUFFER;
}
HWND HelperMethods::GetFocusedControl()
{
auto tid = GetWindowThreadProcessId(GetForegroundWindow(), nullptr);
auto tid = GetWindowThreadProcessId(GetForegroundWindow(), nullptr);
if (0 == AttachThreadInput(GetCurrentThreadId(), tid, TRUE))
return nullptr;
if (0 == AttachThreadInput(GetCurrentThreadId(), tid, TRUE))
return nullptr;
auto* hwnd = GetFocus();
auto* hwnd = GetFocus();
AttachThreadInput(GetCurrentThreadId(), tid, FALSE);
AttachThreadInput(GetCurrentThreadId(), tid, FALSE);
return hwnd;
return hwnd;
}

View File

@@ -1,4 +1,4 @@
// Copyright © 2017 Paddy Xu
// Copyright © 2017-2025 QL-Win Contributors
//
// This file is part of QuickLook program.
//
@@ -19,13 +19,13 @@
class HelperMethods
{
public:
static void GetSelectedInternal(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();
static void GetSelectedInternal(CComPtr<IShellBrowser> psb, PWCHAR buffer);
static void ObtainFirstItem(CComPtr<IDataObject> dao, PWCHAR buffer);
static bool IsCursorActivated(HWND hwndfg);
static bool IsExplorerSearchBoxFocused();
static bool HelperMethods::IsUWP();
private:
static bool IsListaryToolbarVisible();
static HWND GetFocusedControl();
static bool IsListaryToolbarVisible();
static HWND GetFocusedControl();
};

View File

@@ -1,3 +1,5 @@
// 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
@@ -27,9 +29,9 @@ void MultiCommander::GetSelected(PWCHAR buffer)
}
COPYDATASTRUCT cds;
cds.dwData = MULTICMD_CPF_GETCURITEMFULL | MULTICMD_CPF_SOURCE;
cds.cbData = 0;
cds.lpData = nullptr;
cds.dwData = MULTICMD_CPF_GETCURITEMFULL | MULTICMD_CPF_SOURCE;
cds.cbData = 0;
cds.lpData = nullptr;
ResetEvent(hGetResultEvent);
@@ -37,12 +39,12 @@ void MultiCommander::GetSelected(PWCHAR buffer)
FindWindow(MULTICMD_CLASS, nullptr),
WM_COPYDATA,
reinterpret_cast<WPARAM>(hMsgWnd),
reinterpret_cast<LPARAM>(&cds)
reinterpret_cast<LPARAM>(&cds)
);
if (!ret || WAIT_OBJECT_0 != WaitForSingleObject(hGetResultEvent, 2000)) {
if (!ret || WAIT_OBJECT_0 != WaitForSingleObject(hGetResultEvent, 2000)) {
return;
}
}
auto path = reinterpret_cast<PWCHAR>(pCurrentItemPath);
wcscpy_s(buffer, wcslen(path) + 1, path);
@@ -78,21 +80,21 @@ bool MultiCommander::PrepareMessageWindow()
LRESULT CALLBACK MultiCommander::msgWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_COPYDATA:
{
{
case WM_COPYDATA:
{
delete[] pCurrentItemPath;
auto cds = reinterpret_cast<PCOPYDATASTRUCT>(lParam);
auto buf = static_cast<PCHAR>(cds->lpData);
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);
pCurrentItemPath = new CHAR[cds->cbData + 1]{ '\0' };
memcpy(pCurrentItemPath, buf, cds->cbData);
SetEvent(hGetResultEvent);
return 0;
}
default:
}
default:
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
}
}

View File

@@ -1,3 +1,5 @@
// 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
@@ -24,13 +26,13 @@
class MultiCommander
{
public:
static void GetSelected(PWCHAR buffer);
static void GetSelected(PWCHAR buffer);
static bool PrepareMessageWindow();
MultiCommander() = delete;
private:
static HWND hMsgWnd;
static HANDLE hGetResultEvent;
static PCHAR pCurrentItemPath;
static HANDLE hGetResultEvent;
static PCHAR pCurrentItemPath;
static LRESULT CALLBACK msgWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
};

View File

@@ -1,4 +1,4 @@
// Copyright © 2017 Paddy Xu
// Copyright © 2017-2025 QL-Win Contributors
//
// This file is part of QuickLook program.
//
@@ -28,157 +28,157 @@ 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, 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;
}
}
}
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;
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;
}
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 hwndfgw = GetForegroundWindow();
auto hwndfgt = FindWindowEx(hwndfgw, nullptr, L"ShellTabWindowClass", nullptr);
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;
CComPtr<IServiceProvider> psp;
if (FAILED(pdisp->QueryInterface(IID_IServiceProvider, reinterpret_cast<void**>(&psp))))
continue;
CComPtr<IServiceProvider> psp;
if (FAILED(pdisp->QueryInterface(IID_IServiceProvider, reinterpret_cast<void**>(&psp))))
continue;
CComPtr<IShellBrowser> psb;
if (FAILED(psp->QueryService(IID_IShellBrowser, IID_IShellBrowser, reinterpret_cast<LPVOID*>(&psb))))
continue;
CComPtr<IShellBrowser> psb;
if (FAILED(psp->QueryService(IID_IShellBrowser, IID_IShellBrowser, reinterpret_cast<LPVOID*>(&psb))))
continue;
HWND phwnd;
if (FAILED(psb->GetWindow(&phwnd)))
continue;
HWND phwnd;
if (FAILED(psb->GetWindow(&phwnd)))
continue;
if (hwndfgw != phwnd && (hwndfgt != nullptr && hwndfgt != phwnd))
continue;
if (hwndfgw != phwnd && (hwndfgt != nullptr && hwndfgt != phwnd))
continue;
if (HelperMethods::IsCursorActivated(0))
continue;
if (HelperMethods::IsCursorActivated(0))
continue;
HelperMethods::GetSelectedInternal(psb, buffer);
return;
}
HelperMethods::GetSelectedInternal(psb, buffer);
return;
}
}
void Shell32::getSelectedFromDesktop(PWCHAR buffer)
{
CoInitialize(nullptr);
CoInitialize(nullptr);
CComPtr<IShellWindows> psw;
CComPtr<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;
CComPtr<IServiceProvider> psp;
if (FAILED(pwba->QueryInterface(IID_IServiceProvider, reinterpret_cast<void**>(&psp))))
return;
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;
CComPtr<IShellBrowser> psb;
if (FAILED(psp->QueryService(IID_IShellBrowser, IID_IShellBrowser, reinterpret_cast<LPVOID*>(&psb))))
return;
HelperMethods::GetSelectedInternal(psb, buffer);
HelperMethods::GetSelectedInternal(psb, buffer);
}

View File

@@ -1,4 +1,4 @@
// Copyright © 2017 Paddy Xu
// Copyright © 2017-2025 QL-Win Contributors
//
// This file is part of QuickLook program.
//
@@ -22,21 +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);
};

View File

@@ -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);
}

View File

@@ -1,4 +1,4 @@
// Copyright © 2017 Paddy Xu
// Copyright © 2017-2025 QL-Win Contributors
//
// This file is part of QuickLook program.
//
@@ -22,14 +22,14 @@
class WoW64HookHelper
{
public:
static PWCHAR GetMsgWindowClassName()
{
return L"QUICKLOOK_WOW64HOOKHELPER_MSG_CLASS";
}
static PWCHAR GetMsgWindowClassName()
{
return L"QUICKLOOK_WOW64HOOKHELPER_MSG_CLASS";
}
static bool CheckStatus();
static bool Launch();
static bool CheckStatus();
static bool Launch();
private:
static void createJob();
static void createJob();
};

View File

@@ -1,4 +1,4 @@
// Copyright © 2017 Paddy Xu
// Copyright © 2017-2025 QL-Win Contributors
//
// This file is part of QuickLook program.
//
@@ -20,14 +20,14 @@
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
default:
break;
}
return TRUE;
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
default:
break;
}
return TRUE;
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,4 +1,4 @@
// Copyright © 2017 Paddy Xu
// Copyright © 2017-2025 QL-Win Contributors
//
// This file is part of QuickLook program.
//

View File

@@ -1,4 +1,4 @@
// Copyright © 2017 Paddy Xu
// Copyright © 2017-2025 QL-Win Contributors
//
// This file is part of QuickLook program.
//

View File

@@ -1,4 +1,4 @@
// Copyright © 2017 Paddy Xu
// Copyright © 2017-2025 QL-Win Contributors
//
// This file is part of QuickLook program.
//

View File

@@ -1,4 +1,4 @@
// Copyright © 2017 Paddy Xu
// Copyright © 2017-2025 QL-Win Contributors
//
// This file is part of QuickLook program.
//
@@ -38,67 +38,67 @@ int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
_In_ LPWSTR lpCmdLine,
_In_ int nCmdShow)
{
// do not run when double-clicking
if (wcsstr(GetCommandLine(), RUN_ARG) == nullptr)
{
MessageBox(nullptr, L"This executable is not designed to launch directly.", L"QuickLook.WoW64HookHelper", 0);
return 0;
}
// do not run when double-clicking
if (wcsstr(GetCommandLine(), RUN_ARG) == nullptr)
{
MessageBox(nullptr, L"This executable is not designed to launch directly.", L"QuickLook.WoW64HookHelper", 0);
return 0;
}
pDll = LoadLibrary(L"QuickLook.Native32.dll");
pGCS = reinterpret_cast<PGCS>(GetProcAddress(pDll, "GetCurrentSelection"));
pDll = LoadLibrary(L"QuickLook.Native32.dll");
pGCS = reinterpret_cast<PGCS>(GetProcAddress(pDll, "GetCurrentSelection"));
WM_HOOK_NOTIFY = RegisterWindowMessage(L"WM_QUICKLOOK_HOOK_NOTIFY_MSG");
WM_HOOK_NOTIFY = RegisterWindowMessage(L"WM_QUICKLOOK_HOOK_NOTIFY_MSG");
WNDCLASS wc = {};
wc.lpfnWndProc = WndProc;
wc.lpszClassName = MSG_WINDOW_CLASS;
if (!RegisterClass(&wc))
return 0;
WNDCLASS wc = {};
wc.lpfnWndProc = WndProc;
wc.lpszClassName = MSG_WINDOW_CLASS;
if (!RegisterClass(&wc))
return 0;
hMsgWindow = CreateWindow(MSG_WINDOW_CLASS, nullptr, 0, 0, 0, 0, 0, HWND_MESSAGE, nullptr, nullptr, nullptr);
if (hMsgWindow == nullptr)
return 0;
hMsgWindow = CreateWindow(MSG_WINDOW_CLASS, nullptr, 0, 0, 0, 0, 0, HWND_MESSAGE, nullptr, nullptr, nullptr);
if (hMsgWindow == nullptr)
return 0;
MSG msg;
while (GetMessage(&msg, nullptr, 0, 0) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
MSG msg;
while (GetMessage(&msg, nullptr, 0, 0) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
if (msg == WM_HOOK_NOTIFY)
{
GetCurrentSelection();
return 0;
}
return DefWindowProc(hwnd, msg, wParam, lParam);
if (msg == WM_HOOK_NOTIFY)
{
GetCurrentSelection();
return 0;
}
return DefWindowProc(hwnd, msg, wParam, lParam);
}
void GetCurrentSelection()
{
// This function runs inside the target process. Some of them may already support Long Path.
// Therefore, we must assume all of them support Long Path to avoid buffer overflow.
WCHAR dllBuffer[MAX_PATH_EX] = {'\0'};
pGCS(dllBuffer);
// This function runs inside the target process. Some of them may already support Long Path.
// Therefore, we must assume all of them support Long Path to avoid buffer overflow.
WCHAR dllBuffer[MAX_PATH_EX] = {'\0'};
pGCS(dllBuffer);
auto hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, false, SHARED_MEM_NAME);
if (hMapFile == nullptr)
return;
auto hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, false, SHARED_MEM_NAME);
if (hMapFile == nullptr)
return;
auto buffer = static_cast<PWCHAR>(MapViewOfFile(hMapFile, FILE_MAP_WRITE, 0, 0, 0));
if (buffer == nullptr)
{
CloseHandle(hMapFile);
return;
}
auto buffer = static_cast<PWCHAR>(MapViewOfFile(hMapFile, FILE_MAP_WRITE, 0, 0, 0));
if (buffer == nullptr)
{
CloseHandle(hMapFile);
return;
}
wcscpy_s(buffer, wcslen(dllBuffer) + 1, dllBuffer);
wcscpy_s(buffer, wcslen(dllBuffer) + 1, dllBuffer);
UnmapViewOfFile(buffer);
CloseHandle(hMapFile);
UnmapViewOfFile(buffer);
CloseHandle(hMapFile);
}

View File

@@ -1,4 +1,4 @@
// Copyright © 2017 Paddy Xu
// Copyright © 2017-2025 QL-Win Contributors
//
// This file is part of QuickLook program.
//

View File

@@ -1,4 +1,4 @@
// Copyright © 2017 Paddy Xu
// Copyright © 2017-2025 QL-Win Contributors
//
// This file is part of QuickLook program.
//

View File

@@ -1,4 +1,4 @@
// Copyright © 2017 Paddy Xu
// Copyright © 2017-2025 QL-Win Contributors
//
// This file is part of QuickLook program.
//

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