2008-10-17 10 views
6

मेरा आवेदन एक vb6 निष्पादन योग्य है, लेकिन सिस्टम में कुछ नए रूप सी # में लिखे गए हैं। मैं मुख्य अनुप्रयोग विंडो में हैंडल का उपयोग करके सी # फॉर्म की मालिक संपत्ति सेट करने में सक्षम होना चाहता हूं, ताकि मेरे ऐप और अन्य ऐप्स के बीच आगे और पीछे टैबबिंग करते समय संवाद शीर्ष पर बने रहें।क्या मुझे अपने WinForms फॉर्म के मालिक को Hwnd/NativeWindow का उपयोग करके सेट करने का व्यवहार मिल सकता है?

मैं मुख्य एप्लिकेशन विंडो का hwnd प्राप्त कर सकता हूं। मुझे यकीन नहीं है कि मैं वहां से क्या कर सकता हूं?


अद्यतन अक्टू 20 '08 17:06 पर:

स्कॉट,

प्रतिक्रिया के लिए धन्यवाद। मैंने अनदेखा किया था कि शो/शोडियलॉग विधि पैरामीटर प्रकार का नहीं था - मैं केवल मालिक की संपत्ति पर देख रहा था।

मैंने उपरोक्त से उपयोग किए जा रहे कोड को थोड़ा संशोधित किया है - हमारे पास एक घटक है जो आम तौर पर हमारे फॉर्म लोड करता है और ShowDialog को कॉल करता है। मेरे कोड इस तरह दिखता है:

private IWin32Window GetWindowFromHost(int hwnd) 
{ 
    IWin32Window window = null; 
    IntPtr handle = new IntPtr(hwnd); 

    try 
    { 
     NativeWindow nativeWindow = new NativeWindow(); 
     nativeWindow.AssignHandle(handle); 
     window = nativeWindow; 
    } 
    finally 
    { 
     handle = IntPtr.Zero; 
    } 

    return window; 
} 

दुर्भाग्य से यह नहीं कर रहा है कि मैं क्या आशा व्यक्त की थी:

Form launchTarget = FormFactory.GetForm(xxx); // psuedo-code for generic form loader 
launchTarget.StartPosition = FormStartPosition.CenterParent; 
IWin32Window parentWindow = GetWindowFromHwnd(hwnd); 

launchTarget.ShowDialog(parentWindow); 

GetWindowFromHwnd अपने कोड की एक विधि-लिपटे संस्करण है। फॉर्म सामान्य रूप से प्रदर्शित होता है, लेकिन यह सही स्थिति में दिखाई नहीं दे रहा है और न ही जब भी मैं टैबलेट विंडो पर वापस जाता हूं और फिर भी शीर्ष पर रहता हूं। हमारे मॉडल टास्कबार में कोई कार्य नहीं दिखाते हैं, इसलिए खिड़की प्रतीत होता है "गायब हो जाता है" (हालांकि यह अभी भी alt-tab विंडो सूची में मौजूद है)। मेरे लिए यह इंगित करता है कि मेरे पास सही hwnd नहीं हो सकता है। यदि आपके पास कोई अन्य सुझाव है, तो कृपया उत्तर दें। एक बार फिर धन्यवाद।


अद्यतन नवंबर 10 '08 16:25

एक अनुवर्ती टिप्पणी पर - आप इसे बाहर कारक हैं एक कोशिश/अंत में, स्कॉट की 2 पोस्ट में के रूप में, कॉल में एक विधि कॉल में अंत में ब्लॉक में होना चाहिए:

parentWindow.ReleaseHandle(); 
+0

स्कॉट - लंबी देरी के लिए खेद है, अन्य चीजों पर खींच लिया गया है। आपका मूल सबमिट उत्तर बहुत अच्छा काम करता है। मुझे Form.Owner को सेट करने के बजाय ShowDialog के माध्यम से मूलविंडो को पास करने की आवश्यकता थी। मेरी दूसरी समस्या कॉलिंग कोड पहली जगह में सही एचडब्ल्यूएनडी नहीं पारित कर रहा था। धन्यवाद – mcw0933

+0

