From 7132d5ac691ac59d2d6ac801c57c7da43c42003b Mon Sep 17 00:00:00 2001 From: Dreamoochy Date: Sun, 25 Feb 2024 15:52:41 +0300 Subject: [PATCH 1/2] Added Multi Commander support --- .../QuickLook.Native32/MultiCommander.cpp | 98 +++++++++++++++++++ .../QuickLook.Native32/MultiCommander.h | 37 +++++++ 2 files changed, 135 insertions(+) create mode 100644 QuickLook.Native/QuickLook.Native32/MultiCommander.cpp create mode 100644 QuickLook.Native/QuickLook.Native32/MultiCommander.h diff --git a/QuickLook.Native/QuickLook.Native32/MultiCommander.cpp b/QuickLook.Native/QuickLook.Native32/MultiCommander.cpp new file mode 100644 index 00000000..025250f2 --- /dev/null +++ b/QuickLook.Native/QuickLook.Native32/MultiCommander.cpp @@ -0,0 +1,98 @@ +// This file is part of QuickLook program. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +#include "stdafx.h" +#include "MultiCommander.h" + +HWND MultiCommander::hMsgWnd = nullptr; +HANDLE MultiCommander::hGetResultEvent = nullptr; +PCHAR MultiCommander::pCurrentItemPath = nullptr; + +void MultiCommander::GetSelected(PWCHAR buffer) +{ + if (false == PrepareMessageWindow()) { + return; + } + + COPYDATASTRUCT cds; + cds.dwData = MULTICMD_CPF_GETCURITEMFULL | MULTICMD_CPF_SOURCE; + cds.cbData = 0; + cds.lpData = nullptr; + + ResetEvent(hGetResultEvent); + + auto ret = SendMessage( + FindWindow(MULTICMD_CLASS, nullptr), + WM_COPYDATA, + reinterpret_cast(hMsgWnd), + reinterpret_cast(&cds) + ); + + if (!ret || WAIT_OBJECT_0 != WaitForSingleObject(hGetResultEvent, 2000)) { + return; + } + + auto path = reinterpret_cast(pCurrentItemPath); + wcscpy_s(buffer, wcslen(path) + 1, path); + + delete[] pCurrentItemPath; + pCurrentItemPath = nullptr; +} + +bool MultiCommander::PrepareMessageWindow() +{ + if (nullptr == hMsgWnd) { + WNDCLASSEX wx = {}; + + wx.cbSize = sizeof(WNDCLASSEX); + wx.lpfnWndProc = msgWindowProc; + wx.lpszClassName = MULTICMD_MSGWINDOW_CLASS; + + if (RegisterClassEx(&wx)) + hMsgWnd = CreateWindowEx(0, MULTICMD_MSGWINDOW_CLASS, L"", 0, 0, 0, 0, 0, HWND_MESSAGE, nullptr, nullptr, nullptr); + + if (nullptr == hMsgWnd) { + return false; + } + } + + if (nullptr == hGetResultEvent) { + hGetResultEvent = CreateEvent(nullptr, TRUE, FALSE, nullptr); + } + + return (nullptr != hGetResultEvent); +} + +LRESULT CALLBACK MultiCommander::msgWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + switch (uMsg) + { + case WM_COPYDATA: + { + delete[] pCurrentItemPath; + + auto cds = reinterpret_cast(lParam); + auto buf = static_cast(cds->lpData); + + pCurrentItemPath = new CHAR[cds->cbData + 1]{ '\0' }; + memcpy(pCurrentItemPath, buf, cds->cbData); + + SetEvent(hGetResultEvent); + return 0; + } + default: + return DefWindowProc(hWnd, uMsg, wParam, lParam); + } +} diff --git a/QuickLook.Native/QuickLook.Native32/MultiCommander.h b/QuickLook.Native/QuickLook.Native32/MultiCommander.h new file mode 100644 index 00000000..44074f3e --- /dev/null +++ b/QuickLook.Native/QuickLook.Native32/MultiCommander.h @@ -0,0 +1,37 @@ +// This file is part of QuickLook program. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +#pragma once + +#define MULTICMD_CPF_GETCURITEMFULL 0x00000010L // Get full path of current item (file or folder) in focus +#define MULTICMD_CPF_SOURCE 0x00000400L // Go to the new path in the source panel side + +#define MULTICMD_CLASS L"MultiCommander MainWnd" +#define MULTICMD_MSGWINDOW_CLASS L"QuickLook.Native.MultiCmd.MsgWindow" + +class MultiCommander +{ +public: + static void GetSelected(PWCHAR buffer); + static bool PrepareMessageWindow(); + MultiCommander() = delete; +private: + static HWND hMsgWnd; + static HANDLE hGetResultEvent; + static PCHAR pCurrentItemPath; + + static LRESULT CALLBACK msgWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); +}; + From 6096fb0db6cc870b4966b7c2af2c61068283a840 Mon Sep 17 00:00:00 2001 From: Dreamoochy Date: Sun, 25 Feb 2024 15:56:51 +0300 Subject: [PATCH 2/2] Update Multi Commander changes --- QuickLook.Native/QuickLook.Native32/DllExport.cpp | 2 ++ .../QuickLook.Native32/QuickLook.Native32.vcxproj | 4 +++- .../QuickLook.Native32/QuickLook.Native32.vcxproj.filters | 8 +++++++- QuickLook.Native/QuickLook.Native32/Shell32.cpp | 8 ++++++++ QuickLook.Native/QuickLook.Native32/Shell32.h | 1 + .../QuickLook.Native64/QuickLook.Native64.vcxproj | 3 ++- .../QuickLook.Native64/QuickLook.Native64.vcxproj.filters | 3 ++- QuickLook/NativeMethods/QuickLook.cs | 5 +++-- 8 files changed, 28 insertions(+), 6 deletions(-) diff --git a/QuickLook.Native/QuickLook.Native32/DllExport.cpp b/QuickLook.Native/QuickLook.Native32/DllExport.cpp index add47fa2..ac5b22d5 100644 --- a/QuickLook.Native/QuickLook.Native32/DllExport.cpp +++ b/QuickLook.Native/QuickLook.Native32/DllExport.cpp @@ -20,6 +20,7 @@ #include "Shell32.h" #include "WoW64HookHelper.h" #include "DOpus.h" +#include "MultiCommander.h" #define EXPORT extern "C" __declspec(dllexport) @@ -29,6 +30,7 @@ EXPORT void Init() WoW64HookHelper::Launch(); #endif DOpus::PrepareMessageWindow(); + MultiCommander::PrepareMessageWindow(); } EXPORT Shell32::FocusedWindowType GetFocusedWindowType() diff --git a/QuickLook.Native/QuickLook.Native32/QuickLook.Native32.vcxproj b/QuickLook.Native/QuickLook.Native32/QuickLook.Native32.vcxproj index 36e8aa6a..6fee4e73 100644 --- a/QuickLook.Native/QuickLook.Native32/QuickLook.Native32.vcxproj +++ b/QuickLook.Native/QuickLook.Native32/QuickLook.Native32.vcxproj @@ -86,6 +86,7 @@ + @@ -106,6 +107,7 @@ + Create @@ -116,4 +118,4 @@ - \ No newline at end of file + diff --git a/QuickLook.Native/QuickLook.Native32/QuickLook.Native32.vcxproj.filters b/QuickLook.Native/QuickLook.Native32/QuickLook.Native32.vcxproj.filters index 29959b09..cfa79460 100644 --- a/QuickLook.Native/QuickLook.Native32/QuickLook.Native32.vcxproj.filters +++ b/QuickLook.Native/QuickLook.Native32/QuickLook.Native32.vcxproj.filters @@ -42,6 +42,9 @@ Header Files + + Header Files + @@ -71,5 +74,8 @@ Source Files + + Source Files + - \ No newline at end of file + diff --git a/QuickLook.Native/QuickLook.Native32/Shell32.cpp b/QuickLook.Native/QuickLook.Native32/Shell32.cpp index 7ddf5053..ba4f4aed 100644 --- a/QuickLook.Native/QuickLook.Native32/Shell32.cpp +++ b/QuickLook.Native/QuickLook.Native32/Shell32.cpp @@ -22,6 +22,7 @@ #include "DialogHook.h" #include "Everything.h" #include "DOpus.h" +#include "MultiCommander.h" using namespace std; @@ -36,6 +37,10 @@ Shell32::FocusedWindowType Shell32::GetFocusedWindowType() 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; @@ -91,6 +96,9 @@ void Shell32::GetCurrentSelection(PWCHAR buffer) case DOPUS: DOpus::GetSelected(buffer); break; + case MULTICOMMANDER: + MultiCommander::GetSelected(buffer); + break; default: break; } diff --git a/QuickLook.Native/QuickLook.Native32/Shell32.h b/QuickLook.Native/QuickLook.Native32/Shell32.h index c1aed9bb..9a6a9e33 100644 --- a/QuickLook.Native/QuickLook.Native32/Shell32.h +++ b/QuickLook.Native/QuickLook.Native32/Shell32.h @@ -30,6 +30,7 @@ class Shell32 DIALOG, EVERYTHING, DOPUS, + MULTICOMMANDER, }; static FocusedWindowType GetFocusedWindowType(); diff --git a/QuickLook.Native/QuickLook.Native64/QuickLook.Native64.vcxproj b/QuickLook.Native/QuickLook.Native64/QuickLook.Native64.vcxproj index aed6957f..a059fc5e 100644 --- a/QuickLook.Native/QuickLook.Native64/QuickLook.Native64.vcxproj +++ b/QuickLook.Native/QuickLook.Native64/QuickLook.Native64.vcxproj @@ -24,6 +24,7 @@ + Create @@ -98,4 +99,4 @@ - \ No newline at end of file + diff --git a/QuickLook.Native/QuickLook.Native64/QuickLook.Native64.vcxproj.filters b/QuickLook.Native/QuickLook.Native64/QuickLook.Native64.vcxproj.filters index 790ba342..27382984 100644 --- a/QuickLook.Native/QuickLook.Native64/QuickLook.Native64.vcxproj.filters +++ b/QuickLook.Native/QuickLook.Native64/QuickLook.Native64.vcxproj.filters @@ -10,5 +10,6 @@ + - \ No newline at end of file + diff --git a/QuickLook/NativeMethods/QuickLook.cs b/QuickLook/NativeMethods/QuickLook.cs index 9d52c897..47c53f8c 100644 --- a/QuickLook/NativeMethods/QuickLook.cs +++ b/QuickLook/NativeMethods/QuickLook.cs @@ -127,7 +127,8 @@ internal enum FocusedWindowType Explorer, Dialog, Everything, - DOpus + DOpus, + MultiCommander } } -} \ No newline at end of file +}