<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>

    <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
  </head>
  <body text="#000000" bgcolor="#ffffff">
    Hi,<br>
    <br>
    I'm writing a fully managed remote-desktop clone.<br>
    <br>
    I encountered a problem:<br>
    I wanted to take a screenshot in managed code, as described here:<br>
    <a
href="http://jalpesh.blogspot.com/2007/06/how-to-take-screenshot-in-c.html">http://jalpesh.blogspot.com/2007/06/how-to-take-screenshot-in-c.html</a><br>
    (first comment for proper code)<br>
    <br>
    Which gets me this on mono 2.6.7 and 2.10.1 (upgraded to 2.10.1
    after it didn't work in 2.6.7):<br>
    <small>System.InvalidOperationException: XGetImage returned NULL
      when asked to for a 5120x800 region block</small><br>
    <br>
    If I add (uncomment it, see code at the bottom of this mail)<br>
    <small>rectScreenBounds = new System.Drawing.Rectangle(0,0,100,100);
    </small><br>
    then it works...<br>
    <br>
    So the result of the <small>System.Windows.Forms.Screen.GetBounds</small>
    rectangle is certainly wrong. <br>
    (It works fine on Windows).<br>
    I've got a 1024x768 resolution, 15 inch laptop monitor...<br>
    <br>
    You can get the proper screen bounds in C by getting DisplayHeight
    and DisplayWidth from DefaultScreen via X11 with this code:<span
      class="Apple-style-span" style="border-collapse: separate; color:
      rgb(0, 0, 0); font-family: 'Times New Roman'; font-style: normal;
      font-variant: normal; font-weight: normal; letter-spacing: normal;
      line-height: normal; orphans: 2; text-indent: 0px; text-transform:
      none; white-space: normal; widows: 2; word-spacing: 0px;
      font-size: medium;"><span class="Apple-style-span"
        style="font-family: Verdana,Arial,Tahoma; font-size: 12px;
        font-style: italic;"></span></span><br>
    <br>
    <span class="Apple-style-span" style="border-collapse: separate;
      color: rgb(0, 0, 0); font-family: 'Times New Roman'; font-style:
      normal; font-variant: normal; font-weight: normal; letter-spacing:
      normal; line-height: normal; orphans: 2; text-indent: 0px;
      text-transform: none; white-space: normal; widows: 2;
      word-spacing: 0px; font-size: medium;"><span
        class="Apple-style-span" style="font-family:
        Verdana,Arial,Tahoma; font-size: 12px; font-style: italic;">
        <pre class="alt2" dir="ltr" style="background-color: rgb(255, 255, 255); color: rgb(0, 0, 0); margin: 0px; padding: 6px; border-width: 1px; border-style: inset; width: 640px; height: 498px; text-align: left; overflow: auto;">
    char *display_name = NULL;

    Display* display;

    /* open the connection to the display "simey:0". */
    display = XOpenDisplay(display_name);// display = XOpenDisplay("simey:0");
    if (display == NULL)
    {
        fprintf(stderr, "Cannot connect to X server %s\n", "simey:0");
        exit (-1);
    }


    int screen_height = DisplayHeight(display, DefaultScreen(display));
    int screen_width  = DisplayWidth(display, DefaultScreen(display));
    printf("This screen is (%d,%d)\n", screen_width, screen_height);

    XCloseDisplay( display )</pre>
      </span></span><br>
    <br>
    Furthermore, since I already am writing an email, after compiling
    the entire mono 2.10.1 suite:<br>
    When starting MonoDevelop, I get:<br>
    <span class="Apple-style-span" style="border-collapse: separate;
      color: rgb(0, 0, 0); font-family: 'Times New Roman'; font-style:
      normal; font-variant: normal; font-weight: normal; letter-spacing:
      normal; line-height: normal; orphans: 2; text-indent: 0px;
      text-transform: none; white-space: normal; widows: 2;
      word-spacing: 0px; font-size: medium;"><span
        class="Apple-style-span" style="font-family:
        Verdana,Arial,Tahoma; font-size: 12px;">---&gt;
        System.DllNotFoundException: gtksharpglue-2</span></span><br>
    <br>
    But libgtksharpglue-2.so is present in <br>
    <span class="Apple-style-span" style="border-collapse: separate;
      color: rgb(0, 0, 0); font-family: 'Times New Roman'; font-style:
      normal; font-variant: normal; font-weight: normal; letter-spacing:
      normal; line-height: normal; orphans: 2; text-indent: 0px;
      text-transform: none; white-space: normal; widows: 2;
      word-spacing: 0px; font-size: medium;"><span
        class="Apple-style-span" style="font-family:
        Verdana,Arial,Tahoma; font-size: 12px;">/usr/lib/cli/gtk-sharp-2.0/libgtksharpglue-2.so</span></span><br>
    <br>
    This error occurs because libgtksharpglue-2.so is in a subfolder of
    /usr/lib, so this path is NOT in the ld-config paths.<br>
    <br>
    One needs to create a glib.conf file in /etc/ld.so.conf.d/:<br>
    <span class="Apple-style-span" style="border-collapse: separate;
      color: rgb(0, 0, 0); font-family: 'Times New Roman'; font-style:
      normal; font-variant: normal; font-weight: normal; letter-spacing:
      normal; line-height: normal; orphans: 2; text-indent: 0px;
      text-transform: none; white-space: normal; widows: 2;
      word-spacing: 0px; font-size: medium;"><span
        class="Apple-style-span" style="font-family:
        Verdana,Arial,Tahoma; font-size: 12px;">
        <pre class="alt2" dir="ltr" style="background-color: rgb(255, 255, 255); color: rgb(0, 0, 0); margin: 0px; padding: 6px; border-width: 1px; border-style: inset; width: 640px; height: 34px; text-align: left; overflow: auto;">gedit /etc/ld.so.conf.d/glib.conf
</pre>
      </span></span><br>
    And then add this text to it<br>
    <span class="Apple-style-span" style="border-collapse: separate;
      color: rgb(0, 0, 0); font-family: 'Times New Roman'; font-style:
      normal; font-variant: normal; font-weight: normal; letter-spacing:
      normal; line-height: normal; orphans: 2; text-indent: 0px;
      text-transform: none; white-space: normal; widows: 2;
      word-spacing: 0px; font-size: medium;"><span
        class="Apple-style-span" style="font-family:
        Verdana,Arial,Tahoma; font-size: 12px;">
        <pre class="alt2" dir="ltr" style="background-color: rgb(255, 255, 255); color: rgb(0, 0, 0); margin: 0px; padding: 6px; border-width: 1px; border-style: inset; width: 640px; height: 50px; text-align: left; overflow: auto;"># Mono needs you
/usr/lib/cli/glib-sharp-2.0</pre>
      </span></span><br>
    And afterwards updating the ld-library paths<br>
    <span class="Apple-style-span" style="border-collapse: separate;
      color: rgb(0, 0, 0); font-family: 'Times New Roman'; font-style:
      normal; font-variant: normal; font-weight: normal; letter-spacing:
      normal; line-height: normal; orphans: 2; text-indent: 0px;
      text-transform: none; white-space: normal; widows: 2;
      word-spacing: 0px; font-size: medium;"><span
        class="Apple-style-span" style="font-family:
        Verdana,Arial,Tahoma; font-size: 12px;">
        <pre class="alt2" dir="ltr" style="background-color: rgb(255, 255, 255); color: rgb(0, 0, 0); margin: 0px; padding: 6px; border-width: 1px; border-style: inset; width: 640px; height: 34px; text-align: left; overflow: auto;">/sbin/ldconfig</pre>
      </span></span><br>
    This needs to be included in the installing subroutine (well,
    without using gedit, you know what I mean)<br>
    <br>
    <br>
    <br>
    Here my screenshot code:<br>
    (Note: it gets called from a timer every 1000/24 = 41 milliseconds)<br>
    <br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected System.Drawing.Rectangle rectScreenBounds =
    System.Windows.Forms.Screen.GetBounds(System.Drawing.Point.Empty);
<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected System.Drawing.Bitmap bmpScreenshot = new
    System.Drawing.Bitmap(1, 1);
<br>
    &nbsp;<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //
    <a class="moz-txt-link-freetext" href="http://jalpesh.blogspot.com/2007/06/how-to-take-screenshot-in-c.html">http://jalpesh.blogspot.com/2007/06/how-to-take-screenshot-in-c.html</a>
<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private void GetScreenshot()
<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*
<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Do I need to dispose the PictureBox.Image as well ?<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (this.pictureBox1.Image != null)
<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.pictureBox1.Image.Dispose();
<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */
<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bmpScreenshot.Dispose();
<br>
    &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br>
    &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Console.WriteLine(rectScreenBounds.ToString());
<br>
    &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //rectScreenBounds = new
    System.Drawing.Rectangle(0,0,100,100);
<br>
    &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bmpScreenshot = new
    System.Drawing.Bitmap(rectScreenBounds.Width,
    rectScreenBounds.Height);
<br>
    &nbsp;<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; using (System.Drawing.Graphics g =
    System.Drawing.Graphics.FromImage(bmpScreenshot))
<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g.CopyFromScreen(System.Drawing.Point.Empty,
    System.Drawing.Point.Empty, rectScreenBounds.Size);
<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } // End Using g
<br>
    &nbsp;<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.pictureBox1.Image = bmpScreenshot;
<br>
    &nbsp;<br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } // End Sub GetScreenshot<br>
    <br>
    <br>
  </body>
</html>