2009-07-27 9 views
19

चारों ओर मैं नीचे दिए गए कोड है:का उपयोग SetWindowPos खिड़कियों को स्थानांतरित करने के

namespace WindowMover 
{ 
    using System.Windows.Forms; 

    static class Logic 
    { 
     [DllImport("user32.dll", EntryPoint = "SetWindowPos")] 
     public static extern IntPtr SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int x, int Y, int cx, int cy, int wFlags); 

     public static void Move() 
     { 
      const short SWP_NOMOVE = 0X2; 
      const short SWP_NOSIZE = 1; 
      const short SWP_NOZORDER = 0X4; 
      const int SWP_SHOWWINDOW = 0x0040; 

      Process[] processes = Process.GetProcesses("."); 
      foreach (var process in processes) 
      { 
       var handle = process.MainWindowHandle; 
       var form = Control.FromHandle(handle); 

       if (form == null) continue; 

       SetWindowPos(handle, 0, 0, 0, form.Bounds.Width, form.Bounds.Height, SWP_NOZORDER | SWP_SHOWWINDOW); 
      } 
     } 
    } 
} 

यह 0,0 (एक्स, वाई) करने के लिए अपने डेस्कटॉप पर हर खिड़की स्थानांतरित करने के लिए माना जाता है और एक ही आकार में बने। मेरी समस्या यह है कि केवल कॉलिंग ऐप (सी # में निर्मित) को स्थानांतरित किया जा रहा है।

क्या मुझे Control.FromHandle (IntPtr) के अलावा कुछ और उपयोग करना चाहिए? क्या यह केवल डॉटनेट नियंत्रण पाएगा? यदि हां, तो मुझे क्या उपयोग करना चाहिए?

इसके अलावा, दूसरे 0 SetWindowPos में सिर्फ एक यादृच्छिक पूर्णांक मैं वहाँ में रहना था, मैं क्या पिजिन जैसे कई खिड़कियों के साथ पूर्णांक के लिए hWndInsertAfter

के बारे में क्या प्रक्रियाओं का उपयोग करने के लिए यकीन नहीं है?

उत्तर

23

बस अपना नियंत्रण निकालें। फ्रॉम हैंडल और फॉर्म == शून्य जांच। तुम बस करने के लिए सक्षम होना चाहिए:

IntPtr handle = process.MainWindowHandle; 
if (handle != IntPtr.Zero) 
{ 
    SetWindowPos(handle, 0, 0, 0, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_SHOWWINDOW); 
} 

आप SWP_NOSIZE जोड़ेंगे, तो वह खिड़की का आकार नहीं बदलेंगे, लेकिन अभी भी इसका स्थान बदलना होगा।

यदि आप प्रक्रिया की सूची के माध्यम से और मेनविंडोहैंडल का उपयोग करने के बजाय P/Invoke withEnumWindows का उपयोग करने पर विचार करना चाहते हैं, तो आप सभी विंडोज़ को प्रभावित करना चाहते हैं।

+0

यह वहाँ हो रही है, लेकिन कुछ खिड़कियां (उन प्रक्रियाओं से अधिक विंडो है की तरह लगता है) नहीं कर रहे हैं सब घूम रहा है। बीटीडब्लू, आप मेरे कई सवालों का जवाब देते हैं, मुझे आशा है कि मुझे किसी दिन प्रोग्रामिंग के बारे में पता होगा .... – Matt

+0

मैट: मैंने इसके लिए समाधान जोड़ा - मुझे केवल अंत तक उस प्रतिक्रिया को नहीं देखा। EnumWindows सभी शीर्ष-स्तरीय विंडो (केवल मेनविंडोहैंडल विंडो नहीं) के माध्यम से फिर से शुरू हो जाएगा, जो आपको चाहिए जो आपको चाहिए। –

2

इसके साथ खेला गया। देखें कि यह मदद करता है।


using System.Windows.Forms; 
using System.Runtime.InteropServices; 
using System.Diagnostics; 


namespace ConsoleTestApp 
{ 
class Program 
{ 
    [DllImport("user32.dll")] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    static extern bool SetForegroundWindow(IntPtr hWnd); 

    static void Main(string[] args) 
    { 

     Process[] processes = Process.GetProcesses(); 

     foreach (var process in processes) 
     { 
      Console.WriteLine("Process Name: {0} ", process.ProcessName); 

      if (process.ProcessName == "WINWORD") 
      { 
       IntPtr handle = process.MainWindowHandle; 

       bool topMost = SetForegroundWindow(handle); 
      } 
     } 
} 
} 

संबंधित मुद्दे