2009-12-30 22 views
9

मेरे पास कुछ HTML प्रदर्शित करने वाला वेबब्रोसर नियंत्रण है।
मैं चाहता हूं कि उपयोगकर्ता पूरे दस्तावेज़ की प्रतिलिपि बनाने में सक्षम हो, लेकिन कुछ भी नहीं।वेबब्रोसर कीबोर्ड शॉर्टकट

मैं false को IsWebBrowserContextMenuEnabled और WebBrowserShortcutsEnabled गुण सेट है, और मैं KeyUp संभालने के लिए और जब उपयोगकर्ता प्रेस Ctrl + C कुछ कोड चलाना चाहते हैं।

मैं यह कैसे कर सकता हूं?
वेबब्रोसर नियंत्रण कुंजीपटल घटनाओं का समर्थन नहीं करता है।
मैंने फॉर्म KeyUp ईवेंट KeyPreview के साथ ईवेंट का उपयोग करने का प्रयास किया, लेकिन यह बिल्कुल भी नहीं चला।

EDIT: यहां मेरा समाधान है, जेर्ब के जवाब से प्रेरित है।

class CopyableWebBrowser : WebBrowser { 
    public override bool PreProcessMessage(ref Message msg) { 
     if (msg.Msg == 0x101 //WM_KEYUP 
     && msg.WParam.ToInt32() == (int)Keys.C && ModifierKeys == Keys.Control) { 
      DoCopy(); 
      return true; 
     } 
     return base.PreProcessMessage(ref msg); 
    } 
    void DoCopy() { 
     Document.ExecCommand("SelectAll", false, null); 
     Document.ExecCommand("Copy", false, null); 
     Document.ExecCommand("Unselect", false, null); 
    } 
} 

उत्तर

10

साथ ही आप इस विधि की कोशिश कर सकते। इसे अपने मुख्य रूप क्षेत्र में रखें और इसे सभी कीबोर्ड आदेशों को पकड़ना चाहिए। मैं गतिशील रूप से बनाए गए टैब के लिए कीबोर्ड शॉर्टकट जोड़ने के लिए इसका उपयोग करता हूं।

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { 
    switch (keyData) 
    { 
     case Keys.Control|Keys.Tab: 
      NextTab(); 
      return true; 
     case Keys.Control|Keys.Shift|Keys.Tab: 
      PreviousTab(); 
      return true; 
     case Keys.Control|Keys.N: 
      CreateConnection(null); 
      return true; 
    } 
    return false; 
+0

यह लगभग काम करता है, लेकिन मुझे CTRL + C के लिए कोई संदेश नहीं मिल रहा है। अगर मैं सी दबाता हूं, तो 'कीडेटा'' सी' है, लेकिन अगर मैं किसी अन्य कुंजी के साथ या बिना नियंत्रण दबाता हूं, तो 'कीडेटा'' एलबटन है। ShiftKey | नियंत्रण ', और यह निर्धारित करने का कोई तरीका नहीं है कि कौन सी अन्य कुंजी, यदि कोई हो, दबाया गया था। – SLaks

+0

आखिरी मामला कथन "केस कीज। कंट्रोल | कीज।" वही कर रहा है जो आप करने की कोशिश कर रहे हैं। द एकाधिक चाबियाँ पकड़ने के लिए प्रयोग किया जाता है। तो "केस कुंजी। नियंत्रण | Keys.C:" चाल करना चाहिए। – Jerb

0

आप अपने वेबब्रोसर नियंत्रण में एक कीबोर्ड संदेश हुक सेट कर सकते हैं और कुंजीपटल कुंजी संदेशों को फ़िल्टर कर सकते हैं या उनके लिए कुछ हैंडलिंग कर सकते हैं। यदि नीचे कोड आप के लिए काम करेंगे देखने के लिए कृपया:

[DllImport("user32.dll", SetLastError = true)] 
static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, IntPtr windowTitle); 
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] 
public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId); 
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] 
public static extern int CallNextHookEx(int idHook, int nCode, IntPtr wParam, IntPtr lParam); 
[DllImport("kernel32.dll")] 
public static extern int GetCurrentThreadId(); 

public delegate int HookProc(int nCode, IntPtr wParam, IntPtr lParam); 
public const int WH_KEYBOARD = 2; 
public static int hHook = 0; 

// keyboard messages handling procedure 
public static int KeyboardHookProcedure(int nCode, IntPtr wParam, IntPtr lParam) 
{ 
    Keys keyPressed = (Keys)wParam.ToInt32(); 
    Console.WriteLine(keyPressed); 

    if (keyPressed.Equals(Keys.Up) || keyPressed.Equals(Keys.Down)) 
    { 
     Console.WriteLine(String.Format("{0} stop", keyPressed)); 
     return -1; 
    } 
    return CallNextHookEx(hHook, nCode, wParam, lParam); 
} 

