2009-11-10 11 views
9

मैं एक छोटा सा प्रोग्राम विकसित कर रहा हूं जो एक विंडोज़ फॉर्म के रूप में है। इस फ़ॉर्म पर, मैं एक लिंक रखना चाहता हूं, और जब उपयोगकर्ता लिंक पर क्लिक करता है, तो पोस्ट डेटा के साथ एक अलग आईई ब्राउज़र खुल जाएगा।सी # में पोस्ट जानकारी के साथ आईई कैसे खोलें?

मूल, मैंने System.Diagnostics.Process.start() का उपयोग किया। हालांकि, मैं इस तरह के कॉल के माध्यम से डेटा पोस्ट नहीं कर सकता।

और मैंने वेब की खोज की, कुछ लोगों ने "माइक्रोसॉफ्ट वेब ब्राउज़र नियंत्रण" का उपयोग करने का सुझाव दिया, हालांकि, इस फ़ॉर्म को मेरे रूप में जोड़ने की जरूरत है, और फॉर्म में एक्सप्लोरर प्रदर्शित करना है, लेकिन मैं एक अलग आईई खोला चाहता हूं।

और मैंने वीबी में देखा है CreateObject("InternetExplorer.Application") के रूप में एक विधि है, लेकिन मुझे यह नहीं पता कि सी # में इसका उपयोग कैसे किया जाए।

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

+0

आप वेबब्रोसर नियंत्रण की नेविगेट() विधि का उपयोग कर सकते हैं और बस इसे अपने फॉर्म में पूरी तरह छुपाया जा सकता है। –

उत्तर

13

अपने फॉर्म पर एक वेब ब्राउजर ड्रॉप करें। इसमें "webBrowser1" का डिफ़ॉल्ट नाम होना चाहिए - यदि आप चाहें तो इसे बदल सकते हैं। "दृश्यमान" संपत्ति को "गलत" पर सेट करें। कोड में लोड इवेंट उत्पन्न करने के लिए फॉर्म टाइटल बार को डबल-क्लिक करें।

कॉल नेविगेट विधि है, जो इस हस्ताक्षर हैं:

void Navigate(string urlString, string targetFrameName, byte[] postData, string additionalHeaders); 
इस तरह

:

private void Form1_Load(object sender, EventArgs e) 
{ 
    webBrowser1.Navigate("http://www.google.com/", "_blank", Encoding.Default.GetBytes("THIS IS SOME POST DATA"), ""); 
} 

आप तुम वहाँ में चाहते हैं बाइट्स की किसी भी सरणी पारित कर सकते हैं ... Encoding.Default.GetBytes() एक स्ट्रिंग को पारित करने का एक तेज़ तरीका है।

चाल लक्ष्य फ्रेम के लिए "_blank" का उपयोग करना है।

+0

मुझे संदेह है कि आप कह सकते हैं कि प्रक्रिया को एम्बेड करने में सक्षम है बस प्रक्रिया करने के लिए। स्टार्ट() वैसे भी कर सकता है? – slugster

+3

यह प्रभावी रूप से .NET के लिए सबसे अच्छा सरल उत्तर है। अधिक "सही" उत्तर में "InternetExplorer.Aplication" प्रोजेड पर CoCreateInstance को कॉल करना शामिल है, और आपके बाद सीसीआई के बाद, आप .Navigate2 इंटरफ़ेस को कॉल कर सकते हैं और पोस्ट डेटा पास कर सकते हैं। लेकिन इसमें COM/PInvoke goo का एक गुच्छा शामिल करने जा रहा है कि यह जवाब अच्छी तरह से बचाता है। – EricLaw

-3

असल में, आप पोस्ट क्वेरी स्ट्रिंग डेटा के साथ process.start उपयोग कर सकते हैं:

System.Diagnostics.Process.Start("IExplore.exe", "http://localhost/file.html?foo=bar&baz=duh"); 
+5

जो एक पोस्ट करता है, कोई पोस्ट नहीं –

3

