Добавьте глобальную горячую клавишу Windows без запущенного приложения

Я хочу создать глобальную горячую клавишу для запуска моего приложения, даже если оно не запущено (без фонового процесса).

Из того, что я прочитал, RegisterHotkey требует запуска процесса для получения сообщения горячей клавиши.

Я пытался использовать IShellLink :: SetHotkey для ярлыка приложения, но это выглядит очень странно. Несмотря на вызов SHChangeNotify, горячая клавиша не будет очищена, когда я установлю горячую клавишу ярлыка на ноль. Что-то, что я должен сделать, чтобы оболочка Windows поняла, что горячая клавиша ярлыка изменилась?

Я думаю, что на самом деле вы можете получить то же самое нестабильное поведение через пользовательский интерфейс Windows, установив горячую клавишу через свойства ярлыка, нажав «Применить», а затем изменив горячую клавишу и применив снова. Старая горячая клавиша все еще будет работать.

Любые рекомендации о том, как это сделать или поправки к моему расследованию?

1

Решение

Попробуйте этот код:

#define _WIN32_WINNT 0x0400
#pragma comment( lib, "user32.lib" )

#include <windows.h>
#include <stdio.h>

HHOOK hKeyboardHook;

__declspec(dllexport) LRESULT CALLBACK KeyboardEvent (int nCode, WPARAM wParam, LPARAM lParam)
{
DWORD SHIFT_key=0;
DWORD CTRL_key=0;
DWORD ALT_key=0;

if  ((nCode == HC_ACTION) &&   ((wParam == WM_SYSKEYDOWN) ||  (wParam == WM_KEYDOWN)))
{
KBDLLHOOKSTRUCT hooked_key =    *((KBDLLHOOKSTRUCT*)lParam);
DWORD dwMsg = 1;
dwMsg += hooked_key.scanCode << 16;
dwMsg += hooked_key.flags << 24;
char lpszKeyName[1024] = {0};
//lpszKeyName[0] = '[';

int i = GetKeyNameText(dwMsg,   (lpszKeyName+1),0xFF) + 1;
//lpszKeyName[i] = ']';

int key = hooked_key.vkCode;

SHIFT_key = GetAsyncKeyState(VK_SHIFT);
CTRL_key = GetAsyncKeyState(VK_CONTROL);
ALT_key = GetAsyncKeyState(VK_MENU);

if (key >= 'A' && key <= 'Z')
{

if  (GetAsyncKeyState(VK_SHIFT)>= 0) key +=32;

if (CTRL_key !=0 && key == 'y' )
{
MessageBox(NULL, "CTRL-y was pressed\nLaunch your app here", "H O T K E Y", MB_OK);
CTRL_key=0;
}

if (CTRL_key !=0 && key == 'q' )
{
MessageBox(NULL, "Shutting down", "H O T K E Y", MB_OK);
PostQuitMessage(0);
}//printf("key = %c\n", key);
printf("ha ha, I intercepted your [%c] and changed it to [%c]\n", key, key+1);

SHIFT_key = 0;
CTRL_key = 0;
ALT_key = 0;

}

//printf("lpszKeyName = %s\n",  lpszKeyName );
//  printf("%s",  lpszKeyName );
}
return CallNextHookEx(hKeyboardHook,    nCode,wParam,lParam);
}

void MessageLoop()
{
MSG message;
while (GetMessage(&message,NULL,0,0))
{
TranslateMessage( &message );
DispatchMessage( &message );
}
}

DWORD WINAPI my_HotKey(LPVOID lpParm)
{
HINSTANCE hInstance = GetModuleHandle(NULL);
if (!hInstance) hInstance = LoadLibrary((LPCSTR) lpParm);
if (!hInstance) return 1;

hKeyboardHook = SetWindowsHookEx (  WH_KEYBOARD_LL, (HOOKPROC) KeyboardEvent,   hInstance,  NULL    );
MessageLoop();
UnhookWindowsHookEx(hKeyboardHook);
return 0;
}

int main(int argc, char** argv)
{
HANDLE hThread;
DWORD dwThread;

hThread = CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)   my_HotKey, (LPVOID) argv[0], NULL, &dwThread);

//ShowWindow(FindWindowA("ConsoleWindowClass", NULL), false);

if (hThread) return WaitForSingleObject(hThread,INFINITE);
else return 1;

}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]