2011-10-31 61 views
2

如标题所示,调用Bitmap.GetPixel不会产生任何结果。没有赋值给变量,没有抛出异常。Bitmap.GetPixel()不返回

这里是我的测试代码:

private void frmStatTracker_Load(object sender, EventArgs e) 
    { 
     ScreenCapture sc = new ScreenCapture(); 
     Color charlie = new Color(); 
     foreach (Process p in Process.GetProcesses()) 
     { 
      if (p.MainWindowTitle.Contains("DM -")) 
      { 
       sc.CaptureWindowToFile(p.MainWindowHandle, "C:\\test.png", System.Drawing.Imaging.ImageFormat.Png); 
       Image i = sc.CaptureWindow(p.MainWindowHandle); 
       Bitmap b = new Bitmap(i); 
       pictureBox1.Image = b; 

       charlie = b.GetPixel(65, 41); 
       return; 
      } 
     } 
    } 

当我断点的代码,我得到如下:

我已经从抓屏在一个有效的图像。

b在其中有一个有效的图像。

查理是没有价值。当我将它添加到监视列表中时,它告诉我charlie不存在于当前上下文中,并且该变量不存在于Locals窗口中。如果我断言了声明或者它赋值的那一行,那么断点将会被触发并且似乎在运行。

我在我的智慧结局,并不知道如何开始排除故障。帮帮我?

感谢:-)

+0

除非必须,否则不要调试发布版本。 –

回答

3

您正在调试版本(或其他优化)的版本。这就是为什么charlie不存在。该变量只被赋值,没有被使用。编译器已经优化了它。

编辑:您可以通过使用调试版本来防止这种情况,或者像David Heffernan所说的那样,通过charlie做一些有意义的事情。

+0

谢谢。我昨天凌晨2点建立了一个发布版本,并忘记将其切换回来。 – HeWhoWas

3

只要你编写了一些代码实际上对charlie做了些什么,编译器就会停止优化它。

举例来说,如果你有一个名为snort(Color color)功能,然后写:

charlie = b.GetPixel(65, 41); 
snort(charlie); 

就(可能)有足够的强制编译器不优化charlie了。

当然,您可能正在调试启用优化的发布版本。您应该更改项目设置,以便在构建调试时禁用优化。当你这样做时,你将不需要诉诸技巧来击败优化器。或者也许你只是在错误地调试发布版本 - 你会得到我信任的想法。

+1

这是错误的。感谢您的指针和广告代码:-P – HeWhoWas