如何向C ++应用程序添加热键.

如何向C ++应用程序添加热键.

问题描述:



有人可以告诉我如何在您的C ++ API应用程序中添加热键.

谢谢.

Hi,

Can someone please tell me how to add a hotkey to your c++ api application.

Thanks.

这是一个简单的示例,如果您按ctrl + shift + o会打开notepad.exe.

hotkey.cpp:
This is a simple example which opens notepad.exe if you press ctrl+shift+o.

hotkey.cpp:
#include <windows.h>
#include <shellapi.h>
#include "resource.h"

LRESULT CALLBACK MainWndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
	switch(msg){
		case WM_COMMAND:
			switch(LOWORD(wParam)){
				case ID_OPENNOTEPAD:
				ShellExecute(0,0,"notepad.exe",0,0,SW_SHOW);
				break;
			}break;
		case WM_DESTROY:
			PostQuitMessage(0);
			break;
		default:
			return DefWindowProc(hwnd,msg,wParam,lParam);
	}return 0;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, INT nCmdShow)
{
	WNDCLASS wc = {0};
	wc.lpfnWndProc = (WNDPROC)MainWndProc;
	wc.hInstance = GetModuleHandle(0);
	wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
	wc.lpszClassName = "hotkeyWndClass";
	wc.hCursor = LoadCursor(0,IDC_ARROW);
	RegisterClass(&wc);

	ShowWindow(CreateWindow("hotkeyWndClass","hotkey",WS_CAPTION|WS_SYSMENU,CW_USEDEFAULT,0,CW_USEDEFAULT,0,0,0,hInstance,0),SW_SHOW);

	MSG msg;
	HANDLE hAccelTable = LoadAccelerators(hInstance,MAKEINTRESOURCE(IDACCEL));
	while(GetMessage(&msg,0,0,0))
		if(!TranslateAccelerator(msg.hwnd,hAccelTable,&msg)){
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	return 0;
}



resource.h:



resource.h:

#define ID_OPENNOTEPAD	101
#define IDACCEL		10000



resource.rc:



resource.rc:

#include <windows.h>
#include "resource.h"

IDACCEL ACCELERATORS
BEGIN
	"O",	ID_OPENNOTEPAD,VIRTKEY,CONTROL, SHIFT
END


在资源脚本(.rc文件)中,您将添加加速器,如下所示:

In your resource script (.rc file) you''ll add your accelerator, something like this:

IDACCEL ACCELERATORS DISCARDABLE 
BEGIN
    "O",            ID_OPEN,                VIRTKEY, CONTROL, NOINVERT
    "S",            ID_SAVE,                VIRTKEY, CONTROL, NOINVERT
END



然后在您的GetMessage循环所在的WinMain函数中,添加以下内容:



Then in your WinMain function where your GetMessage loop is, add the following:

MSG msg;
HACCEL hAccelTable = LoadAccelerators(hInstance,MAKEINTRESOURCE(IDACCEL));

while(GetMessage(&msg,0,0,0))
    if(!TranslateAccelerator(hwndMain,hAccelTable,&msg)){
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }



然后在处理hwndMain消息的函数中,您将以WM_COMMAND消息的形式收到加速器通知. LOWORD(wParam)将是您的标识符(例如ID_OPEN,ID_SAVE).



Then in the function where you handle hwndMain''s messages, you''ll get your accelerator notification as WM_COMMAND message. LOWORD(wParam) will be your identifier (e.g. ID_OPEN, ID_SAVE).