2010-05-15 11 views
5

मुझे एक सी # Winforms एप्लिकेशन मिला है जो पृष्ठभूमि में चलता है, हॉटकी को दबाया जाता है। जब एक हॉटकी दबाया जाता है, तो मेरा फॉर्म एक संक्षिप्त रूप बनाता है। फ़ॉर्म हमेशा चल रहा है, लेकिन जब तक मुझे हॉटकी इवेंट प्राप्त नहीं होता तब तक छुपाएं सेट करें, जिस समय मैंने दृश्यमान संपत्ति को सही पर सेट किया था। कोड इस तरह दिखता है:जब मैं दृश्य को सही तरीके से सेट करता हूं तो फोकस चोरी करने से मेरे सी # Winforms एप्लिकेशन को कैसे रोकें?

void hook_volumeDown(object sender, KeyPressedEventArgs e) 
{ 
    this.Visible = true; 
} 

यह ध्यान दिया जाना चाहिए कि इस फ़ॉर्म की शीर्ष संपत्ति सत्य पर सेट है।

वास्तव में अजीब हिस्सा है, मेरे सी # ऐप ने किसी अन्य एप्लिकेशन से फ़ोकस चुरा लिया है, यह फिर से ऐसा नहीं करेगा। उदाहरण के लिए: मैं अपना ऐप लॉन्च करता हूं, फिर टीम फोर्ट्रेस 2 जैसे कुछ फुलस्क्रिप ऐप लॉन्च करता हूं। फिर मैं अपनी हॉटकी दबाता हूं। टीम किले 2 कम करता है, और मैं अपना फॉर्म देखता हूं। फिर, हालांकि, मैं टीएफ 2 को पुनर्स्थापित कर सकता हूं, और अपनी हॉटकी को फिर से दबा सकता हूं (वांछित प्रभाव के साथ), और टीएफ 2 केंद्रित रहेगा।

किसी भी दर पर, मैं इसे ठीक करने का एक तरीका ढूंढ रहा हूं। मुझे यहां समान समस्याएं शामिल करने में बहुत सारे प्रश्न मिल गए हैं, लेकिन उनमें से सभी एक नए रूप को बनाने/लॉन्च करने से संबंधित हैं, मौजूदा दृश्य को नहीं बनाते (जब तक कि मुझे कुछ याद नहीं आया)। जब भी मुझे एक की आवश्यकता होती है, तो मैं एक नया रूप बनाने के लिए एप्लिकेशन को फिर से काम कर सकता हूं, लेकिन यह हॉटकी घटनाओं के इंतजार के लिए हर समय अदृश्य होने के लिए एक और रूप बनाने के लिए तैयार होगा, इसलिए मैं इसे छोड़ दूंगा।

कोई विचार?

+0

यकीन नहीं है कि मैं अनुवर्ती हूं ... क्या आप कह रहे हैं कि यह * पहली बार * को छोड़कर * काम करता है? –

उत्तर

6

मुझे लगता है कि आपको समस्या इस तथ्य से संबंधित है कि दृश्यमान = सत्य पहले और बाद की कॉल के बीच अलग-अलग व्यवहार करता है। पहली बार दृश्यमान कहा जाता है और विंडो हैंडल नहीं बनाया गया है, विंडो को CreateWindowEx को कॉल करके बनाया गया है जिसमें कुछ स्टाइल पैरामीटर हैं जो विंडो को व्यवहार करने के तरीके को नियंत्रित करते हैं। मुझे लगता है कि आपको यह सुनिश्चित करने की ज़रूरत है कि विंडो WS_EX_NOACTIVATE शैली के साथ बनाई गई है, जिसे आप CreateParams को ओवरराइड करके कर सकते हैं।

अन्य बातें की कोशिश करने के लिए:

1) ShowWindow समारोह (द्वारा दर्शनीय = सच प्रयुक्त) फोकस पैरामीटर पहली बार यह कहा जाता है (http://msdn.microsoft.com/en-us/library/ms633548%28VS.85%29.aspx) अगर कार्यक्रम एक STARTUPINFO संरचना प्रदान करता है पर ध्यान नहीं देता। परावर्तक में खोदें और पता लगाएं कि फॉर्म क्लास STARTUPINFO संरचना प्रदान करता है और यदि हां, तो इसका उपयोग कैसे करें।

2) फॉर्म में एक शोविथआउट एक्टिवेशन प्रॉपर्टी है जो ओवरराइड और सत्य पर सेट की जा सकती है, क्या आपने इसे ओवरराइड किया है?