// find explorer window 
private IntPtr FindExplorerWindow() 
{ 
    IntPtr wnd = FindWindowEx(webBrowser1.Handle, IntPtr.Zero, "Shell Embedding", IntPtr.Zero); 
    if (wnd != IntPtr.Zero) 
    { 
     wnd = FindWindowEx(wnd, IntPtr.Zero, "Shell DocObject View", IntPtr.Zero); 
     if (wnd != IntPtr.Zero) 
      return FindWindowEx(wnd, IntPtr.Zero, "Internet Explorer_Server", IntPtr.Zero); 
    } 
    return IntPtr.Zero; 
} 
... 
     // install hook  
     IntPtr wnd = FindExplorerWindow(); 
     if (wnd != IntPtr.Zero) 
     { 
      // you can either subclass explorer window or install a hook 
      // for hooking you don't really need a window handle but can use it 
      // later to filter out messages going to this exact window 
      hHook = SetWindowsHookEx(WH_KEYBOARD, new HookProc(KeyboardHookProcedure), 
       (IntPtr)0, GetCurrentThreadId()); 
      //.... 
     } 
... 

आशा है कि यह मदद करता है, का संबंध

4

It is a bug in Windows Forms। इसका IDocHostUIHandler.TranslateAccelerator क्रियान्वयन वास्तव में WebBrowserShortcutsEnabled की जांच करने और पूर्व डेटा को पूर्वनिर्धारित शॉर्टकट की तुलना करने के बाद S_OK को वापस कर ActiveX होस्ट को कीस्ट्रोक भेजने की कोशिश करता है। दुर्भाग्य से विंडोज फॉर्म की कीबोर्ड प्रोसेसिंग में, शॉर्टकटकी प्रॉपर्टी प्रोसेससीएमडीके के दौरान चेक की जाती है, जिसका अर्थ है IDocHostUIHandler.TranslateAccelerator बहुत देर हो चुकी है। इससे Shortcut enum (उदा। नियंत्रण + सी, डेल, कंट्रोल + एन इत्यादि) में कुछ भी कारण बनता है जब WebBrowserShortcutsEnabled को गलत पर सेट किया जाता है।

आप वेबब्रोसर ActiveX रैपर क्लास (उदा। csexwb2) बना या ढूंढ सकते हैं जो एक अलग IDocHostUIHandler.TranslateAccelerator कार्यान्वयन को शॉर्टकट कुंजियों को फिर से जांचने के लिए प्रदान करता है। विंडोज फॉर्म वेबब्रोसर नियंत्रण अपने IDocHostUIHandler कार्यान्वयन को अनुकूलित करने की अनुमति नहीं देता है।

0

बहुत जांच करने के बाद, हमें पता चला कि यह ब्राउज़र संगतता मुद्दा है।

हमने HTML पृष्ठ में मेटा टैग जोड़ा है, तो शॉर्टकट ठीक काम कर रहे हैं। नीचे नमूना कोड है।

<html> 
<body> 
<Head> 
<meta http-equiv="X-UA-Compatible" content="IE=IE8" /> 
</head> 
<form> 
First name:<br> 
<input type="text" name="firstname"> 
<br> 
Last name:<br> 
<input type="text" name="lastname"> 
</form></body> 
</html> 

इस समस्या के लिए तीन अलग-अलग समाधान हैं।

  1. वेब साइट ब्राउज़र संगत बनाने के लिए मेटा टैग जोड़ना।

  2. "PreocessCmdKey" विधि को ओवरराइड करें और शॉर्टकट को संभालें।

  3. FEATURE_BROWSER_EMULATION के तहत कुंजी जोड़कर अनुकरण ब्राउज़र।

आप एचटीएमएल कोड में मेटा टैग सेट करने के लिए नहीं करना चाहते हैं, तो आप URL पर आने से पहले webbrowser नियंत्रण के दस्तावेज़ पाठ संपत्ति के लिए मेटा टैग निर्दिष्ट कर सकते हैं। नीचे नमूना है।

//Setting compatible mode of IE. 
        this.m_oWebBrowser.DocumentText = @"<html> 
         <head><meta http-equiv=""X-UA-Compatible"" content=""IE=IE8"" /> </head> 
         <body></body> 
         </html>"; 
this.m_oWebBrowser.Navigate("www.google.com"); 
संबंधित मुद्दे