Winapi 是否有可能看到控制焦点丢失到哪里?

Winapi 是否有可能看到控制焦点丢失到哪里?,winapi,mfc,Winapi,Mfc,我在对话框上有一个ClistCtrl(为非MFC用户包装Windows列表视图)。我设置的功能是,当列表失去焦点时,所有选定的项目都将取消选中 我还有一个“删除项目”按钮,它的点击处理程序将删除列表中的所有选定项目 您可以选择列表中的项目,然后单击按钮删除这些项目,或者单击其他位置取消选择 但是,当您单击“删除”按钮时,列表首先会失去焦点,因此不会发生任何事情!有办法解决这个问题吗?您可以通过接收有关失去焦点的消息,其wParam将为您提供一个获得焦点的窗口句柄: wParam 接收键盘焦点的窗

我在对话框上有一个
ClistCtrl
(为非MFC用户包装Windows列表视图)。我设置的功能是,当列表失去焦点时,所有选定的项目都将取消选中

我还有一个“删除项目”按钮,它的点击处理程序将删除列表中的所有选定项目

您可以选择列表中的项目,然后单击按钮删除这些项目,或者单击其他位置取消选择


但是,当您单击“删除”按钮时,列表首先会失去焦点,因此不会发生任何事情!有办法解决这个问题吗?

您可以通过接收有关失去焦点的消息,其wParam将为您提供一个获得焦点的窗口句柄:

wParam

接收键盘焦点的窗口的句柄。这 参数可以为NULL


您应该能够使用Spy++在列表窗口上查看WM_KILLFOCUS,并读取其wParam,然后再使用Spy++查找它是哪个窗口。

您可以通过收到有关失去焦点的消息,其wParam将为您提供获得焦点的窗口的句柄:

wParam

接收键盘焦点的窗口的句柄。这 参数可以为NULL


您应该能够使用Spy++在列表窗口上查看WM_KILLFOCUS,并读取其wParam,然后使用Spy++查找它是哪个窗口。

如其他帖子所述,您可以使用
WM_KILLFOCUS

但我认为在失去焦点时清除选择是一个非常糟糕的主意

想象一下:用户使用multiselect(使用shift、ctrl、scrollbar…)选择一大堆项目,然后发生以下情况之一:

  • 电话铃响,紧急呼叫-用户需要检查邮件:选择:消失

  • 一个恼人的消息框弹出并聚焦(是的,它确实发生了):选择->消失

您的用户可能会因此讨厌您,所以不要这样做:)(即使listcontrol中只有3项也不行)

通常的方法是在失去焦点时将所选内容灰显。您可以添加一个“清除选择”按钮,但即使这样也不需要。只需单击一个项目即可清除所选内容(当然,该项目除外)

底线:永远不要在失去焦点时清除选择

更新

如果选择在失去焦点时不可见,则您需要使用
LVS\u SHOWSELALWAYS
标志:

选择(如果有)始终显示,即使控件未显示 集中注意力


正如在其他帖子中所说,您可以使用
WM_KILLFOCUS
来实现这一点

但我认为在失去焦点时清除选择是一个非常糟糕的主意

想象一下:用户使用multiselect(使用shift、ctrl、scrollbar…)选择一大堆项目,然后发生以下情况之一:

  • 电话铃响,紧急呼叫-用户需要检查邮件:选择:消失

  • 一个恼人的消息框弹出并聚焦(是的,它确实发生了):选择->消失

您的用户可能会因此讨厌您,所以不要这样做:)(即使listcontrol中只有3项也不行)

通常的方法是在失去焦点时将所选内容灰显。您可以添加一个“清除选择”按钮,但即使这样也不需要。只需单击一个项目即可清除所选内容(当然,该项目除外)

底线:永远不要在失去焦点时清除选择

更新

如果选择在失去焦点时不可见,则您需要使用
LVS\u SHOWSELALWAYS
标志:

选择(如果有)始终显示,即使控件未显示 集中注意力



WM_KILLFOCUS
告诉您输入焦点正在移动的窗口to@DavidHeffernan要在带有控件的CDialog上下文中捕捉到这一点,我需要实现
PreTranslateMessage
或其他什么吗?一个代码示例将是一个非常好的答案,我总是忘记我可以和不能在message-map.Websearch中添加事件通知程序的内容how@DavidHeffernan到目前为止还没有。这就是我问的原因。我只是得到了一堆乱七八糟的结果。。。可能我的搜索词不太好。如果没有任何东西显示如何在MFC应用程序中捕获windows消息,我会感到惊讶。似乎难以置信。
WM_KILLFOCUS
告诉您输入焦点正在移动哪个窗口to@DavidHeffernan要在带有控件的CDialog上下文中捕捉到这一点,我需要实现
PreTranslateMessage
或其他什么吗?一个代码示例将是一个非常好的答案,我总是忘记我可以和不能在message-map.Websearch中添加事件通知程序的内容how@DavidHeffernan到目前为止还没有。这就是我问的原因。我只是得到了一堆乱七八糟的结果。。。可能我的搜索词不太好。如果没有任何东西显示如何在MFC应用程序中捕获windows消息,我会感到惊讶。似乎难以置信。这是否也与NOTIFY(NM\U KILLFOCUS,…)上的
兼容?或者我应该问,MFC中的代码是什么样的?我是在对话框中捕捉
WM_KILLFOCUS
并检查控件ID,还是在特定控件上设置处理程序?是的(NM_KILLFOCUS,
如果您想在对话框函数中接收给定控件的消息,应该可以使用。问题是,我看不到在哪里可以找到获得焦点的窗口()[pseudo]代码示例将使您的答案更完整?您是对的,这是通知无法完成的,您必须对列表控件进行子类化。也许其他人会建议如何进行。谢谢。我对此很熟悉,只是希望我不必麻烦。我无法捕获/截获/检查来自拨号盘的每个控件消息og那么,例如覆盖
CWnd::PreTranslateMessage()
?这是否也与<