如何向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).