Win+E integration

Please check the FAQ (https://www.xyplorer.com/faq.php) before posting a question...
highend
Posts: 13330
Joined: 06 Feb 2011 00:33
Location: Win Server 2022 @100%

Re: Win+E integration

Post by highend »

Then maybe you should short-press it :titter:
One of my scripts helped you out? Please donate via Paypal

hyzhangzhy
Posts: 27
Joined: 05 Jan 2017 02:52

Re: Win+E integration

Post by hyzhangzhy »

shpkong wrote:hyzhangzhy!

Your program launch dozens of XYplorer instance when long pressing Win+E...
which stuck my OS... :x
I am sorry for this...

I try a mutithread implementation which I think may be better...
Now all the launch and switch to XYplorer stuff are done by another sep thread.
The keyboard hook thread will only set some event for that sep thread which should not block it and cause some problems...

Try it!

Code: Select all

#include <Windows.h>
#include <shlwapi.h>
#include <stdio.h>

HHOOK _hook;
KBDLLHOOKSTRUCT kbdStruct;

DWORD dwLast;
DWORD dwCurrent;

bool isActionExcuted = false;
bool isFirstPress = true;

char path[256];
char className[20];

HWND XYplorerWindow = NULL;
HANDLE KeyUpEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
HANDLE KeyDownEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

BOOL __stdcall EnumWindowsProc(HWND hwnd, LPARAM lparam)
{
	GetClassNameA(hwnd, className, 20);
	if (strcmp(className, "ThunderRT6FormDC") == 0 && IsWindowVisible(hwnd))
	{
		XYplorerWindow = hwnd;
	}
	return true; //return true to continue enuming Windows
}

LRESULT __stdcall HookCallback(int nCode, WPARAM wParam, LPARAM lParam)
{
	if (nCode >= 0)
	{
		kbdStruct = *((KBDLLHOOKSTRUCT*)lParam);

		if ((kbdStruct.vkCode == 0x45) && (GetKeyState(VK_LWIN) & 0x80000))//WIN+E down
		{
			if (wParam == WM_KEYDOWN)
			{
				SetEvent(KeyDownEvent);
				return true;
			}
			else if (wParam == WM_KEYUP)
			{
				SetEvent(KeyUpEvent);
			}
		}
	}
	return CallNextHookEx(_hook, nCode, wParam, lParam);
}



void SetHook()
{
	if (!(_hook = SetWindowsHookEx(WH_KEYBOARD_LL, HookCallback, NULL, 0)))
	{
		MessageBoxW(NULL, (LPCWSTR)"The hook installation has failed!", (LPCWSTR)"Error", MB_ICONERROR);
	}
}

void ReleaseHook()
{
	UnhookWindowsHookEx(_hook);
}

DWORD WINAPI workThreadFunc(LPVOID lpParam)
{
	while (WaitForSingleObject(KeyDownEvent, INFINITE) == WAIT_OBJECT_0)
	{
		if (WaitForSingleObject(KeyUpEvent, 500) == WAIT_OBJECT_0)
		{
			if (!isActionExcuted) //
			{
				EnumWindows(EnumWindowsProc, NULL);
				if (XYplorerWindow == NULL)
				{
					WinExec((LPCSTR)path, SW_SHOW);
				}
				else
				{
					SwitchToThisWindow(XYplorerWindow, TRUE);
				}
				XYplorerWindow = NULL;
			}
			isActionExcuted = false;
		}
		else if (!isActionExcuted)
		{
			WinExec((LPCSTR)path, SW_SHOW);
			isActionExcuted = true;
		}
		ResetEvent(KeyDownEvent);
		ResetEvent(KeyUpEvent);
	}
	return 0;
}

void main()
{
	FILE *fp;
	fopen_s(&fp, "xypath.ini", "r");
	if (fp == NULL)
	{
		printf("******************* XYplorer Win + E Helper in C *******************\n\nEnter your XYplorer full file path for the first time to use.\n\n");
		while (true)
		{
			printf("Enter here: ");
			gets_s(path, 256);
			int res = PathFileExistsA(path);
			if (res == 0)
			{
				printf("Can not find that file! Try again! \n\n");
			}
			else
			{
				fopen_s(&fp, "xypath.ini", "w");
				fprintf(fp, path);
				break;
			}
		}
	}
	else
	{
		fgets(path, 256, fp);
	}

	fclose(fp);

	FreeConsole();

	SetHook();

	HANDLE workThread = CreateThread(NULL, 0, workThreadFunc, NULL, 0, NULL);

	MSG msg;
	while (GetMessage(&msg, NULL, 0, 0))
	{

	}

	ReleaseHook();
}

Code: Select all

MD5:  a77a5526e0473794e67abc71a896d8cb
Attachments
XYWINE.zip
(59.48 KiB) Downloaded 120 times

Post Reply