5

我想为vs2008创建一个插件,在vs2008的编辑器上显示一个透明窗体/窗口。如何获取Visual Studio 2008编辑器窗口的topLeft屏幕位置?

在下面的代码中, “aw.Left” 和 “aw.Top”

是相对值,无论是1

问题:

  1. 你知道如何获得编辑器部分的左/顶部屏幕位置?

  2. 或者我可以将插入符号移动到顶部/左侧字符位置,但是您知道如何获取插入符的屏幕位置吗?

非常感谢。

public void Exec(string commandName, vsCommandExecOption executeOption, ref object varIn, ref object varOut, ref bool handled) 
    { 
     handled = false; 
     if(executeOption == vsCommandExecOption.vsCommandExecOptionDoDefault) 
     { 
      if(commandName == "MyAddin1.Connect.MyAddin1") 
      { 
       Window aw = _app.ActiveWindow; 
       int left = aw.Left; 
       int top = aw.Top; 

editor part

+0

['LinkedWindowFrame'](http://msdn.microsoft.com/zh-cn/library/vstudio/envdte.window.linkedwindowframe.aspx)涉嫌获取父母,因此您可以继续前进,直到你有绝对的位置。或者你可以将你的覆盖层放在窗口的小孩身上,避免需要绝对的位置。 –

+0

也许你可以用宏来做到这一点 – Kuzgun

回答

0

您可以使用Win32 ClientToScreen功能。

声明如下外部函数:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] 
public struct POINT 
{ 
    public int x; 
    public int y; 
}; 

[DllImport("user32.dll")] 
[return: MarshalAs(UnmanagedType.Bool)] 
public static extern bool ClientToScreen(IntPtr hwndClient, ref POINT lpPoint); 

您可以致电此如下

POINT pt = new POINT(); 
pt.x = left; 
pt.y = top; 
ClientToScreen(myForm.Handle, ref pt); 

在此之后,PT应包含PT的绝对坐标。使用ScreenToClient进行相反的操作。使用这两个窗口,您还可以获取一个点相对于另一个窗口的位置(假定您知道两个窗口的窗口句柄)。