"कोई सटीक उत्तर" के लिए खेद है, लेकिन मुझे उम्मीद है कि कम से कम आपको आगे की जांच के लिए कुछ प्रारंभिक अंक मिलेंगे। सौभाग्य।

+1

धन्यवाद, शोविथआउट एक्टिवेशन ओवरराइडिंग एकदम सही समाधान साबित हुआ। कोड की एक पंक्ति और सबकुछ ठीक हो गया है। – Fopedush

+0

ओवरराइडिंग शोविथआउट एक्टिवेशन बदल गया है मेरे लिए भी एकदम सही समाधान है। – beppe9000

1

आपके फ़ंक्शन में उपयोग किए जाने वाले KeyPressedEventArgs को देखकर वास्तव में अजीब लगता है। हॉट कुंजी को PH/RegisterHotKey() API फ़ंक्शन को आमंत्रित करके कार्यान्वित किया जा सकता है। गर्म कुंजी दबाए जाने पर यह आपकी खिड़की पर एक संदेश भेजता है। यहां एक ऐसे फॉर्म का उदाहरण दिया गया है जो स्टार्ट अप पर अदृश्य है, जब आप हॉट कुंजी दबाते हैं तो स्प्रिंग्स ज़िंदा होती है। इस मामले में Ctrl + Alt + यू:

using System; 
using System.Windows.Forms; 
using System.Runtime.InteropServices; 

namespace WindowsFormsApplication1 { 
    public partial class Form1 : Form { 
     private const int MYKEYID = 0; // In case you want to register more than one... 
     public Form1() { 
      InitializeComponent(); 
      this.FormClosing += (s, args) => UnregisterHotKey(this.Handle, MYKEYID); 
     } 
     protected override void SetVisibleCore(bool value) { 
      if (value && !this.IsHandleCreated) { 
       this.CreateHandle(); 
       RegisterHotKey(this.Handle, MYKEYID, MOD_CONTROL + MOD_SHIFT, Keys.U); 
       value = false; 
      } 
      base.SetVisibleCore(value); 
     } 
     protected override void WndProc(ref Message m) { 
      if (m.Msg == WM_HOTKEY && m.WParam.ToInt32() == MYKEYID) { 
       this.Visible = true; 
       if (this.WindowState == FormWindowState.Minimized) 
        this.WindowState = FormWindowState.Normal; 
       SetForegroundWindow(this.Handle); 
      } 
      base.WndProc(ref m); 
     } 
     // P/Invoke declarations 
     private const int WM_HOTKEY = 0x312; 
     private const int MOD_ALT = 1; 
     private const int MOD_CONTROL = 2; 
     private const int MOD_SHIFT = 4; 
     [DllImport("user32.dll")] 
     private static extern int RegisterHotKey(IntPtr hWnd, int id, int modifier, Keys vk); 
     [DllImport("user32.dll")] 
     private static extern bool UnregisterHotKey(IntPtr hWnd, int id); 
     [DllImport("user32.dll")] 
     private static extern bool SetForegroundWindow(IntPtr hWnd); 
    } 
} 

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

+0

आपके उत्तर की पूर्णता के लिए उपरोक्त, हालांकि मैंने इसका प्रयास नहीं किया। मैं हॉटकी के लिए एक रैपर वर्ग का उपयोग कर रहा हूं जो अनिवार्य रूप से वही काम करता है जो आपने दिखाया है, फिर एक घटना को आग लगती है। इस ऐप के प्रयोजन के लिए, यह महत्वपूर्ण है कि टास्कबार प्रविष्टि को दिखाया न जाए, भले ही हॉटकी दबाया जाए। – Fopedush

+0

मैं नहीं देख सकता कि उपयोगकर्ता को सक्रिय करने में सक्षम होने के लिए किसी भी तरह से बिना किसी अग्रभूमि विंडो के पीछे अपनी पॉपअप विंडो खो जाती है। ओह अच्छा। –

+0

सबसे ऊपर सत्य पर सेट है, इसलिए जब तक असामान्य परिस्थितियां (पूर्णस्क्रीन ऐप) न हों, यह दिखाई देगी। विंडो सिस्टम वॉल्यूम के लिए ओएसडी के रूप में कार्य करती है, मेरी हॉटकी इसे बढ़ा/कम/म्यूट करती है। प्रपत्र में यह एक सीमाहीन छोटी चीज है जो वॉल्यूम% दिखाती है और लेबल दिखाती है। – Fopedush

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