LoadAccelerators & TranslateAccelerator

对于快捷键,例如CTRL+O,直接打开某个特定的Form。

1. 定义resource文件,里面绑定好 菜单名称-->UID, 例如:ABCForm --> 0x0301
同时定义好快捷键绑定关系,例如:
    "O",  0x0301, VIRTKEY, CONTROL, NOINVERT
    "D",  0xC603, VIRTKEY, CONTROL, NOINVERT
    "D",  0x500A, VIRTKEY, CONTROL, SHIFT, NOINVERT

2. 资源文件编译,
3. 执行的时候,先调用LoadAccelerators方法,将资源load起来
4. 在用户CTRL+O操作的时候,系统通过TranslateAccelerator 函数将这个组合转化成为新的message。 TranslateAccelerator 函数利用前面资源里面定义的关系,将WM_KEYDOWN/WM_SYSKEYDOWN message 转化成为WM_COMMAND/WM_SYSCOMMAND message。同时,将转化之后的WM_COMMAND/WM_SYSCOMMAND message直接交给windows处理程序.
sample code
bool	MY_EventQueue::GetNextEvent (MY_Event& e)
{
	...
	MY_Event* tEvent = NULL;
	MSG msg = {0};
	BOOL returnCode = GetMessage (&msg, NULL, (UINT) NULL,  (UINT) NULL);
	if (returnCode)
	{
		if (msg.message == WM_TIMER || msg.message == WM_MOUSEMOVE)
		{
			e.m_event = coreNullEvent;
		}
		int result = TranslateAccelerator ((HWND)cm->GetWindow (cmw_Frame), 
						(HACCEL)cm->GetAccelerators (), &msg);
		if (!result)
		{
			TranslateMessage (&msg); 
			DispatchMessage (&msg); 
		}
		tEvent = GetEvent ();
		...
		return tEvent;
	}

	return false;
}



进阶阅读,MSDN:About Keyboard Accelerators
http://msdn.microsoft.com/en-us/library/ms646335(VS.85).aspx


你可能感兴趣的:(C++,c,windows,Microsoft,C#)