2009-09-18 13 views
5

के तहत प्रक्रिया का स्क्रीनशॉट हमें विंडोज़ सेवा से एक प्रक्रिया चलाना है और इससे स्क्रीनशॉट प्राप्त करना है।विंडोज सेवा

हमने बिटबल्ट और प्रिंटविंडो Win32 कॉल की कोशिश की, लेकिन दोनों खाली (काला) बिटमैप्स देते हैं।

यदि हम सामान्य कोड प्रक्रिया से अपना कोड चलाते हैं, तो यह ठीक काम करता है।

क्या यह कुछ भी संभव है? या कोशिश करने के लिए एक और तरीका हो सकता है?

बातें हम कोशिश की:

  1. Windows सेवा स्थानीय सिस्टम के रूप में चल रहा है, प्रक्रिया चलाता है के रूप में स्थानीय सिस्टम -> स्क्रीनशॉट विफल रहता है
  2. Windows सेवा प्रशासक के रूप में चल रहा है, प्रशासक के रूप में प्रक्रिया चलाता है -> स्क्रीनशॉट विफल रहता है।
  3. उपयोगकर्ता XYZ के रूप में चल रहे विंडोज एप्लिकेशन, XYZ के रूप में एक प्रक्रिया चलाता है -> स्क्रीनशॉट बिटबल्ट या प्रिंटविंडो दोनों के साथ काम करता है।
  4. जाँच स्थानीय सिस्टम से

हमने यह भी देखा है कि PrintWindow हमारे मामले के लिए बेहतर काम करता है "सेवा डेस्कटॉप के साथ बातचीत करने की अनुमति दें" की कोशिश की, यह काम करता है, तो खिड़की अन्य विंडो के पीछे है।

अन्य आवश्यकताओं के लिए, माता-पिता और बाल प्रक्रिया दोनों एक ही उपयोगकर्ता के अधीन होनी चाहिए। हम वास्तव में एक प्रक्रिया से दूसरे प्रक्रिया में प्रतिरूपण का उपयोग नहीं कर सकते हैं।

+1

क्या आपने सेवा को डेस्कटॉप से ​​बातचीत करने की अनुमति देने का प्रयास किया था? –

+0

बहुत अच्छा विचार है, लेकिन यह या तो काम नहीं किया। मुझे यह भी लगता है कि जब मैं इसे प्रशासक उपयोगकर्ता के रूप में चलाता था, तो यह करने के बराबर था। आप उपयोगकर्ता कंसोल से "डेस्कटॉप के साथ बातचीत करने की अनुमति" की जांच नहीं कर सकते हैं - यह अक्षम है। – jonathanpeppers

+0

खोज रहे हैं, यह भी देखें [सर्वर डेस्कटॉप सत्र पर स्क्रीन कैप्चर करें] (http://stackoverflow.com/questions/5200341/capture-screen-on-server-desktop-session/12851218) – Theraot

उत्तर

3

मुझे नहीं लगता कि यह संभव है।

हमें अपने परिदृश्य को बदलना पड़ा जहां हमारा आवेदन किसी सेवा से शुरू नहीं हुआ था, लेकिन एक मानक विंडोज प्रोग्राम था जिसमें कोने में एक नोटिफ़िकॉन था।

अगर किसी को अभी भी एक वास्तविक उत्तर मिल गया है, तो मुझे बताएं।

3

क्या आपने "डेस्कटॉप से ​​बातचीत करने की अनुमति दें" के साथ स्थानीय सिस्टम के रूप में चलाने की कोशिश की है?

+0

+1 - यह एक अच्छा विचार है अगर यह काम करता है। यह निश्चित रूप से एकमात्र समाधान है जिसे मैं सोच सकता हूं। – David

+0

उपरोक्त टिप्पणी देखें। – jonathanpeppers

-1

यह साथ स्थानीय सिस्टम का उपयोग कर काम करता है "डेस्कटॉप के साथ बातचीत करने के लिए सेवा की अनुमति दें"

आप इसे प्रोग्राम के इस नमूना कोड का उपयोग कर सेट कर सकते हैं:

http://www.vbforums.com/showthread.php?t=367177 (यह vb.net लेकिन बहुत सरल)

+0

यह केवल एक्सपी पर काम करता है। Vista या 7 पर नहीं। और XP पर इसके दो दोष हैं: 1. यदि आप इसे सक्षम करते हैं तो आप अपनी सेवा के भीतर नेटवर्क कनेक्शन बनाकर समस्याओं में भाग ले सकते हैं। 2. यह केवल लॉग इन किए गए पहले उपयोगकर्ता के डेस्कटॉप पर दिखाई देगा। यदि आप दूसरे उपयोगकर्ता को तेज़ स्विच करते हैं तो आपको कुछ भी दिखाई नहीं देगा। – Oliver

+0

विज्ञापन 1 नेटवर्क कनेक्शन? स्क्रीनशॉट बनाकर? विज्ञापन 2 हां आप सही हैं, सत्र 0 अलगाव के कारण यह Vista/7 में काम नहीं करता है – ufoq

6

वर्तमान में मुझे संबंधित लिंक नहीं मिल रहे हैं, लेकिन समस्या यह है कि एक सामान्य सेवा अनुप्रयोग की तुलना में एक विंडोज सेवा दूसरे सत्र में चलता है।

XP में यह पूरी तरह से सच नहीं था। यहां सत्र 0 में शुरू की गई सभी सेवाएं दी गई हैं और सिस्टम में लॉग इन करने वाले पहले उपयोगकर्ता सत्र 0 में भी चलेंगे। इसलिए उस स्थिति में, जैसे चालें डेस्कटॉप कार्य के साथ बातचीत करने की अनुमति दें। लेकिन यदि आप किसी अन्य उपयोगकर्ता को तेज़ी से स्विच करते हैं तो उसे सत्र 1 मिलता है और उसे सीधे सेवा से बातचीत करने का कोई मौका नहीं है। यह भी सच है यदि आप आरडीपी से सर्वर संस्करण (जैसे 2003 या 2008) से कनेक्ट होते हैं। ये लॉग इन 0 से अधिक सत्र में भी शुरू होंगे।

इतना ही नहीं बल्कि वहाँ डेस्कटॉप के साथ बातचीत का उपयोग करके एक और खामी है:
आप इस विकल्प को सक्षम और आपकी सेवा (डिफ़ॉल्ट) प्रणाली खाते के अंतर्गत चल रहा है, तो यह एक नेटवर्क कनेक्शन बनाने के लिए सक्षम नहीं होगा अब और।

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