簡體   English   中英

有沒有辦法截取用戶的Windows桌面的截圖?

[英]Is there a way to take a screenshot of the user's Windows desktop?

我想在我的應用程序中為用戶提供其桌面的縮小版屏幕截圖。

有沒有辦法截取當前用戶的Windows桌面?

我正在用C#編寫,但是如果用另一種語言有更好的解決方案,我會對它持開放態度。

為了澄清,我需要一個Windows桌面的截圖 - 這只是壁紙和圖標; 沒有應用程序或任何有重點的東西。

您正在尋找Graphics.CopyFromScreen 創建一個正確大小的新位圖,並傳遞要復制的區域的Bitmap的Graphics對象屏幕坐標。

還有一篇文章描述了如何以編程方式拍攝快照。

回復編輯 :我誤解了“桌面”的含義。 如果你想拍攝桌面照片,你必須:

  1. 首先使用Win32API (發送MIN_ALL消息) 最小化所有窗口
  2. 拍攝快照
  3. 然后撤消最小化全部(發送MIN_ALL_UNDO消息)。

更好的方法是不要打擾其他窗口,而是直接從桌面窗口復制圖像。 User32中的GetDesktopWindow將返回桌面的句柄。 獲得窗口句柄后,獲取它的設備上下文並將圖像復制到新的位圖。

CodeProject上有一個很好的例子 ,說明如何從中復制圖像。 在“捕獲窗口內容”部分中查找有關獲取和創建設備上下文的示例代碼。

我得到的印象是你正在拍攝實際桌面(帶壁紙和圖標)的照片,而不是別的。

1)使用COM調用Shell32中的ToggleDesktop()
2)使用Graphics.CopyFromScreen復制當前桌面區域
3)調用ToggleDesktop()以恢復以前的桌面狀態

編輯:是的,調用MinimizeAll()是好戰的。

這是我鞭打的更新版本:

    /// <summary>
    /// Minimizes all running applications and captures desktop as image
    /// Note: Requires reference to "Microsoft Shell Controls and Automation"
    /// </summary>
    /// <returns>Image of desktop</returns>
    private Image CaptureDesktopImage() {

        //May want to play around with the delay.
        TimeSpan ToggleDesktopDelay = new TimeSpan(0, 0, 0, 0, 150);

        Shell32.ShellClass ShellReference = null;

        Bitmap WorkingImage = null;
        Graphics WorkingGraphics = null;
        Rectangle TargetArea = Screen.PrimaryScreen.WorkingArea;
        Image ReturnImage = null;

        try
        {

            ShellReference = new Shell32.ShellClass();
            ShellReference.ToggleDesktop();

            System.Threading.Thread.Sleep(ToggleDesktopDelay);

            WorkingImage = new Bitmap(TargetArea.Width,
                TargetArea.Height);

            WorkingGraphics = Graphics.FromImage(WorkingImage);
            WorkingGraphics.CopyFromScreen(TargetArea.X, TargetArea.X, 0, 0, TargetArea.Size);

            System.Threading.Thread.Sleep(ToggleDesktopDelay);
            ShellReference.ToggleDesktop();

            ReturnImage = (Image)WorkingImage.Clone();

        }
        catch
        {
            System.Diagnostics.Debugger.Break();
            //...
        }
        finally
        {
            WorkingGraphics.Dispose();
            WorkingImage.Dispose();
        }

        return ReturnImage;

    }

根據多種監視器場景調整味道(雖然聽起來這應該適用於您的應用程序)。

您可以通過p / invoke查看使用GetDesktopWindow ,然后獲取設備上下文並拍攝快照。 有一個非常詳細的教程在這里 它可能比擾亂現有的窗戶更好。

您可以在應用程序運行之前始終在Windows啟動時捕獲屏幕截圖,或使用桌面切換使用其他桌面。 看看這里: http//www.codeproject.com/Articles/7666/Desktop-Switching切換到其他桌面,拍照並記住你不需要顯示它只是創建它“DESKTOP”

所有以前的答案都是完全錯誤的( 最小化應用程序是荒謬的
只需使用SHW api: 一行代碼(緩存的桌面位圖,api只是將它暴露給你的HDC ......)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM