1

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

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

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

出现这种情况,即使空的事件处理程序:

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

我想用WindowActivated事件做很酷的东西,但是这是一个杀手。有没有人看过这个,并解决它? (我知道我可以使用一个计时器并轮询当前窗口,但是吸食)

+0

当您从另一个窗口单击数据集设计器时,也会出现同样的恼人行为。你进入数据库代码隐藏。 – 2009-08-27 15:57:22

+1

事件处理程序是否也被调用两次? – Steven 2009-08-31 20:22:06

+0

@Steven:处理程序只被调用一次,但看到我对AMissico的答案的评论。 – RichieHindle 2009-09-01 18:11:40

回答

2

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

编辑:RichieHindle:真正的答案埋在评论中:“你有没有在加载项中试过?”它在加载项中工作正常。

+1

我认为你是正确的,它是一个焦点/激活问题,但情况很奇怪。工作和失败之间的区别似乎是通过P/Invoke调用本地函数。我的宏调用SetWindowText,这会导致问题。删除那个电话,没关系。它如何进入一个空处理程序导致它失败的状态,我不知道 - 现在我无法再现该状态。我知道VS宏运行时环境存在于一个独立的进程中,所以也许有一些关于使用P/Invoke来让这个进程得到关注。 (处理程序仅调用一次,BTW。) – RichieHindle 2009-09-01 18:11:04

+0

SetWindowText备注声明“要在另一个进程中设置控件的文本,请直接发送WM_SETTEXT消息,而不是调用SetWindowText。”我似乎还记得很多年前读过关于SetWindowText的东西,它导致一个进程捕捉焦点......等等......等等......等等。也许我可以找到一个参考。但上述说法可能是一个线索。 – AMissico 2009-09-02 08:28:45

+0

SetWindowText是否为零,但仍设置文本? – AMissico 2009-09-02 08:30:03