0

我有一个应用程序 A (.NET/WPF),它通过 WinAPI 调用控制应用程序 B。

根据要求,应用程序 A 必须始终是最顶层的窗口。这意味着

  • 如果应用程序 A 的窗口与应用程序 B 的窗口位于同一位置,
  • 那么应用程序 A 的窗口应该是可见的,并且
  • 应用程序 B 的窗口必须不可见。

除一种情况外,所有情况均满足此要求。当应用程序 A 以编程方式从应用程序 B 的组合框中选择一个元素时,该组合框会暂时可见。选择一个元素后,它会再次隐藏。

但是组合框可见(即使是片刻)违反了要求。

如何确保应用程序 A 的窗口始终是最上面的窗口(即使在选择组合框项目期间)?

注意:应用程序 A 每 200 毫秒收回一次焦点(激活自身)。我试图将该间隔减少到 100 毫秒,但它没有帮助。

更新 1:使用以下 WinAPI 调用选择组合框项。

SendMessage(Self.MyFlightComboBox, CB_SHOWDROPDOWN, WPARAM(true), 0);

ItemIndex := SendMessage(Self.MyFlightComboBox, CB_FINDSTRING, -1, integer(@MyValue[1]));

OutputDebugString(PChar('ItemIndex: ' + IntToStr(ItemIndex)));


SendMessage(Self.MyFlightComboBox, CB_SETCURSEL, ItemIndex, 0);
SendMessage(Self.MyFlightComboBox, CN_COMMAND, MakeWParam(0, CBN_SELCHANGE), 0);


SendMessage(Self.MyFlightComboBox, WM_LBUTTONDOWN, 0, -1);
SendMessage(Self.MyFlightComboBox, WM_LBUTTONUP, 0, -1);
4

1 回答 1

0

无需显示背景组合框项目选择的下拉列表,因此删除消息发送的第一行CB_SHOWDROPDOWN(这可能是您的问题的原因)并删除最后两行,您正在模拟左侧鼠标按钮单击(无论如何都是在无意义的位置上),根本没有理由这样做。

因此,要通过找到的文本选择组合框中的项目,使用以下伪代码就足够了(用 Delphi 编写,对您的原始版本稍作修改,因为您一定要检查您发送的消息的结果):

ItemIndex := SendMessage(Self.MyFlightComboBox, CB_FINDSTRING, -1, LPARAM(@MyValue[1]));
if ItemIndex <> CB_ERR then
  if SendMessage(Self.MyFlightComboBox, CB_SETCURSEL, ItemIndex, 0) <> CB_ERR then
    SendMessage(Self.MyFlightComboBox, CN_COMMAND, MakeWParam(0, CBN_SELCHANGE), 0);
于 2012-11-01T11:41:57.950 回答