2017-09-12 97 views
1

我已經嘗試了下面的簡單程序來使用XShmGetImage來獲取桌面圖像。XShmGetImage失敗,沒有顯示任何錯誤

#include <X11/Xlib.h> 
#include <X11/Xatom.h> 
#include <X11/Xutil.h> 
#include <X11/extensions/XShm.h> 
#include <X11/extensions/Xfixes.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <sys/ipc.h> 
#include <sys/shm.h> 

int main(int argc, const char *argv[]) 
{ 
    int screen; 
    Window root; 
    Display* display; 
    XImage* img, 

    int shm=0; 
    XShmSegmentInfo shminfo; 

    /* My Desktop Screen Resolution */ 

    int width=1360; 
    int height=768; 

    display = XOpenDisplay(getenv("DISPLAY")); 

    shm = XShmQueryExtension(display); 

    if (shm) { 
     printf ("Ha... QueryExtension Successful..\n"); 
     int scr = XDefaultScreen (display); 
     printf ("\n Screen Number is %d ", scr); 
     img = XShmCreateImage (display, DefaultVisual(display, scr), 
          DefaultDepth (display, scr), 
         ZPixmap, 
         NULL, 
         &shminfo, 
         width, 
         height); 
     printf ("\n Bytes Per Line %d ", img->bytes_per_line); 

     shminfo.shmid = shmget (IPC_PRIVATE, img->bytes_per_line * img->height, IPC_CREAT | 0777); 

     if (shminfo.shmid == -1) { 
      printf ("\n Can not get the shared Memory ..."); 
     } else { 
      printf ("\n Greate I am able to get shared memory.."); 
     } 

     shminfo.shmaddr = img->data =shmat (shminfo.shmid, 0,0); 
     shminfo.readOnly = False; 

     if (!XShmAttach (display, &shminfo)) { 
      printf ("\n i am unable to attach now.."); 
     } else { 
      printf ("\n Super.. i am able to attach Shared memory to extension "); 
     } 


     if (!XShmGetImage (display, RootWindow(display, DefaultScreen(display)), img, 0,0, AllPlanes)){ 
      printf ("\n Now you should have your image in XImage"); 
     } else { 
      printf ("\n Ooops.. Something wrong."); 

     } 
    } 

輸出:

Ha... QueryExtension Successful.. 
Screen Number is 0 
Bytes Per Line 5440 
Greate I am able to get shared memory.. 
Super.. i am able to attach Shared memory to extension 
Ooops.. Something wrong. 

不幸的是,XShmGetImage失敗,並顯示任何信息。請幫忙。

回答

0

從我身邊出現了一個錯誤。實際上,它工作正常,我錯誤地解釋了XShmGetImage API()的返回值。

正確的是

if (!XShmGetImage (display, RootWindow(display, DefaultScreen(display)), img, 0,0, AllPlanes)){ 
      printf ("\n Ooops.. Something wrong."); 

     } else { 
      printf ("\n Now you should have your image in XImage"); 
    } 
相關問題