我最近在网上抄了一份拷贝屏幕至内存的代码,该代码运行于一个 MFC DLL,我将这个DLL作为一个netsvcs 服务启动,可是发现StretchBlt函数无法执行,GetLastError返回5,拒绝访问。
我在单独调试时没有出现这样的错误啊,请问为什么一旦作为 windows 服务程序执行后,就无法拷贝屏幕了呢。
代码大致如下:
bRet = cdc.CreateDCW(L"DISPLAY", NULL, NULL, NULL); bRet = cbm.CreateCompatibleBitmap(&cdc, irCopyTo.width, irCopyTo.height); CDC copy_dc;
bRet = copy_dc.CreateCompatibleDC(&cdc); CBitmap *pOld = copy_dc.SelectObject(&cbm); bRet = copy_dc.StretchBlt(irCopyTo.left, irCopyTo.top, irCopyTo.width, irCopyTo.height, &cdc, irScreen.left, irScreen.top, irScreen.width, irScreen.height, SRCCOPY);

请高手指教,万分感谢

解决方案 »

  1.   

    可能是由于服务程序与用户程序不在同一桌面的原因。你试试SetProcessWindowStation、SetThreadDesktop。
      

  2.   

    服务默认桌面是console(没有桌面),要用SetProcessWindowStation和SetThreadDesktop来设置能交互的桌面,然后才能进行桌面操作。
      

  3.   

    呵呵,原来是这样,谢谢cnzdgs 和 jameshooo ,一语中的哈。偶只是以前试着编过Gina时听说要设置桌面,没想到服务程序也是这样。
    同时谢谢scq2099yt 
      

  4.   

    最近这两天为这个问题困扰,终于看到正解.
    谢谢cnzdgs 和 jameshooo ,同时也谢谢 xpersistence抛砖引玉.