2012-06-16 10 views
8

मैं चल रही किसी अन्य प्रक्रिया के विंडो स्थिति (maximized, minimized) कैसे प्राप्त करूं?किसी अन्य प्रक्रिया की विंडो स्थिति प्राप्त करें

मैं इस का उपयोग करके की कोशिश की होगी:

Process[] procs = Process.GetProcesses(); 

     foreach (Process proc in procs) 
     { 

      if (proc.ProcessName == "notepad") 
      { 
       MessageBox.Show(proc.StartInfo.WindowStyle.ToString()); 

      } 
     } 

लेकिन अगर प्रक्रिया Maximized या Minimized है, यह कभी Normal देता है।

इसे कैसे ठीक करें?

उत्तर

17

आपको किसी अन्य विंडो की स्थिति की जांच के लिए पी/Invoke के माध्यम से Win32 का उपयोग करने की आवश्यकता होगी। यहां कुछ नमूना कोड दिया गया है:

static void Main(string[] args) 
{ 
    Process[] procs = Process.GetProcesses(); 

    foreach (Process proc in procs) 
    { 
     if (proc.ProcessName == "notepad") 
     { 
      var placement = GetPlacement(proc.MainWindowHandle); 
      MessageBox.Show(placement.showCmd.ToString()); 
     } 
    } 
} 

private static WINDOWPLACEMENT GetPlacement(IntPtr hwnd) 
{ 
    WINDOWPLACEMENT placement = new WINDOWPLACEMENT(); 
    placement.length = Marshal.SizeOf(placement); 
    GetWindowPlacement(hwnd, ref placement); 
    return placement; 
} 

[DllImport("user32.dll", SetLastError = true)] 
[return: MarshalAs(UnmanagedType.Bool)] 
internal static extern bool GetWindowPlacement(
    IntPtr hWnd, ref WINDOWPLACEMENT lpwndpl); 

[Serializable] 
[StructLayout(LayoutKind.Sequential)] 
internal struct WINDOWPLACEMENT 
{ 
    public int length; 
    public int flags; 
    public ShowWindowCommands showCmd; 
    public System.Drawing.Point ptMinPosition; 
    public System.Drawing.Point ptMaxPosition; 
    public System.Drawing.Rectangle rcNormalPosition; 
} 

internal enum ShowWindowCommands : int 
{ 
    Hide = 0, 
    Normal = 1, 
    Minimized = 2, 
    Maximized = 3, 
} 

pinvoke.net की परिभाषा सौजन्य।

+0

मेरे मामले में, 'showCmd' हमेशा मूल मान होता है, और वही रहता है, भले ही' ShowWindow (showCmd! = 1) 'कहा जाता है,' GetWindowPlacement' अभी भी 'विन्डोज़प्लेसमेंट' संरचना में 'showCmd = 1' देता है। तो क्या सचमुच उस क्षण के बारे में खिड़की 'रखा' है? –

+0

'System.Drawing' – LazerSharks

6

आप proc.StartInfo का उपयोग कर रहे हैं, जो गलत है। यह लक्ष्य प्रक्रिया की रनटाइम विंडो शैली को प्रतिबिंबित नहीं करता है। यह केवल स्टार्टअप जानकारी है जिसे आप सेट कर सकते हैं और फिर इसे शुरू होने पर प्रक्रिया में पारित किया जा सकता है।

सी # हस्ताक्षर है:

[DllImport("user32.dll", SetLastError=true)] 
static extern int GetWindowLong(IntPtr hWnd, int nIndex); 

आप/p उपयोग करने के लिए आह्वान और GetWindowLong (hWnd, GWL_STYLE) कहते हैं, और proc.MainWindowHandle hWnd पैरामीटर के रूप में पारित की जरूरत है।

आप देख सकते हैं विंडो छोटी/की तरह कुछ कर रही द्वारा अधिकतम:

int style = GetWindowLong(proc.MainWindowHandle, GWL_STYLE); 
if((style & WS_MAXIMIZE) == WS_MAXIMIZE) 
{ 
    //It's maximized 
} 
else if((style & WS_MINIMIZE) == WS_MINIMIZE) 
{ 
    //It's minimized 
} 

नोट: झंडे (WS_MINIMIZE, आदि) के लिए मूल्यों, इस पृष्ठ पर पाया जा सकता है: http://www.pinvoke.net/default.aspx/user32.getwindowlong

परिणाम का परीक्षण करने में हमारी त्रुटि को इंगित करने के लिए काकाशी को धन्यवाद।

+1

कि सी # नेट के लिए मत भूलना केवल बूलियन भाव को स्वीकार करता है, तो इन/के लिए/जबकि-बयान। यदि आप 'शैली' से 'WS_MAXIMIZE' कटा हुआ मान जांचना चाहते हैं, तो' ''का उपयोग करके, आपको' (शैली और WS_MAXIMIZE) == WS_MAXIMIZE' करना चाहिए। – Kakashi

+0

सच है। अद्यतन उत्तर –

+1

और आवश्यक '() 'या आपको' ऑपरेटर 'और' प्रकार 'int' और 'bool'' – Kakashi

2

दो विंडो राज्य अमेरिका (अधिकतम/कम से कम) WinAPI IsIconic()/IsZoomed() इस तरह फोन करके मिल जा सकता है:

[DllImport("user32.dll")] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    public static extern bool IsIconic(IntPtr hWnd); 

    [DllImport("user32.dll")] 
    public static extern bool ShowWindowAsync(IntPtr hWnd, ShowWindowCommands cmdShow); 

    if (IsIconic(_helpWindow.MainWindowHandle)) { 
     ShowWindowAsync(_helpWindow.MainWindowHandle, ShowWindowCommands.SW_RESTORE); 
    } 

enum ShowWindowCommands और अन्य कार्यों की परिभाषा से ले जाया गया www.PInvoke.net

0

विंडोज PowerShell में आप निम्नलिखित कोड करके ऐसा कर सकते:

Add-Type -AssemblyName UIAutomationClient 
$prList = Get-Process -Name "<ProcessNamesWhichHaveWindow>" 
$prList | % { 
    $ae = [System.Windows.Automation.AutomationElement]::FromHandle($_.MainWindowHandle) 
    $wp = $ae.GetCurrentPattern([System.Windows.Automation.WindowPatternIdentifiers]::Pattern) 
    echo "Window title: $($_.MainWindowTitle)" 
    echo "Window visual state: $($wp.Current.WindowVisualState)" 
} 
+0

पर संदर्भ जोड़ने के लिए याद रखें लेकिन यह केवल विंडोज 7 और ऊपर काम करेगा। – Ladislav

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