आप यूआरएल तो डिफ़ॉल्ट वेब ब्राउज़र पैदा हो जाएगा पर खुली की क्रिया के साथ एक ShellExecute करते हैं और लिंक को खोलने के । वैकल्पिक रूप से, आप यूआरएल स्ट्रिंग के अंत में संलग्न के साथ इंटरनेट एक्सप्लोरर (ShellExecute एक बार फिर से उपयोग करते हुए) आह्वान कर सकते हैं (ताकि स्ट्रिंग है कि आप ShellExecute के लिए उपयोग इस प्रकार दिखाई देगा:

System.Diagnostics.Process.Start(@"C:\Program Files\Internet Explorer\iexplore.exe", "http://google.com"); 

आप पोस्ट के बारे में बात कर रहे हैं, हालांकि , आप एक पोस्ट नहीं कर सकते, इसके बाद के संस्करण लाइन एक प्राप्त करता है कैसे वेबसाइट की स्थापना की है पर निर्भर करता है तुम सिर्फ url के अंत पर पैरामीटर संलग्न करना है, तो तरह सक्षम हो सकता है:।

System.Diagnostics.Process.Start(@"C:\Program Files\Internet Explorer\iexplore.exe", "http://www.google.com/search?q=bing"); 
+1

क्या यादृच्छिक डाउनवॉटर बिना किसी स्पष्टीकरण के वोटिंग चीजों के आसपास जा रहा है? – slugster

+1

गैर-टिप्पणी करने के लिए यादृच्छिक डाउनवॉटर – ryber

2

आप कर रहे हैं निश्चित रूप से प्रक्रिया शुरू करने की आवश्यकता होगी। आईई शुरू करने के लिए स्टार्ट (या ProcessInfo का उपयोग करें): इस तरह:

// खुला आईई एक WinForm

internal static string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory); 

private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) 
{ 
    System.Diagnostics.Process.Start("IExplore.exe", desktopPath + "\\someHTMLFile.htm"); 
} 

तो आप इस पेज में नीचे स्क्रॉल, तो पर एक LinkLabel क्लिक करने का एक परिणाम के रूप में डेस्कटॉप पर एक फ़ाइल में:

http://msdn.microsoft.com/en-us/library/system.diagnostics.process.start(VS.80).aspx

(प्रक्रिया। फ्रेमवर्क 3 के लिए दस्तावेज़ प्रारंभ करें।0)

आपको उपयोगकर्ता को प्रोसेसइन्फो का उपयोग करने का उदाहरण दिया जाएगा ताकि यह नियंत्रित किया जा सके कि IE के एक से अधिक उदाहरण शुरू हो गए हैं, और आईई को कमांड लाइन तर्क कैसे पास करें।

यह पृष्ठ:

http://msdn.microsoft.com/en-us/library/0w4h05yb.aspx

(फ्रेमवर्क 3.5 के लिए Process.Start दस्तावेज़)

आप IE शुरू करने, और कैसे तर्क के रूप में यूआरएल फ़ाइलों पारित करने के लिए की एक पूरी उदाहरण दिखाता है।

मैं आपके संदेश में "पोस्ट" से क्या मतलब है (मैं "पोस्ट" को एएसपी.नेट के साथ जोड़ता हूं) पर पूरी तरह से स्पष्ट नहीं हूं, लेकिन आप जो भी पसंद करते हैं उसके साथ एक अस्थायी स्थान में एक HTML फ़ाइल लिख सकते हैं जब आप उपरोक्त दस्तावेज तकनीकों का उपयोग करके आईई लॉन्च करते हैं, तब उसे उस फ़ाइल का पता पास करें। सर्वोत्तम,

+0

"पोस्ट" करके उसका मतलब है कि HTTP में सर्वर को डेटा जमा करने के लिए POST विधि का अर्थ है। यहां अनुभाग 9.5 देखें: http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html। योंगमेई का मुद्दा यह है कि चीजें करने की प्रक्रिया। स्टार्ट (यूआरएल) तरीका जीईटी विधि (धारा 9.3 वहां) का उपयोग करता है जो कम सुरक्षित है। – urig

1

