C# GetWindowText()函数并非始终正确执行

C# GetWindowText()函数并非始终正确执行,c#,visual-studio-2012,.net-4.5,interopservices,vshost32,C#,Visual Studio 2012,.net 4.5,Interopservices,Vshost32,我正在编写一个小应用程序,希望从Chrome浏览器中获取URL 为了首先检查Chrome浏览器是否打开,我使用以下代码: IntPtr WindowTitleTextPtr = GetForegroundWindow(); StringBuilder WindowTitleText = new StringBuilder(); GetWindowText(WindowTitleTextPtr, WindowTitleText, 256); // Problem ... 我正在使用

我正在编写一个小应用程序,希望从Chrome浏览器中获取URL

为了首先检查Chrome浏览器是否打开,我使用以下代码:

 IntPtr WindowTitleTextPtr = GetForegroundWindow();

 StringBuilder WindowTitleText = new StringBuilder();

 GetWindowText(WindowTitleTextPtr, WindowTitleText, 256); // Problem

 ...
我正在使用GetWindowText()函数来获取Windows标题文本,但我遇到了一个问题

如果Chrome窗口没有URL,只是一个新标签,那么我没有问题,WindowTitleText.ToString()等于新标签-Google Chrome

但是,如果我打开一个网页,在这种情况下,URL会被某个URL填充,然后在GetWindowText()行中,我会得到: vs32host.exe已停止工作要求我关闭的消息窗口

发生什么事了

救命啊

您应该在
StringBuilder
实例中分配内存:

  StringBuilder WindowTitleText = new StringBuilder();

  int size = 256;
  WindowTitleText.Length = size; // <- Memory allocation

  // Read text into allocated memory
  GetWindowText(WindowTitleTextPtr, WindowTitleText, WindowTitleText.Length); 
StringBuilder WindowTitleText=新建StringBuilder();
int size=256;

WindowTitleText.Length=大小;//如果将
GetWindowText()
括在一个中,并准确查看导致此错误的异常,可能会有所帮助。。。假设这是一个例外,而不是一些外部的东西-只是把它作为一种可能自己找到答案的方式,或者至少更接近找到答案。@mcmonkey4eva:对不起,我忘了在我的问题中提到这一点。我也尝试过,我将GetWindowText()封装在一个try块中,但控件根本没有进入catch块:-(这很有趣……我非常怀疑它,但“Debug”按钮是否有用?我甚至尝试过,它试图打开即时调试器,但没有成功(抛出一些其他错误消息,说明-无法调试)。我使用的代码与VS2010项目中的HaggartheThorbit代码基本相同,但它工作得非常完美。我不知道它在VS2012中是如何停止工作的。尽管如此,为什么它会工作?内存不是动态分配的吗?这让我觉得很奇怪。@ToToTotitus:访问冲突错误通常是不稳定的。当你这样做时不分配内存,默认情况下,StringBuilder的内部缓冲区指针可以分配少量内存,比如16字节(为了不重新分配,而是确认);在其他用户不太满意的情况下,在内部缓冲区边界之外写入数据可能不会破坏您的环境中的数据。当冒险越过托管代码的限制时,会发生奇怪的事情。谢谢,您的解决方案帮了我大忙。