Delphi 7 - 为什么VK_RETURN不适合我?

Joh*_*erg 1 delphi delphi-7

procedure TfrmProgress.FormKeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);
begin
    if key = VK_RETURN then
    begin
        Self.Close;
    end;
end;
Run Code Online (Sandbox Code Playgroud)

然后按Enter键,没有任何反应......

Dav*_*nan 8

我不能告诉你这些信息是什么问题,但我可以告诉你如何解决这个问题.

创建一个事件处理程序并将其附加到Application.OnMessage.每当拉出应用程序消息队列的任何排队消息时,都会调用此方法.键盘消息是输入消息,因此排队,因此WM_KEYDOWN消息将到达此事件处理程序.

像这样实现处理程序:

procedure TMyForm.ApplicationMessage(var Msg: TMsg; var Handled: Boolean);
begin
  if Msg.Message=WM_KEYDOWN then
    Handled := False;
end;
Run Code Online (Sandbox Code Playgroud)

启用调试DCU,然后在该Handled := False行上设置断点.运行您的应用程序,选择旋转编辑,然后按ENTER键.代码将中断,您现在可以单步执行以查看WM_KEYDOWN消息的路由位置.

事件处理程序返回后,您应该一步一步,直到找到对DispatchMessage的调用.按F7进入此步骤并继续跟踪,直到您可以找到它落在哪里以及为什么它没有落在您想要的事件处理程序中.

  • @John:人们一直在努力帮助你,你一直坚持对他们不礼貌.如果您还没有这样做,请阅读[FAQ](http://stackoverflow.com/faq),尤其是关于如何对待他人的部分.对你要求帮助的人不屑一顾是一个坏主意,并且不鼓励他们这样做.这个社区的工作是礼貌和尊重; 如果你不能在这些指导方针内工作,也许你应该去别处看看.谢谢. (7认同)
  • @John:您可以很容易地发现自己,代码的问题在于,事实上,它根本就没有执行过.您所要做的就是在`if key = ...`行上设置一个断点(只需单击代码左侧的标尺),并注意到当您按Enter键时断点没有暂停程序. (6认同)
  • @John:"尽量保持平静,屏住呼吸?" 好吧,试一试.唯一一个粗鲁和指责的是你.请不要费心回应这个,我不会咬... (5认同)