आप प्रक्रिया में यूआरएल भेजकर प्रक्रिया शुरू कर सकते हैं। पैरामीटर के रूप में शुरू करें। सिंक्रनाइज़ेशन संदर्भ के कारण WebForms GUI थ्रेड से StartProcess को कॉल करते समय एक समस्या है। मेरा समाधान इस उद्देश्य के लिए थ्रेड पूल का उपयोग करता है। इस समाधान का लाभ यह है कि एक यूआरएल उपयोगकर्ता पसंदीदा वेब ब्राउज़र में खोला जाता है कि IE, फ़ायरफ़ॉक्स आदि हो सकता है

[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", 
    "CA1725:ParameterNamesShouldMatchBaseDeclaration", MessageId = "0#"), 
System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes")] 
public void OpenUrl(string urlString) 
{ 
    try 
    { 
    ThreadPool.QueueUserWorkItem(delegate { StartProcess(urlString, null); }); 
    } 
    catch (Exception ex) 
    { 
    log.Error("Exception during opening Url (thread staring): ", ex); 
    //do nothing 
    } 
} 

[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes")] 
public void StartProcess(string processName, string arguments) 
{ 
    try 
    { 
    Process process = new Process(); 
    process.StartInfo.FileName = processName; 
    if (!string.IsNullOrEmpty(arguments)) 
    { 
     process.StartInfo.Arguments = arguments; 
    } 
    process.StartInfo.CreateNoWindow = false; 
    process.StartInfo.UseShellExecute = true; 
    process.Start(); 
    } 
    catch (Exception ex) 
    { 
    log.ErrorFormat("Exception in StartProcess: process: [{0}], argument:[{1}], exception:{2}" 
        , processName, arguments, ex); 
    } 
} 
1

, आप एक ब्राउज़र

इस उदाहरण से पता चलता है खोलने के लिए नेट प्रतिबिंब का उपयोग कर सकते आप InternetExplorer.Aplication

के कुछ विशिष्ट विशेषताओं को सेट करने के लिए कैसे करें, उदाहरण के लिए, मुझे पता बार को बंद करने और ऊंचाई और चौड़ाई सेट करने में सक्षम होना आवश्यक है। आईई और अन्य ब्राउज़र सुरक्षा आपको अन्य उदाहरणों में पता बार को बंद करने की अनुमति नहीं देती है

हमारी साइट एक आंतरिक एमवीसी एप्लिकेशन है और कोई समस्या नहीं है।

System.Type oType = System.Type.GetTypeFromProgID("InternetExplorer.Application"); 
object IE = System.Activator.CreateInstance(oType); 

IE.GetType().InvokeMember("menubar", System.Reflection.BindingFlags.SetProperty, null, IE, new object[] { 0 }); 
IE.GetType().InvokeMember("toolbar", System.Reflection.BindingFlags.SetProperty, null, IE, new object[] { 0 }); 
IE.GetType().InvokeMember("statusBar", System.Reflection.BindingFlags.SetProperty, null, IE, new object[] { 0 }); 
IE.GetType().InvokeMember("addressbar", System.Reflection.BindingFlags.SetProperty, null, IE, new object[] { 0 }); 
IE.GetType().InvokeMember("Visible", System.Reflection.BindingFlags.SetProperty, null, IE, new object[] { true }); 
IE.GetType().InvokeMember("Height", System.Reflection.BindingFlags.SetProperty, null, IE, new object[] { 680 }); 
IE.GetType().InvokeMember("Width", System.Reflection.BindingFlags.SetProperty, null, IE, new object[] { 1030 }); 
IE.GetType().InvokeMember("Navigate", System.Reflection.BindingFlags.InvokeMethod, null, IE, new object[] { "http://yoursite" }); 

यहां केवल एक ही दोष यह है कि यह आईई विशेष रूप से खोल रहा है। प्लस यह है कि यह आपको ब्राउज़र पर अधिक नियंत्रण देता है।

आपके पास InternetExplorer.Aplication ऑब्जेक्ट की घटनाओं, विधियों और गुणों तक पहुंच है।

https://msdn.microsoft.com/en-us/library/aa752084(v=vs.85).aspx

मुझे आशा है कि किसी और के रूप में यह मेरे लिए किया था मदद करता है।

मैं घटनाओं के लिए बाध्यकारी पर काम कर रहा हूं और परीक्षण के बाद इसे अपडेट कर दूंगा।

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