Pergunta

Eu quero proporcionar ao usuário com uma escala reduzida captura de tela do seu desktop em meu aplicativo.

Existe uma maneira de tirar um screenshot do desktop do Windows do usuário atual?

Eu estou escrevendo em C #, mas se há uma solução melhor em outro idioma, estou aberto a isso.

Para esclarecer, eu preciso de uma imagem do Windows Desktop - que é o papel de parede e apenas ícones; não aplicações ou qualquer coisa que tem foco.

Foi útil?

Solução

Você está procurando Graphics.CopyFromScreen . Criar um novo Bitmap do tamanho certo e passar da gráficos bitmap coordenadas de tela objeto da região para copiar.

Há também um artigo descrevendo como tirar programaticamente instantâneos.

Response to edit : eu não entendi o que você entende por "desktop". Se você quiser tirar uma foto do desktop, você terá que:

  1. Minimizar todas as janelas usando o Win32API (enviar uma mensagem MIN_ALL ) primeira
  2. Leve o instantâneo
  3. Em seguida, desfazer a minimizar tudo (enviar uma mensagem MIN_ALL_UNDO).

Uma maneira melhor de fazer isso seria para não perturbar as outras janelas, mas para copiar a imagem diretamente da janela da área de trabalho. GetDesktopWindow em User32 retornará um identificador para o Área de Trabalho. Depois de ter o identificador de janela, obtê-lo do contexto dispositivo e copiar a imagem para um novo Bitmap.

um excelente exemplo sobre CodeProject de como copiar a imagem do isto. Procure o código de exemplo sobre a obtenção e criar o contexto do dispositivo na secção "Capturar o conteúdo da janela".

Outras dicas

Tenho a impressão de que você está atirando para tirar uma fotografia do ambiente de trabalho real (com papel de parede e ícones), e nada mais.

1) Chamada ToggleDesktop () in Shell32 usando COM
2) Use Graphics.CopyFromScreen para copiar a atual área de trabalho
3) Chamada ToggleDesktop () para restaurar o estado do desktop anterior

Editar: Sim., Chamando MinimizeAll () é beligerante

Aqui está uma versão atualizada que eu chicoteado juntos:

    /// <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;

    }

Ajustar a gosto para vários cenários do monitor (embora parece que isso deve funcionar muito bem para sua aplicação).

Você pode olhar para usando GetDesktopWindow através de p / invoke, em seguida, obter o contexto do dispositivo e tomar o seu instantâneo. Há um muito detalhado tutorial aqui . Poderia ser melhor do que perturbando as janelas existentes.

Todos os ex-respostas são completamente erradas ( aplicativos minimizando é absurdo )
Basta usar SHW api: uma linha do código (o bitmap área de trabalho que está sendo armazenada em cache, a api simplesmente blits-lo ao seu HDC ...)

Você sempre pode pegar captura de tela no inicialização do Windows antes de executar aplicações ou usar outra área de trabalho usando comutação de área de trabalho. Dê uma olhada aqui: http://www.codeproject.com/Articles/7666/Desktop-Switching Mudar para outra área de trabalho, tirar uma foto e lembre-se que você não precisa mostrá-lo apenas criá-lo "DESKTOP"

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top