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
+}