2012-06-03 12 views
8

उद्देश्य विंडोज़ फॉर्म को प्रोग्रामेटिक रूप से शुरू करना है, इसके हैंडल प्राप्त करना है, और Win Api's SendMessage() फ़ंक्शन का उपयोग करके अपने wndProc() फ़ंक्शन को जानकारी भेजना है।सी # में प्रक्रिया की मुख्य विंडो हैंडल कैसे प्राप्त करें?

मुझे SendMessage() भाग का ख्याल रखा गया है लेकिन प्रक्रिया शुरू होने के बाद अब समस्या का संभाल हो रहा है।

मेरा पहला अनुमान यह था कि प्रक्रिया 'मेनविंडोहैंडल संपत्ति मुझे वह संभाल लेगी जो मैं ढूंढ रहा हूं, लेकिन जब मैं प्रक्रिया शुरू करता हूं तो मेनविंडोहैंडल 0 के बराबर रहता है और निम्न कोड उस प्रक्रिया के हैंडल को नहीं दिखाता है जिसे मैंने अभी शुरू किया है :

foreach (Process p in Process.GetProcesses()) 
{ 
Console.WriteLine(p.MainWindowHandle); 
} 

क्या कोई मुझे बता सकता है कि यह कैसे करना है और क्या यह वास्तव में किया जा सकता है?

+2

'थ्रेड स्लीप (3000) करने का प्रयास करें; प्रक्रिया शुरू करने के बाद, देखें कि परिणाम कोई अलग है या नहीं। इसके अलावा, आप किस प्रक्रिया शुरू कर रहे हैं? क्या इसमें खिड़की भी है? – SimpleVar

+0

ऐसा लगता है कि थ्रेड को नींद डालने की चाल चल रही थी। धन्यवाद –

+0

@YoryeNathan क्या आप अपनी टिप्पणी को उत्तर के रूप में डाल सकते हैं? –

उत्तर

9

कभी-कभी प्रक्रिया में सब कुछ सेट अप लेता है, लेकिन ऑब्जेक्ट तुरंत लौटा दिया जाता है।

इसी कारण से, प्रक्रिया को वास्तव में शुरू करने के लिए आपको थोड़ा इंतजार करना चाहिए, और फिर यह मुख्यविंडोहैंडल उचित रूप से तैयार किया जाएगा, जिसे उपभोग करने के लिए तैयार किया जाएगा।

var proc = Process.Start("notepad"); 

Thread.Sleep(1000); // This will wait 1 second 

var handle = proc.MainWindowHandle; 

एक अधिक स्मार्ट फैशन में यह करने के लिए किया जाएगा एक और तरीका है: यह प्रक्रिया शुरू करने का कारण है, और जब तक प्रतीक्षा करें MainWindowHandle खाली नहीं है

var proc = Process.Start("notepad"); 

try 
{ 
    while (proc.MainWindowHandle == IntPtr.Zero) 
    { 
     // Discard cached information about the process 
     // because MainWindowHandle might be cached. 
     proc.Refresh(); 

     Thread.Sleep(10); 
    } 

    var handle = proc.MainWindowHandle; 
} 
catch 
{ 
    // The process has probably exited, 
    // so accessing MainWindowHandle threw an exception 
} 

+0

वास्तव में योरी, मुझे लगता है कि अगर मैं अपने अवलोकनों के आधार पर इसका उल्लेख नहीं करता हूं तो मैं क्षमा करूँगा, आपका दूसरा दृष्टिकोण काम नहीं करेगा, क्योंकि, किसी कारण से, यदि आप प्रारंभ होने से पहले मेनविंडोहैंडल तक पहुंचते हैं, तो यह नहीं होता है बिल्कुल शुरू करें, जिसका अर्थ है कि आपका समय लूप हमेशा के लिए चलेगा। यह इस तरह क्यों है? मुझे नहीं पता, लेकिन अगर आप मुझ पर विश्वास नहीं करते हैं तो इसे आजमाएं। –

+3

@ जॉनस्मिथ आप सही हैं, जानकारी वस्तु में कैश किया जा रहा है। 'रीफ्रेश' विधि को कॉल करने से कैश की गई जानकारी को त्याग दिया जाता है, इसलिए अगली बार जब आप 'मेनविंडोहैंडल' प्रॉपर्टी तक पहुंच जाएंगे, तो यह आवश्यकतानुसार इसे वास्तविक विंडो से पुनर्प्राप्त कर देगा। मेरी पोस्ट का अपडेट देखें। – SimpleVar

+0

कभी-कभी मैं 3 साल पहले अपने उत्तरों से नई चीजें सीख रहा हूं। – SimpleVar

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