You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
200 lines
5.1 KiB
200 lines
5.1 KiB
#include "ArchiveMenu.h" |
|
|
|
DWORD ArchiveMenuThread(ArchiveMenuThreadParams* params) |
|
{ |
|
Sleep(1000); |
|
printf("Started \"Archive menu\" thread.\n"); |
|
|
|
HRESULT hr = CoInitialize(NULL); |
|
if (FAILED(hr)) |
|
{ |
|
return 0; |
|
} |
|
|
|
WNDCLASS wc = { 0 }; |
|
wc.style = CS_DBLCLKS; |
|
wc.lpfnWndProc = params->wndProc; |
|
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); |
|
wc.hInstance = GetModuleHandle(NULL); |
|
wc.lpszClassName = L"ArchiveMenuWindowExplorer"; |
|
wc.hCursor = LoadCursorW(NULL, IDC_ARROW); |
|
RegisterClass(&wc); |
|
|
|
*(params->hWnd) = params->CreateWindowInBand( |
|
0, |
|
L"ArchiveMenuWindowExplorer", |
|
0, |
|
WS_POPUP, |
|
0, |
|
0, |
|
0, |
|
0, |
|
0, |
|
0, |
|
GetModuleHandle(NULL), |
|
NULL, |
|
7 |
|
); |
|
if (!*(params->hWnd)) |
|
{ |
|
return 0; |
|
} |
|
ITaskbarList* pTaskList = NULL; |
|
hr = CoCreateInstance( |
|
&__uuidof_TaskbarList, |
|
NULL, |
|
CLSCTX_ALL, |
|
&__uuidof_ITaskbarList, |
|
(void**)(&pTaskList) |
|
); |
|
if (FAILED(hr)) |
|
{ |
|
return 0; |
|
} |
|
hr = pTaskList->lpVtbl->HrInit(pTaskList); |
|
if (FAILED(hr)) |
|
{ |
|
return 0; |
|
} |
|
ShowWindow(*(params->hWnd), SW_SHOW); |
|
hr = pTaskList->lpVtbl->DeleteTab(pTaskList, *(params->hWnd)); |
|
if (FAILED(hr)) |
|
{ |
|
return 0; |
|
} |
|
hr = pTaskList->lpVtbl->Release(pTaskList); |
|
if (FAILED(hr)) |
|
{ |
|
return 0; |
|
} |
|
|
|
MSG msg = { 0 }; |
|
while (GetMessage(&msg, NULL, 0, 0)) |
|
{ |
|
TranslateMessage(&msg); |
|
DispatchMessage(&msg); |
|
} |
|
|
|
printf("Ended \"Archive menu\" thread.\n"); |
|
} |
|
|
|
LRESULT CALLBACK ArchiveMenuWndProc( |
|
_In_ HWND hWnd, |
|
_In_ UINT uMsg, |
|
_In_ WPARAM wParam, |
|
_In_ LPARAM lParam, |
|
INT64(*ImmersiveContextMenuHelper_ApplyOwnerDrawToMenuFunc)( |
|
HMENU h1, |
|
HMENU h2, |
|
HWND a3, |
|
unsigned int a4, |
|
void* data |
|
), |
|
void(*ImmersiveContextMenuHelper_RemoveOwnerDrawFromMenuFunc)( |
|
HMENU _this, |
|
HMENU hWnd, |
|
HWND a3 |
|
) |
|
) |
|
{ |
|
LRESULT result; |
|
|
|
if (uMsg == WM_COPYDATA) |
|
{ |
|
COPYDATASTRUCT* st = lParam; |
|
HWND srcWnd = wParam; |
|
|
|
POINT pt; |
|
GetCursorPos(&pt); |
|
|
|
HWND prevhWnd = GetForegroundWindow(); |
|
SetForegroundWindow(hWnd); |
|
|
|
HMENU hMenu = CreatePopupMenu(); |
|
|
|
TCHAR buffer[MAX_PATH + 100]; |
|
TCHAR filename[MAX_PATH]; |
|
ZeroMemory(filename, MAX_PATH * sizeof(TCHAR)); |
|
memcpy(filename, st->lpData, wcslen(st->lpData) * sizeof(TCHAR)); |
|
PathUnquoteSpacesW(filename); |
|
PathRemoveExtensionW(filename); |
|
PathStripPathW(filename); |
|
wsprintf(buffer, EXTRACT_NAME, filename); |
|
|
|
InsertMenu(hMenu, 0, MF_BYPOSITION | MF_STRING, 1, buffer); |
|
InsertMenu(hMenu, 0, MF_BYPOSITION | MF_STRING, 2, OPEN_NAME); |
|
|
|
INT64* unknown_array = calloc(4, sizeof(INT64)); |
|
ImmersiveContextMenuHelper_ApplyOwnerDrawToMenuFunc( |
|
hMenu, |
|
hWnd, |
|
&(pt), |
|
0xc, |
|
unknown_array |
|
); |
|
|
|
BOOL res = TrackPopupMenu( |
|
hMenu, |
|
TPM_RETURNCMD, |
|
pt.x - 15, |
|
pt.y - 15, |
|
0, |
|
hWnd, |
|
0 |
|
); |
|
|
|
ImmersiveContextMenuHelper_RemoveOwnerDrawFromMenuFunc( |
|
hMenu, |
|
hWnd, |
|
&(pt) |
|
); |
|
free(unknown_array); |
|
SetForegroundWindow(prevhWnd); |
|
|
|
if (res == 1 || res == 2) |
|
{ |
|
ZeroMemory(buffer, (MAX_PATH + 100) * sizeof(TCHAR)); |
|
if (res == 2) |
|
{ |
|
wsprintf(buffer, OPEN_CMD, st->lpData); |
|
//wprintf(L"%s\n%s\n\n", st->lpData, buffer); |
|
} |
|
else if (res == 1) |
|
{ |
|
TCHAR path[MAX_PATH + 1], path_orig[MAX_PATH + 1]; |
|
ZeroMemory(path, (MAX_PATH + 1) * sizeof(TCHAR)); |
|
ZeroMemory(path_orig, (MAX_PATH + 1) * sizeof(TCHAR)); |
|
memcpy(path, st->lpData, wcslen(st->lpData) * sizeof(TCHAR)); |
|
memcpy(path_orig, st->lpData, wcslen(st->lpData) * sizeof(TCHAR)); |
|
PathUnquoteSpacesW(path_orig); |
|
PathRemoveExtensionW(path_orig); |
|
wsprintf(buffer, EXTRACT_CMD, path_orig, path); |
|
//wprintf(L"%s\n%s\n\n", st->lpData, buffer); |
|
} |
|
STARTUPINFO si = { sizeof(si) }; |
|
PROCESS_INFORMATION pi; |
|
BOOL b = CreateProcess( |
|
NULL, |
|
buffer, |
|
NULL, |
|
NULL, |
|
TRUE, |
|
CREATE_UNICODE_ENVIRONMENT, |
|
NULL, |
|
NULL, |
|
&si, |
|
&pi |
|
); |
|
CloseHandle(pi.hProcess); |
|
CloseHandle(pi.hThread); |
|
} |
|
DestroyMenu(hMenu); |
|
ShowWindow(hWnd, SW_HIDE); |
|
return 0; |
|
} |
|
else if (uMsg == WM_CLOSE) |
|
{ |
|
return 0; |
|
} |
|
return 1; |
|
}
|
|
|