2011-06-28 46 views
4
procedure TSell.ApplicationEvents1Message(var Msg: tagMSG; 
    var Handled: Boolean); 
begin 
    if (Msg.Message=WM_KEYDOWN)and(Msg.wParam=VK_CONTROL+VK_HOME)then 
    begin 
end; 
+1

你是什么意思“工作”?会发生什么,你预期会发生什么? –

回答

10

要检查VK_CONTROL虚拟键的状态,必须使用GetKeyState函数。

尝试该样品

procedure TSell.ApplicationEvents1Message(var Msg: tagMSG; 
    var Handled: Boolean); 
begin 
    if (Msg.Message=WM_KEYDOWN) then 
    if (GetKeyState(VK_CONTROL) < 0) and (Msg.wParam=VK_HOME) then 
    //do your stuff 
end; 
+0

非常感谢你我的亲爱的 –

+2

@Saeed:欢迎来到StackOverflow。如果@ RRUZ的答案是解决您的问题的方法,请考虑接受它(使用左侧的复选标记)。 –

+0

请注意GetAsyncKeyState(当您想要具有CURRENT状态(Async)时调用它)或VK_HOME键被按下时的状态(正常:GetKeyState)之间的区别。 GetAsyncKeyState信息:http://msdn.microsoft.com/en-us/library/ms646293(VS.85).aspx –

7

VK_CONTROL + VK_HOME = 17 + 36 = 53 = Ord('5')。您正在检查用户是否沿键盘的第一行按下了。 (这是不是你想要的?你的问题没有说。)

你不能只是添加两个独立键的虚拟键代码,以发现他们是否都被同时按下。 Ctrl键主页是两个不同的密钥,而且每一个产生它自己的wm_KeyDownwm_KeyUp消息。 (但是不要试图按顺序检测这两个按键,它会变得比你想要的复杂得多,当按下首页,然后用GetKeyState,就像Rruz的答案所示,检测是否Ctrl在您收到当前键盘消息时已经关闭。)