2009-04-20 12 views
11

मैं सी # के साथ काम कर रहा हूं, मुझे इसकी प्रक्रिया आईडी द्वारा एक्सेल का एक विशिष्ट उदाहरण प्राप्त करने की आवश्यकता है; मुझे उस उदाहरण की प्रक्रिया आईडी मिलती है जिसे मुझे किसी अन्य एप्लिकेशन से चाहिए, लेकिन मुझे नहीं पता कि और क्या करना है, मुझे नहीं पता कि मैं अपनी प्रक्रिया आईडी को एक्सेल के चल रहे उदाहरण कैसे प्राप्त कर सकता हूं।प्रोसेस आईडी का उपयोग कर एक्सेल इंस्टेंस या एक्सेल इंस्टेंस सीएलएसआईडी कैसे प्राप्त करें?

मैंने वेब पर बहुत कुछ शोध किया है, लेकिन मैंने केवल मार्शल.गेटएक्टिव ऑब्जेक्ट (...) या मार्शल का उपयोग करने के उदाहरण देखे हैं। बाइंडोमोनीकर (...), जिसे मैं पहले एक रिटर्न के बाद उपयोग नहीं कर सकता आरओटी में पंजीकृत पहला एक्सेल इंस्टेंस और सटीक रूप से जिसकी मुझे आवश्यकता नहीं है, और दूसरी बात यह है कि आप उदाहरण प्राप्त करने से पहले एक्सेल फ़ाइल को सहेज लें।

इसके अलावा, अगर मैं कहाँ, एक्सेल उदाहरण है कि मैं जरूरत के CLSID प्राप्त करने के लिए प्रक्रिया आईडी का उपयोग कर में सक्षम हो, तो मैं फोन करने के लिए सक्षम हो सकता है

GetActiveObject(ref _guid, _ptr, out objApp);

है कि अंततः एक्सेल उदाहरण वापस आ जाएगी कि मैं जरुरत।

+0

तुम मुझे एक नमूना कैसे अपने त्वरित जवाब के लिए GetActiveObject विधि – Higune

उत्तर

12

एक बार जब आप प्रक्रिया आईडी के माध्यम से प्रक्रिया की पहचान कर लेंगे, तो आप Process.MainWindowHandle प्राप्त कर सकते हैं और उसके बाद उस प्रक्रिया के लिए Excel ऑब्जेक्ट मॉडल तक पहुंच प्राप्त करने के लिए AccessibleObjectFromWindow API के साथ इसका उपयोग कर सकते हैं।

एंड्रयू व्हाइटचैपल द्वारा आलेख Getting the Application Object in a Shimmed Automation Add-in लेख इस नमूना कोड के साथ विस्तार से वर्णन करता है।

आप के लिए है कि लेख में कुंजी कोड लाइन में शुरू होता है:

int hwnd = (int)Process.GetCurrentProcess().MainWindowHandle 

अपने मामले में कौन सा अधिक लग सकती है:

int excelId = 1234; // Change as appropriate! 
int hwnd = (int)Process.GetProcessById(excelId).MainWindowHandle 

जहां 'excelId' प्रक्रिया आईडी नंबर है आप की तलाश में है अन्यथा, कोड अनिवार्य रूप से लेख में दिए गए जैसा होना चाहिए। (इस तथ्य को अनदेखा करें कि उसका कोड ऐड-इन के लिए लिखा गया है; वह पहलू आपकी आवश्यकताओं को प्रभावित नहीं करेगा, इसलिए इसे अनदेखा करें।)

यदि आपके पास प्रक्रिया आईडी नहीं है, तो आप चाहेंगे Process.GetProcessesByName का उपयोग करें, जिससे आप प्रत्येक को गिन सकते हैं और आवश्यकतानुसार ऑब्जेक्ट मॉडल तक पहुंच के साथ प्रत्येक एक्सेल इंस्टेंस का नियंत्रण ले सकते हैं।

आशा इस मदद करता है,

माइक

+0

धन्यवाद, यह वही था जो मैं देख रहा था। – Vic

+0

कोई समस्या नहीं, विक, खुशी है कि यह आपके लिए काम करता है। यह एक आसान मुद्दा नहीं है और यह अच्छी तरह से ज्ञात नहीं है, लेकिन एंड्रयू व्हाइटचैपल के लेख में यह वास्तव में अच्छी तरह से शामिल है। सौभाग्य! –

+1

आलेख नीचे है, लेकिन यहां मुझे प्राप्त कोड का पेस्टबिन है http://pastebin.com/F7gkrAST –

-3
using System.Diagnostics; 

    var eProcess = from p in Process.GetProcessesByName("EXCEL") 
        where p.Id == 3700 //whatever Id you have... 
        select p; 

    foreach (var process in eProcess) 
     process.Kill(); 

यह "एक्सेल" नामक सभी प्रक्रियाओं को प्राप्त करता है जहां प्रोसेस आईडी एक विशिष्ट मान के बराबर होती है।

+1

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

2

आरओटी प्रविष्टियों को सीएलएसआईडी के साथ टैग नहीं किया गया है। आरओटी रजिस्टर से एक डीडब्ल्यूओआर देता है, जिसका उपयोग अनियंत्रक के लिए पहचानकर्ता के रूप में किया जाता है। मैंने पहले इस समस्या में भाग लिया है और मैंने हल किया है कि एकमात्र तरीका यह है कि प्रत्येक एक्सेल में कुछ प्रकार का ऐड-इन लोड किया गया है जिसे आप सीधे संवाद कर सकते हैं।

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