m0_61078026 2021-10-07 15:47 采纳率: 0%
浏览 3413
已结题

Windows下需要一款能刷新并截图的软件

Windows系统,有一个软件需要实时刷新才能收到信息,如果没有刷新,收不到信息。所以我需要一个能实现能隔2分钟刷新一下,如果有新信息来就截图自动保存下来的软件。有没有推荐的,谢谢了

  • 写回答

17条回答 默认 最新

  • 胸毛男 2021-10-08 11:31
    关注

    思路:MFC程序。。。。。1、获得屏幕HWND 2、获得屏幕HDC 3、创建HDC句柄 4、取得屏幕矩形 5、创建匹配的bitmap 6、设置实体 7‘bitblt函数画一下 记得要删除临时的HDC 还有Bitmap 确实是用SetTimer定时截取。这是部分程序 你改吧改吧应该可用
    void CServerMyFaTuDlg::CapSreen()
    {
    HWND hWnd = ::GetDesktopWindow();//获得屏幕的HWND.
    HDC hScreenDC = ::GetDC(hWnd); //获得屏幕的HDC.
    HDC MemDC = ::CreateCompatibleDC(hScreenDC);
    RECT rect;
    ::GetWindowRect(hWnd, &rect);
    SIZE screensize;
    screensize.cx = rect.right - rect.left;
    screensize.cy = rect.bottom - rect.top;
    hBitmap = ::CreateCompatibleBitmap(hScreenDC, screensize.cx, screensize.cy);
    HGDIOBJ hOldBMP = ::SelectObject(MemDC, hBitmap);
    ::BitBlt(MemDC, 0, 0, screensize.cx, screensize.cy, hScreenDC, rect.left, rect.top, SRCCOPY);
    ::SelectObject(MemDC, hOldBMP);
    ::DeleteObject(hOldBMP);
    ::ReleaseDC(hWnd, MemDC);
    ::DeleteObject(MemDC);
    ::DeleteDC(MemDC);
    ::ReleaseDC(hWnd, hScreenDC);
    ::DeleteDC(hScreenDC);

    }
    我做了个带界面的exe 需要vs2013的环境

    img

    运行起来是这样

    img


    每N秒次按照“桌面截图+年月日时分秒.bmp”格式存图。
    是这样吗?

    我又添加了些程序:把鼠标移动到屏幕右上角 点击鼠标左键 按F5刷新桌面 这是整个线程的程序

    
    ```c++
    DWORD WINAPI CServerMyFaTuDlg::Thread_CapScreenSave(LPVOID pthread)
    {
        CServerMyFaTuDlg* dlg = (CServerMyFaTuDlg*)pthread;
    
    
        int iIng = dlg->GetDlgItemInt(IDC_EDIT3);
    
        dlg->SetTimer(0, iIng * 1000, NULL);
        CString strFilePath;
        dlg->GetDlgItemTextW(IDC_EDIT4, strFilePath);
        dlg->GetDlgItem(IDC_BUTTON1)->EnableWindow(TRUE);
    
        // 记录时间
        CTime tm = CTime::GetCurrentTime();
        CString strDateTime;
        CString strFinnal;
        while (dlg->abstate.load(std::memory_order_acquire)==TRUE)
        {
            tm = CTime::GetCurrentTime();
            strDateTime = tm.Format(L"%Y%m%d%H%M%S");
    
    
            HDC hdc = ::GetDC(NULL);
            int iWidth = GetSystemMetrics(SM_CXSCREEN); //获取屏幕水平分辨率
            int iHeight = GetSystemMetrics(SM_CYSCREEN); //获取屏幕垂直分辨率
    
            SetCursorPos(iWidth, 0);//设置鼠标位置
            mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);//左键按下
            mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);//左键弹起
    
            Sleep(10);
    
            //通过F5,刷新桌面
            HWND hWndProgram = ::FindWindow(_T("Progman"), NULL);
            HWND hWndDefView = ::FindWindowEx(hWndProgram, NULL, _T("SHELLDLL_DefView"), NULL);
            HWND hWndListView = ::FindWindowEx(hWndDefView, NULL, _T("SysListView32"), NULL);
            ::PostMessage(hWndListView, WM_KEYDOWN, VK_F5, 0);
            ::PostMessage(hWndListView, WM_KEYUP, VK_F5, 0);
    
    
            // 截图
            dlg->CapSreen();
            strFinnal = strFilePath + L"\\桌面截图" + strDateTime + L".bmp";
            if (!dlg->SaveBitmapToFile(dlg->hBitmap, strFinnal))
            {
                dlg->PostMessage(WM_COMMAND, MAKEWPARAM(IDC_BUTTON1, BN_CLICKED), NULL);
            }
    
            WaitForSingleObject(dlg->hEvent, INFINITE);
    
        }
    
    
        return 0;
    }
    
    

    ```
    你要保证电脑没有开游戏,浏览器什么的,右上角要留出来可以点击鼠标的位置哦。

    这是这个工程的源码链接,只能这样了 ┑(~▽ ~)┍
    https://download.csdn.net/download/weixin_41376117/29638132

    评论

报告相同问题?

问题事件

  • 系统已结题 10月15日
  • 创建了问题 10月7日