防止winapi累积按下的键

防止winapi累积按下的键,winapi,assembly,Winapi,Assembly,我正在用汇编语言编写一个WinApi,程序会对按键做出反应,问题是,如果例程没有完成,同时再次按下该键,它就会开始累积,这意味着一旦例程完成,它就会根据用户在例程进行时按下该键的次数反复运行。 经典消息循环: .MessageLoop: invoke PeekMessage,Message,NULL,0,0,PM_REMOVE test eax,eax jz near .NoMess

我正在用汇编语言编写一个WinApi,程序会对按键做出反应,问题是,如果例程没有完成,同时再次按下该键,它就会开始累积,这意味着一旦例程完成,它就会根据用户在例程进行时按下该键的次数反复运行。 经典消息循环:

.MessageLoop:
  invoke PeekMessage,Message,NULL,0,0,PM_REMOVE       
  test eax,eax                                        
  jz near .NoMess                                 

  cmp dword [Message + MSG.message],WM_QUIT         
  jz near .Finish                                     

  invoke TranslateMessage,Message                   
  invoke DispatchMessage,Message                     
  .NoMess:
 ; some code
jmp .MessageLoop
和消息句柄:

function WndProc,hWnd,wMsg,wParam,lParam
begin
 mov eax,dword [wMsg]          

  cmp eax,WM_DESTROY             
  je near .Destroy

  cmp eax,WM_CLOSE              
  je near .Destroy              

  cmp eax, WM_KEYDOWN                  
  je near .keyDown ; when key is pressed, then it is checked what key it is, meanwhile I need program to ignore all keypressed

  cmp eax, WM_PAINT
  je near .Paint

  invoke DefWindowProc,[hWnd],[wMsg],[wParam],[lParam]
  return eax 

假设我有一个例程来处理
W
按钮,在这个例程的过程中,我希望所有其他
W
键都被忽略。

为什么不添加一个例程,在操作结束时或从操作返回时丢弃任何未处理的按键事件呢?@WeatherVane的问题是,如何识别处理程序尚未完全处理,当另一个按键出现时。呃。。。六英寸的钉子,设置一个标志?如果你给我看一个人,可以按下键比执行代码< > WMYKEYDOWN < /COD>消息处理程序在ASM中的执行时间快,我可能会认为这是一个实际问题。就所有实际目的而言,这不是一个问题。更糟糕的是,这是一种反模式。如果用户按两次键,我会认为他们是想按两次键。@WeatherVane可能是解决方案