diff --git a/QuickLook.Native/QuickLook.Native32/DllExport.cpp b/QuickLook.Native/QuickLook.Native32/DllExport.cpp index add47fa..ac5b22d 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/MultiCommander.cpp b/QuickLook.Native/QuickLook.Native32/MultiCommander.cpp new file mode 100644 index 0000000..025250f --- /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 0000000..44074f3 --- /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); +}; + diff --git a/QuickLook.Native/QuickLook.Native32/QuickLook.Native32.vcxproj b/QuickLook.Native/QuickLook.Native32/QuickLook.Native32.vcxproj index 36e8aa6..6fee4e7 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 29959b0..cfa7946 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 db3963a..7f0cf6c 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 c1aed9b..9a6a9e3 100644 --- a/QuickLook.Native/QuickLook.Native32/Shell32.h +++ b/QuickLook.Native/QuickLook.Native32/Shell32.h @@ -30,6 +30,7 @@ public: 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 aed6957..a059fc5 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 790ba34..2738298 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 7a5830b..57d0b54 100644 --- a/QuickLook/NativeMethods/QuickLook.cs +++ b/QuickLook/NativeMethods/QuickLook.cs @@ -132,7 +132,8 @@ namespace QuickLook.NativeMethods Explorer, Dialog, Everything, - DOpus + DOpus, + MultiCommander } } -} \ No newline at end of file +}