2010-08-10 5 views
0

Je veux augmenter la taille du bureau (par programme), l'effet devrait être comme attacher le deuxième moniteur, sur le moniteur primaire rien ne devrait changer après l'augmentation.Augmentation de la taille du bureau Windows compliqué

Une telle astuce est nécessaire pour cacher la fenêtre hors écran, puis en utilisant PrintScreen obtenir cette image de la fenêtre, en le coupant de l'écran entier.

P.s. Fonction PrintWindow() ne va pas aider ici, je veux capturer quelque part l'image de prévisualisation webcam cachée, qui n'est pas superposition, mais toujours "fenêtre Activemovie" me donne une image noire.

Si u ne me croyez pas, essayez de capturer l'écran caché aperçu de Windows Messanger, à outils-> Assistant de réglage audio ...

Répondre

0

Hmm ... Vous pouvez écrire un pilote vidéo, qui devrait faire l'affaire. (La raison pour laquelle le simple déplacement de la fenêtre hors écran ne fonctionne pas est que la plupart des programmes ne reprennent pas toute la fenêtre - seulement la partie endommagée - et même alors, le contexte de l'appareil peut ne pas se souvenir du contenu s'il est dessiné à la mémoire vidéo).

+0

Merci, pour votre message Arafangion, mais pour moi je pense que l'écriture de pilote vidéo est trop. Je voudrais trouver une solution plus facile et plus facile. – bikt

+0

Bonne chance. Vous pourriez être chanceux et trouver un vieux pilote quelque part qui vous permet d'utiliser un "bureau virtuel" - qui faisait fureur à la fois. – Arafangion

0

Voici un code en C# qui m'a permis de redimensionner mon formulaire de manière à ce qu'il soit plus grand que la zone de bureau définie par mes 3 moniteurs. J'ai utilisé le DrawToBitmap après un paramètre random backgroundcolor pour voir si la partie non visible de la fenêtre a été peinte, et il semble que oui. Vous faites juste la même chose en C pour obtenir le même résultat. Accrocher, etc si nécessaire.

protected override void WndProc(ref Message m) { 
     if (m.ToString().Contains("GETMINMAXINFO")) { 
      //Get data 
      MINMAXINFO obj = (MINMAXINFO)Marshal.PtrToStructure(m.LParam, typeof(MINMAXINFO)); 
      //Change 
      if (obj.ptMaxSize.X > 0) { 
       obj.ptMaxSize.X = 60000; 
       obj.ptMaxSize.Y = 60000; 
       obj.ptMaxTrackSize.X = 60000; 
       obj.ptMaxTrackSize.Y = 60000; 
       //Update 
       Marshal.StructureToPtr(obj, m.LParam, true); 
      } 
     } 
     if (m.ToString().Contains("WINDOWPOSCHANGING")) { 
      //Get data 
      WINDOWPOS obj = (WINDOWPOS)Marshal.PtrToStructure(m.LParam, typeof(WINDOWPOS)); 
      //Change 
      if (obj.cx > 0) { 
       obj.cx = 8000; 
       //Update 
       Marshal.StructureToPtr(obj, m.LParam, true); 
      } 
     } 
     //Debug.WriteLine(m.ToString()); 
     base.WndProc(ref m); 
    } 

    [StructLayout(LayoutKind.Sequential)] 
    internal struct MINMAXINFO { 
     internal POINT ptReserverd; 
     internal POINT ptMaxSize; 
     internal POINT ptMaxPosition; 
     internal POINT ptMinTrackSize; 
     internal POINT ptMaxTrackSize; 
    } 
    [StructLayout(LayoutKind.Sequential)] 
    internal struct POINT { 
     internal int X; 
     internal int Y; 
    } 



    [StructLayout(LayoutKind.Sequential)] 
    internal struct WINDOWPOS { 
     internal IntPtr hwnd; 
     internal IntPtr hWndInsertAfter; 
     internal int x; 
     internal int y; 
     internal int cx; 
     internal int cy; 
     internal uint flags; 
    } 
Questions connexes