如何在外部控制的应用程序中隐藏组合框

时间:2012-11-01 06:50:23

标签: c# wpf winapi

我有一个应用程序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);

1 个答案:

答案 0 :(得分: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);