使用WM_SETFOCUS和WM_KILLFOCUS

时间:2013-03-18 03:16:36

标签: 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;

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

1 个答案:

答案 0 :(得分:8)

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

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