使用WM_SETFOCUS和WM_KILLFOCUS

Ter*_*rry 1 delphi winapi

在Delphi中,我有两个编辑框和一个按钮.

默认情况下选择Edit1.我想用消息改变焦点.但是,如果我按照以下方式执行操作,那么在编辑中的选择范围,错误框中的插入符等等都会搞得一团糟.

我使用消息的原因是我可以在外部应用程序中控制焦点.这看起来似乎有效,但很明显,Windows内部状态有点混乱.我没有外部程序的来源.

procedure TForm1.Button1Click(Sender: TObject);
begin
  PostMessage(edit1.handle,WM_KILLFOCUS,0,0);
  PostMessage(edit2.handle,WM_SETFOCUS,0,0);
end;
Run Code Online (Sandbox Code Playgroud)

......那可以吗?我错过了一条消息吗?

500*_*ror 8

WM_SETFOCUS和WM_KILLFOCUS分别是Windows在接收和丢失输入焦点时发送给窗口句柄的通知消息,您不应自己发布这些消息.相反,只需调用SetFocus(edit2.handle)edit2.SetFocus()设置焦点.

如果由于某种原因您无法通过按钮单击处理程序同步执行此操作,则可以将自定义消息发布到您自己的表单中的本地消息处理程序,并从该消息处理程序进行SetFocus调用.