2011-06-03 9 views
7

पर सक्रिय विंडो कैसे बना सकता हूं मुझे लगता है कि मुझे पिनवोक का उपयोग करने की आवश्यकता है, लेकिन मुझे यकीन नहीं है कि कौन से फ़ंक्शन कॉल की आवश्यकता है।मैं एक अप्रबंधित एप्लिकेशन विंडो को सामने कैसे लाऊं, और इसे (सिम्युलेट) उपयोगकर्ता इनपुट

विस्तृत परिदृश्य। एक विरासत आवेदन चल रहा होगा। मैं उस आवेदन के लिए हैंडल होगा। मुझे यह करना होगा: ए) उस एप्लिकेशन को शीर्ष पर लाएं (अन्य सभी विंडोज़ के सामने)। बी) इसे सक्रिय विंडो बनाएं।

कौन सी विंडो फ़ंक्शन कॉल की आवश्यकता है? अब यह सोचते हैं

[DllImport("user32.dll", SetLastError = true)] 
static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 

आप आवेदन खिड़की करने के लिए एक संभाल:

उत्तर

11

आप विंडो के लिए एक संभाल नहीं है, तो, इससे पहले कि इस का उपयोग

[DllImport("user32.dll", SetLastError = true)] 
static extern bool SetForegroundWindow(IntPtr hWnd); 

यह कार्य पट्टी कर देगा फ्लैश करें अगर किसी अन्य विंडो में कीबोर्ड फोकस है।

यदि आप खिड़की को सामने आने के लिए मजबूर करना चाहते हैं, तो ForceForegroundWindow (नमूना कार्यान्वयन) का उपयोग करें।

+0

SetForegroundWindow मैं अब तक क्या जरूरत है लेकिन मैं जब ForceForegroundWindow (" 'ForceForegroundWindow' DLL 'user32.dll' में नामक एक प्रवेश बिंदु ढूँढने में असमर्थ।") –

+0

फोन करने की कोशिश कर त्रुटि मिलती है कर रहा है क्लिक करें मेरी गलती, यह उपयोगकर्ता द्वारा बनाई गई कार्य है। संपादित पोस्ट। –

+0

मेरे मामले में, मुझे इसके अलावा 'BringWindowToTop' का उपयोग करना पड़ा। ForceForegroundWindow मेरी समस्या को खूबसूरती से हल किया। धन्यवाद! –

7

यह बेहद विश्वसनीय साबित हुआ है। ShowWindowAsync फ़ंक्शन विशेष रूप से एक अलग थ्रेड द्वारा बनाई गई विंडो के लिए डिज़ाइन किया गया है। SW_SHOWDEFAULT यह सुनिश्चित करता है कि विंडो दिखाए जाने से पहले पुनर्स्थापित किया गया है, फिर सक्रिय कर रहा है।

[DllImport("user32.dll", SetLastError = true)] 
    internal static extern bool ShowWindowAsync(IntPtr windowHandle, int nCmdShow); 

    [DllImport("user32.dll", SetLastError = true)] 
    internal static extern bool SetForegroundWindow(IntPtr windowHandle); 

फिर कॉल करने:

ShowWindowAsync(windowHandle, SW_SHOWDEFAULT); 
ShowWindowAsync(windowHandle, SW_SHOW); 
SetForegroundWindow(windowHandle); 
+0

एक आकर्षण की तरह काम करता है जबकि मैंने कोशिश की हर दूसरे कोड में असफल रहा। –

9
[DllImport("user32.dll")] 
    public static extern bool ShowWindowAsync(HandleRef hWnd, int nCmdShow); 
    [DllImport("user32.dll")] 
    public static extern bool SetForegroundWindow(IntPtr WindowHandle); 
    public const int SW_RESTORE = 9; 

ShowWindowAsync विधि कम से कम आवेदन को दिखाने के लिए प्रयोग किया जाता है और SetForegroundWindow विधि वापस आवेदन मोर्चे पर लाने के लिए प्रयोग किया जाता है।

आप इन विधियों का उपयोग कर सकते हैं जैसा कि मैंने अपने आवेदन में इस्तेमाल किया था ताकि मेरे आवेदन के स्काइप को सामने लाया जा सके। बटन पर

private void FocusSkype() 
    { 
     Process[] objProcesses = System.Diagnostics.Process.GetProcessesByName("skype"); 
     if (objProcesses.Length > 0) 
     { 
      IntPtr hWnd = IntPtr.Zero; 
      hWnd = objProcesses[0].MainWindowHandle; 
      ShowWindowAsync(new HandleRef(null,hWnd), SW_RESTORE); 
      SetForegroundWindow(objProcesses[0].MainWindowHandle); 
     } 
    } 
+0

धन्यवाद। मेरा समय बचाया :) –

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