एफवाईआई, उपर्युक्त दोनों समस्याएं हल करने योग्य हैं - केंद्र के लिए सेट करने के लिए सुनिश्चित करें: "form.StartPosition = FormStartPosition.CenterParent" - toppyness के लिए सेट करना सुनिश्चित करें: form.TopMost = true; - बीटीडब्ल्यू, रिलीजहैंडल() पर जानकारी के लिए धन्यवाद! :-) – BrainSlugs83

उत्तर

9

तो तुम तो आप शायद या तो Show() या ShowDialog() उपयोग कर रहे हैं जिसका मतलब है कि VB6 से एक सी # विंडोज फार्म वर्ग, बुला रहे हैं, सही है? उन दोनों विधियों में IWin32Window पैरामीटर भी शामिल है, जो केवल उस ऑब्जेक्ट को परिभाषित करता है जो हैंडल नामक इंटिप्ट प्रॉपर्टी देता है।

तो ... आपको अपने विंडोज़ फॉर्म वर्गों के लिए एक ओवरलोडेड कन्स्ट्रक्टर (या शोडियलॉग विधि) जोड़ने की आवश्यकता है जो पैरामीटर के रूप में long लेता है ताकि आप फॉर्म में वीबी 6 एचडब्ल्यूएन पास कर सकें। एक बार सी # कोड के अंदर, आपको hwnd से एक IntPtr बनाने की आवश्यकता होती है और उसे NativeWindow ऑब्जेक्ट को असाइन करने की आवश्यकता होती है और उसके बाद उसे स्वामी के रूप में पास कर दिया जाता है।

कुछ इस चाहिए काम की तरह है, हालांकि यह अपरीक्षित है:

public DialogResult ShowDialog(long hwnd) 
{ 
    IntPtr handle = new IntPtr(hwnd); 
    try 
    { 
     NativeWindow nativeWindow = new NativeWindow(); 

     nativeWindow.AssignHandle(handle); 
     return this.ShowDialog(nativeWindow); 
    } 
    finally 
    { 
     handle = IntPtr.Zero; 
    } 
} 
2

इसमें काफ़ी समय एक टिप्पणी के रूप में पोस्ट करने के लिए है ...

मुझे लगता है कि समस्या आप में करने के लिए चलाए जा रहे है जिस तरह से मैंने ShowDialog अधिभार में प्रस्तुत कोड को लपेट लिया है।आप का पालन करें कि आपके GetWindowFromHost कोड क्या कर रहा है, तो यह निम्न चरणों के माध्यम से चला जाता:

  1. दिया hwnd से एक नया IntPtr बनाता है।
  2. एक नया नेटिवविंडो ऑब्जेक्ट बनाता है और IntPtr होने के लिए इसका हैंडल असाइन करता है।
  3. IntPtr.Zero होने के लिए IntPtr (अंत में ब्लॉक में) सेट करता है।

मुझे लगता है कि यह आखिरकार ब्लॉक है जो आपको समस्याएं पैदा कर रहा है। मेरे कोड में, आखिरकार कॉल this.ShowDialog(nativeWindow) पर कॉल के बाद समाप्त हो जाएगा। उस समय हैंडल (IntPtr) का उपयोग नहीं किया जा रहा था। आपके कोड में, आप IWin32Window लौट रहे हैं जो अभी भी उस IntPtr का संदर्भ धारण कर रहा है, जिस समय आप launchTarget.ShowDialog(parentWindow) को कॉल करते हैं IntPtr.Zero है।

इस तरह देखने के लिए अपने कोड बदलने का प्रयास करें:

private NativeWindow GetWindowFromHost(int hwnd) 
{ 
    IntPtr handle = new IntPtr(hwnd); 
    NativeWindow nativeWindow = new NativeWindow(); 
    nativeWindow.AssignHandle(handle); 
    return window; 
} 

और फिर इस तरह देखने के लिए अपनी बुला कोड बदलने के लिए:

Form launchTarget = FormFactory.GetForm(xxx); // psuedo-code for generic form 
loaderlaunchTarget.StartPosition = FormStartPosition.CenterParent; 
NativeWindow parentWindow = GetWindowFromHwnd(hwnd); 

try 
{ 
    launchTarget.ShowDialog(parentWindow); 
} 
finally 
{ 
    parentWindow.DestroyHandle(); 
} 

इन परिवर्तनों को काम करना चाहिए, लेकिन फिर से यह अपरीक्षित है।

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

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