2016-01-26 13 views
5

मेरी बड़ी तस्वीर समस्या: मुझे एक ही ओएस इंस्टेंस/मशीन पर एक यूडब्ल्यूपी एक्सएएमएल एमवीवीएम ऐप पर एक विंडोज 10 डेस्कटॉप ऐप (या एक सेवा, वास्तव में) से एक सिग्नल भेजने की आवश्यकता है।यूडब्ल्यूपी एक्सएएमएल एमवीवीएम ऐप पर सबसे सरल विंडोज संदेश कैसे प्राप्त करें?

मैं वैश्विक नामस्थान में नामित सेमफोर का उपयोग कर रहा था, लेकिन ये यूडब्ल्यूपी (डिज़ाइन द्वारा, सुरक्षा कारणों से शायद) पर बिल्कुल काम नहीं करते हैं। कोई आनंद नहीं है।

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

ठीक है, तो मैं ओएस पर विशिष्ट विंडो करने के लिए Windows संदेश भेजने के साथ छोड़ दिया हूँ ...

मेरा परीक्षण एप्लिकेशन GitHub पर UWP के लिए AdventureWorks नमूना है। मैं इसे एक अलग प्रक्रिया से भेजे गए एक विंडोज संदेश को संभालने के लिए कैसे प्राप्त करूं? मैं उलझन में हूं।

नीचे मेरा परीक्षण क्लाइंट कोड है।

प्रश्न: मैं एडवेंचरवर्क्स में इस संदेश को कैसे संभाल सकता हूं? कोड परिवर्तन को न्यूनतम में रखना महत्वपूर्ण है, लेकिन वर्तमान में मैं अटक गया हूं और आगे बढ़ने का कोई विचार नहीं है। (यह एक कसकर आयोजित रहस्य है ...)

कृपया मदद करें! नमूना कोड कृपया।

class Program 
{ 
    [DllImport("user32.dll")] 
    public static extern IntPtr FindWindow(string lpClassName, String lpWindowName); 

    [DllImport("user32.dll")] 
    public static extern int SendMessage(IntPtr hWnd, uint wMsg, IntPtr wParam, IntPtr lParam); 

    [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] 
    static extern uint RegisterWindowMessage(string lpString); 

    [DllImport("kernel32.dll")] 
    static extern uint GetLastError(); 

    static void Main(string[] args) 
    { 
     const string lpClassName = "ApplicationFrameWindow"; 
     const string lpWindowName = "AdventureWorks.Shopper"; 
     IntPtr hwnd = FindWindow(lpClassName, lpWindowName); 

     uint messageId = RegisterWindowMessage("MetaAutomationMessage"); 


     int sendMessageResult = SendMessage(hwnd, messageId, IntPtr.Zero, IntPtr.Zero); 
     Console.WriteLine(string.Format("Message result is '{0}', ", sendMessageResult)); 

     uint lastError = GetLastError(); 
     Console.WriteLine(string.Format("GetLastError result is '{0}', ", lastError)); 
    } 
} 
+0

के संबंध में "।?। की कोशिश की UWP सॉकेट, और इस श्रोता केवल अगर ग्राहक एक दूरस्थ मशीन पर है के रूप में UWP साथ काम करता है यह एक सुरक्षा डिजाइन निर्णय भी कोई विचार है" , क्या आपने सोचा है कि यह काम नहीं कर सकता है क्योंकि पैकेज मैनिफेस्ट में "निजी नेटवर्क (क्लाइंट और सर्वर)" क्षमता सक्षम नहीं थी? – Saxar

+0

मैं जीत 10 ऐप के साथ-साथ यूवीपी ऐप पर भी उलझन में हूं, आप अन्य ऐप को प्रसारण/सिग्नल करने के लिए सिग्नलर को कार्यान्वित कर सकते हैं। –

उत्तर

1

UWP एप्लिकेशन सैंडबॉक्स है, तो आप एक Win32 अनुप्रयोग के लिए डिजाइन द्वारा भेज सकते हैं नहीं या संदेश प्राप्त, आदि

कुछ संभावित संभावित वांछनीय विकल्प हैं जैसे स्थानीय सॉकेट पर लूपबैक संचार सक्षम करना: https://stackoverflow.com/a/33263253/95190 (जो शायद आपने कोशिश की है - यह स्पष्ट नहीं है)।

हालांकि यदि आप स्थानीय रूप से स्थापित सेवा से अपने सार्वभौमिक ऐप में संवाद करने की आवश्यकता है तो एक यूडब्ल्यूपी ऐप आज सबसे अच्छा प्लेटफ़ॉर्म विकल्प नहीं हो सकता है।

ऐप लॉन्च करने और लॉन्च के हिस्से के रूप में कुछ डेटा प्रदान करने के कुछ तरीके हैं, लेकिन Win32 सेवा को इंटरैक्टिव उपयोगकर्ता प्रक्रियाएं लॉन्च नहीं करनी चाहिए (इसलिए, यह डेटा पास करने का एक अच्छा तरीका नहीं होगा)।

यदि आप Win32 ऐप/सेवा के साथ संचार की आवश्यकता है तो आप अपने ऐप को WPF ऐप के रूप में बनाने पर विचार करना चाहेंगे।

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