我有一个应用程序A(.NET / WPF),它通过WinAPI调用来控制应用程序B.
根据要求,应用程序A必须始终是最顶层的窗口。这意味着
除了一个以外的所有情况都满足此要求。当应用程序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);
答案 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);