【问题标题】:Visual Studio macros: WindowActivated handler turns clicks into double clicksVisual Studio 宏:WindowActivated 处理程序将点击变成双击
【发布时间】:2009-08-18 09:53:27
【问题描述】:

如果我向我的 Visual Studio 2005 宏 EnvironmentEvents 模块添加一个 WindowEvents_WindowActivated 处理程序,我会得到一个奇怪的副作用:当我在 Visual Studio 中从一个窗口单击到另一个窗口时,该单击被视为双击.

例如,我将焦点放在编辑器窗口中,然后在解决方案资源管理器中单击一个文件,该文件就会打开。

或者我将焦点放在工具箱中并在编辑器窗口中单击,然后我单击的单词被选中。在大多数情况下,当单击导致窗口激活时,该单击被视为双击。

即使事件处理程序为空,也会发生这种情况:

Private Sub WindowEvents_WindowActivated(ByVal GotFocus As EnvDTE.Window, _
                                         ByVal LostFocus As EnvDTE.Window) _
                                         Handles WindowEvents.WindowActivated
    ' Do nothing.
End Sub

我想使用WindowActivated 事件来做一些很酷的事情,但这是一个杀手锏。有没有人见过这个并解决它? (我知道我可以使用计时器并轮询当前窗口,但是很糟糕。)

【问题讨论】:

  • 当您从另一个窗口单击数据集设计器时,会发生同样令人讨厌的行为。你进入数据库代码隐藏。
  • 事件处理程序是否也被调用了两次?
  • @Steven:处理程序只被调用一次,但请参阅我对 AMissico 答案的评论。

标签: vb.net visual-studio visual-studio-2005 macros visual-studio-macros


【解决方案1】:

我没有这个问题。 WindowActivated 事件很可能被触发了两次。这通常发生在另一个进程从激活的窗口中窃取焦点(例如另一个加载项)然后重新激活该窗口时。您可以通过在 WindowActivated 事件中添加 MsgBox 调用来复制您遇到的行为。

RichieHindle 编辑: 真正的答案隐藏在 cmets 中:“您是否在加载项中尝试过这个?”它在加载项中运行良好。

【讨论】:

  • 我认为你是对的,它是一个焦点/激活问题,但情况很奇怪。工作和失败之间的区别似乎在于通过 P/Invoke 调用本机函数。我的宏正在调用 SetWindowText,这导致了问题。删除该呼叫,就可以了。我不知道它是如何进入一个空处理程序导致它失败的状态 - 我现在无法重现。我知道 VS Macros 运行时环境存在于一个单独的进程中,因此使用 P/Invoke 可能会使该进程成为焦点。 (处理程序只被调用一次,顺便说一句。)
  • SetWindowText 状态的备注,“要在另一个进程中设置控件的文本,请直接发送 WM_SETTEXT 消息,而不是调用 SetWindowText。”我似乎记得很多年前读过一些关于 SetWindowText 导致捕获焦点的过程......等等。也许我可以找到参考。但上面的陈述可能是一个线索。
  • SetWindowText 结果为零,但仍设置文本?
  • SetWindowText 返回 True,并设置标题。 SendMessage(..., WM_SETTEXT, ...) 也返回 true,但不设置标题。我在文档中看到了该注释,根据我的经验,它是倒退的——SetWindowText 具有将新标题字符串复制到另一个进程的地址空间的魔力,但 WM_SETTEXT 不会,至少并非总是如此。无论如何,两个 API都会造成神秘的双击效果。
  • "SetWindowText 返回 True..." True 还是零和非零?有区别。
猜你喜欢
  • 1970-01-01
  • 2010-12-08
  • 2016-04-20
  • 2011-02-24
  • 1970-01-01
  • 2014-03-12
  • 1970-01-01
  • 2012-08-18
  • 2016-10-03
相关资源
最近更新 更多