2009-06-10 5 views
33

मेरे सी # एप्लिकेशन में मैं एक संदर्भ मेनू प्रदर्शित करना चाहता हूं, लेकिन यदि संदर्भ में SHIFT कुंजी को दबाया जा रहा है तो मैं मेनू में विशेष विकल्प जोड़ना चाहता हूं मेनू खोला गया हैसी # - यह पता लगाना कि कोई संदर्भ मेनू खोलते समय SHIFT कुंजी आयोजित की जाती है

मैं वर्तमान में SHIFT कुंजी की जांच के लिए GetKeyState API का उपयोग कर रहा हूं। यह मेरे कंप्यूटर पर ठीक काम करता है लेकिन गैर-अंग्रेजी विंडोज़ वाले उपयोगकर्ता कहते हैं कि यह उनके लिए बिल्कुल काम नहीं करता है।

मैंने यह भी पढ़ा कि Win32 API में जब कोई संदर्भ मेनू खोला जाता है तो मेनू में इंगित एक ध्वज EXTENDEDVERBS दिखाना चाहिए। Opening ईवेंट के लिए सी # EventArgs में EXTENDEDVERBS या किसी भी संशोधक कुंजी दबाए जाने वाले एक प्रॉपर्टी (जो मैं बता सकता हूं) में शामिल नहीं है।

// SHIFT KEY is being held down 
if (Convert.ToBoolean(GetKeyState(0x10) & 0x1000)) 
{ 
    _menuStrip.Items.Add(new ToolStripSeparator()); 

    ToolStripMenuItem log = new ToolStripMenuItem("Enable Debug Logging"); 
    log.Click += new EventHandler(log_Click); 
    log.Checked = Settings.Setting.EnableDebugLogging; 
    _menuStrip.Items.Add(log); 
} 

तो GetKeyState यह ऐसा करने का सही तरीका नहीं है, मेरे कोड को ठीक से दबाया जा रहा SHIFT कुंजी का पता लगाने है:

यहाँ कोड मैं अब "Opening" घटना के अंदर उपयोग कर रहा हूँ है?

उत्तर

60

आप यह निर्धारित करने के लिए ModifierKeys static property पर नियंत्रण कर सकते हैं कि शिफ्ट कुंजी आयोजित की जा रही है या नहीं।

if (Control.ModifierKeys == Keys.Shift) { 
    ... 
} 

यह एक झंडा शैली enum तो अपनी स्थिति पर निर्भर करता है कि आप और अधिक कठोर परीक्षण करना चाहते हो सकता है है।

यह भी ध्यान दें कि यह देखने के लिए जांच करेगा कि क्या आप मूल्य की जांच करते समय Shift कुंजी आयोजित की जाती है या नहीं। वह क्षण नहीं जब मेनू खुला था। यह आपके आवेदन के लिए महत्वपूर्ण अंतर नहीं हो सकता है लेकिन यह ध्यान देने योग्य है।

+0

, मेरे कोड में ContextMenu के माता-पिता एक UserControl है और ModifierKeys संपत्ति या तो UserContr लिए उपलब्ध नहीं है ओएल या ContextMenu ऑब्जेक्ट के लिए। –

+0

@ क्रिस - जैसा कि जेरेड कहते हैं कि यह स्थिर है। मैंने msdn –

+0

के लिंक के साथ अपना उत्तर अपडेट किया मैंने इसे नोटिस नहीं किया। मैं सोच रहा था कि यह एक उदाहरण संपत्ति थी। मैं इसका परीक्षण करूंगा। –

37

इस का प्रयोग करें पता लगाने के लिए अगर shift कुंजी दबाया जाता है:

if ((Control.ModifierKeys & Keys.Shift) == Keys.Shift) 
+0

जब तक मैंने यह जवाब टाइप किया, तब तक जेरेड ने इसे पहले ही पोस्ट कर दिया था। डुप्लिकेट के लिए खेद है। – bobbyalex

+0

क्रिस सही है। यदि आप UserControl का उपयोग कर रहे हैं, भले ही संपत्ति आपके लिए उपलब्ध होनी चाहिए। – bobbyalex

+11

यह जांचता है कि Shift कुंजी दबाया गया है, जो मूल प्रश्न चाहता था। दूसरा उत्तर जांचता है कि केवल Shift कुंजी दबाया जाता है। – adzm

3

Silverlight में, कम से कम नवीनतम संस्करण में, आप का उपयोग करना चाहिए:

if(Keyboard.Modifiers == ModifierKeys.Shift) { 
    ... 
} 
12

यह वास्तव में बहुत कि के किसी भी तुलना में आसान है

  if(Keyboard.IsKeyDown(Key.LeftCtrl) || 
       Keyboard.IsKeyDown(Key.RightCtrl) || 
       Keyboard.IsKeyDown(Key.LeftAlt) || 
       Keyboard.IsKeyDown(Key.RightAlt) || 
       Keyboard.IsKeyDown(Key.LeftShift) || 
       Keyboard.IsKeyDown(Key.RightShift)) 
      { 
       /** do something */ 
      } 

बस सुनिश्चित करें कि अपनी परियोजना का संदर्भ PresentationCore और WindowsBase बनाने

2

Keyboard.Modifiers वास्तविक WPF परियोजनाओं के साथ भी काम करता है!
इसके अलावा मैं Keyboard.GetKeyStates पर इसका उपयोग करने की अनुशंसा करता हूं क्योंकि बाद में उपयोग ट्रिगरिंग और वास्तविक कुंजी स्थिति को प्रतिबिंबित नहीं कर सकता है।

भी ध्यान रखें कि यह केवल ट्रिगर किया जाएगा होगा अगर पारी संशोधक कुंजी नीचे है और कुछ नहीं:

if(Keyboard.Modifiers == ModifierKeys.Shift) 
{ ... } 

तुम सिर्फ अगर पारी कुंजी दबाए है पता लगाने के लिए चाहते हैं, तो एक और संशोधक है कि क्या कुंजी या दबाया नहीं है, यह एक का उपयोग करें: दुर्भाग्य से

if((Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift) 
{ ... }