2010-02-01 9 views
8

लघु संस्करण: मुझे लगता है कि मुझे बॉलून टूलटिप आइकन से छुटकारा पाने के लिए Windows संदेश के परिणामस्वरूप बुलाए जाने वाले PowerShell में ईवेंट का उपयोग करके ठीक से मदद करने की ज़रूरत है। मुझे लगता है कि मुझे एक शक्तिशाली बॉलून टूलटिप प्रदर्शित करना है।PowerShell

लांग संस्करण:

मैं एक लंबे समय से चल PowerShell आदेश (निर्माण) है कि मैं चाहते हैं सूचना भेजता है जब यह सिस्टम ट्रे/सूचना क्षेत्र में एक गुब्बारा टूलटिप के माध्यम से पूरा करता है।

मैं एक लिखित-बुलूनटिप स्क्रिप्ट (नीचे) बनाने में सक्षम था जो लगभग वही करता है जो मैं चाहता हूं। एकमात्र समस्या यह है कि, as sometimes happens with tray icons, ट्रे आइकन तब तक गायब नहीं होता जब तक कि मैं उस पर माउस नहीं डालता। NotifyIcon का प्रतिनिधित्व करने के लिए एक ही वैश्विक चर का पुनः उपयोग करके, मैं इस स्क्रिप्ट का पुन: उपयोग करने में सक्षम हूं और इसे रखता हूं ताकि केवल एक सिस्टम ट्रे आइकन बना रहता है (जब तक कि मैं उस पर माउस न हो)। यह अभी भी एक हैक की तरह लगता है। मैंने एक ईवेंट हैंडलर जोड़ने की कोशिश की ताकि इसे BalloonTipClosed ईवेंट पर अधिसूचित किया जा सके और फिर वहां इसका निपटान किया जा सके। इवेंट हैंडलर में, मैंने उन सभी तीन तकनीकों को आजमाया जो मैंने देखा है, जो कि लिंगरिंग आइकन से छुटकारा पाने के लिए सुझाए गए हैं।

कष्टप्रद हिस्सा यह है कि एक साधारण .Dispose स्क्रिप्ट के बाद की कॉल पर काम करता प्रतीत होता है, जिससे मुझे लगता है कि ईवेंट स्क्रिप्ट ब्लॉक बिल्कुल नहीं कहा जा रहा है।

मैंने सत्यापित किया है कि टिप के बाद बुलून टिपक्लोज्ड को अलग-अलग WinForms ऐप में फेंकने के बाद बुलाया जाता है।

क्या मुझे कुछ बुनियादी याद आ रही है? किसी भी प्रकार की मदद की बेहद सराहना की जाती है। धन्यवाद!

param 
(
    $text, 
    $title = "", 
    $icon = "Info", 
    $timeout=15000 
) 

[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") | out-null 
[System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") | out-null 

if ($global:writeBalloonTipIcon) 
{ 
    # This gets rid of the previous one 
    $global:writeBalloonTipIcon.Dispose() 
} 

$global:writeBalloonTipIcon = new-object System.Windows.Forms.NotifyIcon 
$global:writeBalloonTipIcon.Icon = [System.Drawing.SystemIcons]::Information 

# FIXME: This *should* cleanup the icon after it's done, but it doesn't seem to work 
$global:writeBalloonTipIcon.add_BalloonTipClosed(
    { 
    # this *should* work, but it's not. What am I missing? 
    $global:writeBalloonTipIcon.Icon = $null; 
    $global:writeBalloonTipIcon.Visible = $false; 
    $global:writeBalloonTipIcon.Dispose(); 
    }); 

$global:writeBalloonTipIcon.Visible = $true; 
$global:writeBalloonTipIcon.ShowBalloonTip($timeout, $title, $text, $icon); 
+0

शायद थोड़ा सा ऑफटॉपिक, लेकिन मुझे विंडोज के लिए बहुत उपयोगी ग्रोल मिला। जयकुल ने एक पुस्तकालय लिखा जो कार्यक्षमता को लपेटता है। एक प्लगइन भी है जो आपको सूचित करता है जब आपका निर्माण/पुनर्निर्माण खत्म हो जाता है। आप इसे यहां पा सकते हैं: http://huddledmasses.org/more-growl-for-windows-from-powershell/ (मुझे नहीं पता कि यह नवीनतम संस्करण है) – stej

+0

क्या आपने इसे हल किया है? – stej

+0

वास्तव में, कोई त्वरित समाधान नहीं था, इसलिए हम केवल एक वैश्विक आइकन रीसाइक्लिंग करते रहते हैं। यह एक उचित कामकाज है जब तक हम एसटीए मुद्दे को संभालने से वास्तव में इसे ठीक करने के लिए प्रेरित नहीं हो जाते। –

उत्तर

2

मुझे लगता है कि आप एक जाँच धागा में इस कोड को निष्पादित करने के लिए की जरूरत है:

यहाँ "राइट-BalloonTip.ps1" के लिए कोड है। PowerShell (v2 यहाँ दिखाया गया है) एक MTA थ्रेड में डिफ़ॉल्ट रूप से कार्यान्वित:

PS U:\> [System.Threading.Thread]::CurrentThread 


ManagedThreadId : 5 
ExecutionContext : System.Threading.ExecutionContext 
Priority   : Normal 
IsAlive   : True 
IsThreadPoolThread : False 
IsBackground  : False 
ThreadState  : Running 
ApartmentState  : MTA 
CurrentUICulture : en-US 
CurrentCulture  : en-US 
Name    : Pipeline Execution Thread 
+0

मुझे लगता है कि यह समस्या के मूल के करीब आ रहा है क्योंकि ऐसा लगता है कि अधिसूचना घटना विंडोज संदेश के माध्यम से भेजी जा रही है। इस बारे में कोई विचार सही तरीके से कैसे करें? ऐसा लगता है कि एक Invoke-Apartment काम करना चाहिए, लेकिन मैं इसे काम करने के लिए काफी नहीं मिल सकता है। –

1

मैं रजिस्टर-ObjectEvent का उपयोग कर BalloonTipClosed घटना की सदस्यता के लिए सिफारिश करेंगे। यह हाल ही में another SO post में आया था। इसकी जांच - पड़ताल करें।

+1

मुझे लगता है कि समस्या का मूल एसटीए मुद्दा है क्योंकि घटना तब तक नहीं उठाई जा रही है जब तक यह एसटीए थ्रेड पर न हो। –

+0

जेआईटी डीबगर रिपोर्ट करता है "System.Management.Automation.PSInvalidOperationException: इस थ्रेड में स्क्रिप्ट चलाने के लिए कोई रनस्पेस उपलब्ध नहीं है। आप सिस्टम की डिफॉल्ट रुनस्पेस प्रॉपर्टी में एक प्रदान कर सकते हैं। प्रबंधन। ऑटॉमेशन। रुनस्पेस। रनस्पेस टाइप" BallonTipClosed पर घटना तो घटना उठाई जा रही है। आप पीएस में रनस्पेस बना सकते हैं लेकिन रजिस्टर-ऑब्जेक्टवेन्ट का उपयोग करना काफी तेज़ है – Monso