2013-04-20 2 views
1

웹 페이지에서 정보를 얻으려면 Visual Studio에서 코드를 작성하고 있습니다. 지금은 HTML 요소의 상황에 맞는 메뉴를 열 필요가 내가 그런 일을 찾고 있었다 :C# webbrowser - trigger right click

webbrowser.Navigate("javascript: document.getElementsByClassName('className')[1].rightclick();void(0);"); 

하지만, 불행하게도, 난 단지 클릭() 함수는 자바 스크립트에 존재하는 것으로 나타났습니다. 해결 방법이 있습니까?

감사합니다.

+0

당신이 당신의 요소에 컨텍스트 메뉴를여시겠습니까? – KF2

+0

예, 이것이 제가 원하는 것입니다! :) – brutus8890

답변

2

당신은 흐르는 단계로이 작업을 수행 할 수 있습니다

  1. 양식에 web-browser control의 위치 가져 오기 :

    Point controlLoc = this.PointToScreen(webBrowser1.Location); 
    
  2. 이 위치 웹 브라우저 컨트롤에 대한 당신의 HtmlElement을 받기를

    X= element.OffsetRectangle.Left; 
    
    Y =element.OffsetRectangle.Top; 
    
  3. 귀하의 의견을 요약하십시오. S : 마우스 오른쪽 단추로 클릭

    Cursor.Position = controlLoc; 
    
  4. 마우스를 시뮬레이션 :

    MouseSimulator.ClickRightMouseButton(); 
    

전체 코드 :

controlLoc.X = controlLoc.X + element.OffsetRectangle.Left; 

controlLoc.Y = controlLoc.Y + element.OffsetRectangle.Top; 
  • 새로운 위치에 마우스 위치를 설정

    public partial class Form1 : Form 
        { 
         public Form1() 
         { 
          InitializeComponent(); 
    
         } 
    
         private void Form1_Load(object sender, EventArgs e) 
         { 
    
          webBrowser1.DocumentText = "<button class=\"mybtn\" type=\"submit\"> Right click"; 
          webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted); 
         } 
    
         void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
         { 
          foreach (HtmlElement element in webBrowser1.Document.GetElementsByTagName("button")) 
          { 
           if (element.GetAttribute("ClassName") == "mybtn") 
           { 
            Point controlLoc = this.PointToScreen(webBrowser1.Location); 
            //Get Element Posation 
            controlLoc.X= controlLoc.X + element.OffsetRectangle.Left; 
            controlLoc.Y = controlLoc.Y + element.OffsetRectangle.Top; 
            Cursor.Position = controlLoc; 
            MouseSimulator.ClickRightMouseButton(); 
           } 
          } 
         } 
        } 
    
        public class MouseSimulator 
        { 
         [DllImport("user32.dll", SetLastError = true)] 
         static extern uint SendInput(uint nInputs, ref INPUT pInputs, int cbSize); 
    
         [StructLayout(LayoutKind.Sequential)] 
         struct INPUT 
         { 
          public SendInputEventType type; 
          public MouseKeybdhardwareInputUnion mkhi; 
         } 
         [StructLayout(LayoutKind.Explicit)] 
         struct MouseKeybdhardwareInputUnion 
         { 
          [FieldOffset(0)] 
          public MouseInputData mi; 
    
          [FieldOffset(0)] 
          public KEYBDINPUT ki; 
    
          [FieldOffset(0)] 
          public HARDWAREINPUT hi; 
         } 
         [StructLayout(LayoutKind.Sequential)] 
         struct KEYBDINPUT 
         { 
          public ushort wVk; 
          public ushort wScan; 
          public uint dwFlags; 
          public uint time; 
          public IntPtr dwExtraInfo; 
         } 
         [StructLayout(LayoutKind.Sequential)] 
         struct HARDWAREINPUT 
         { 
          public int uMsg; 
          public short wParamL; 
          public short wParamH; 
         } 
         struct MouseInputData 
         { 
          public int dx; 
          public int dy; 
          public uint mouseData; 
          public MouseEventFlags dwFlags; 
          public uint time; 
          public IntPtr dwExtraInfo; 
         } 
         [Flags] 
         enum MouseEventFlags : uint 
         { 
          MOUSEEVENTF_MOVE = 0x0001, 
          MOUSEEVENTF_LEFTDOWN = 0x0002, 
          MOUSEEVENTF_LEFTUP = 0x0004, 
          MOUSEEVENTF_RIGHTDOWN = 0x0008, 
          MOUSEEVENTF_RIGHTUP = 0x0010, 
          MOUSEEVENTF_MIDDLEDOWN = 0x0020, 
          MOUSEEVENTF_MIDDLEUP = 0x0040, 
          MOUSEEVENTF_XDOWN = 0x0080, 
          MOUSEEVENTF_XUP = 0x0100, 
          MOUSEEVENTF_WHEEL = 0x0800, 
          MOUSEEVENTF_VIRTUALDESK = 0x4000, 
          MOUSEEVENTF_ABSOLUTE = 0x8000 
         } 
         enum SendInputEventType : int 
         { 
          InputMouse, 
          InputKeyboard, 
          InputHardware 
         } 
    
         public static void ClickRightMouseButton() 
         { 
          INPUT mouseDownInput = new INPUT(); 
          mouseDownInput.type = SendInputEventType.InputMouse; 
          mouseDownInput.mkhi.mi.dwFlags = MouseEventFlags.MOUSEEVENTF_RIGHTDOWN; 
          SendInput(1, ref mouseDownInput, Marshal.SizeOf(new INPUT())); 
    
          INPUT mouseUpInput = new INPUT(); 
          mouseUpInput.type = SendInputEventType.InputMouse; 
          mouseUpInput.mkhi.mi.dwFlags = MouseEventFlags.MOUSEEVENTF_RIGHTUP; 
          SendInput(1, ref mouseUpInput, Marshal.SizeOf(new INPUT())); 
         } 
        } 
    

    결과 :

    enter image description here

  • 0

    당신은

    1 단계

    는 새 Windows Forms 응용 프로그램을 만들려면 다음과 TextBoxContextMenuStrip 제어기로 드래그 할 수 있습니다 형태. TextBox의 MultiLine 속성을 true로 설정하고 ContextMenuStrip 속성을 contextMenuStrip1로 설정하여 TextBox의 기본 ContextMenu (다음 그림 참조)를 재정의합니다. 참조 : 기본 TextBox 컨트롤의 ContextMenuStrip을, 실행 취소, 잘라 내기, 복사, 붙여 넣기에서와 ContextMenuStrip을 여섯 개 메뉴 항목을 추가, 삭제, 3 개 구분으로 "모두 선택"2

    enter image description here

    단계 실행 취소, 삭제 및 "모두 선택"메뉴 항목 후에. TextBox의 글꼴, 텍스트 색상 및 배경색을 변경하려면 ContextMenuStrip 글꼴, Forecolor 및 Backcolor에서 세 가지 메뉴 항목을 추가하십시오. contextMenuStrip1은 위의 첫 번째 그림과 같아야합니다. 컨텍스트 메뉴를 추가하는 방법은 이전 기사를 참조하십시오.

    이 메뉴 항목의 Name 속성은 텍스트와 동일하게 설정하십시오. 메뉴 항목 "실행 취소"와 마찬가지로 이름을 "실행 취소"로 설정하십시오. 3

    단계는 특정 조건 (설명 참조)에 따라 ToolStripMenuItems을 사용하지 contextMenuStrip1의 오프닝 이벤트에 다음 코드를 추가합니다. 참조 :

    private void contextMenuStrip1_Opening(object sender, CancelEventArgs e) 
    { 
        // Disable Undo if CanUndo property returns false 
        if (textBox1.CanUndo) 
        { 
         contextMenuStrip1.Items["Undo"].Enabled = true; 
        } 
        else 
        { 
         contextMenuStrip1.Items["Undo"].Enabled = false; 
        } 
    
    
    // Disable Cut, Copy and Delete if any text is not selected in TextBox 
    if (textBox1.SelectedText.Length == 0) 
    { 
        contextMenuStrip1.Items["Cut"].Enabled = false; 
        contextMenuStrip1.Items["Copy"].Enabled = false; 
        contextMenuStrip1.Items["Delete"].Enabled = false; 
    } 
    else 
    { 
        contextMenuStrip1.Items["Cut"].Enabled = true; 
        contextMenuStrip1.Items["Copy"].Enabled = true; 
        contextMenuStrip1.Items["Delete"].Enabled = true; 
    } 
    
    // Disable Paste if Clipboard does not contains text 
    if (Clipboard.ContainsText()) 
    { 
        contextMenuStrip1.Items["Paste"].Enabled = true; 
    } 
    else 
    { 
        contextMenuStrip1.Items["Paste"].Enabled = false; 
    } 
    
    // Disable Select All if TextBox is blank 
    if (textBox1.Text.Length == 0) 
    { 
        contextMenuStrip1.Items["SelectAll"].Enabled = false; 
    } 
    else 
    { 
        contextMenuStrip1.Items["SelectAll"].Enabled = true; 
    } 
    

    }

    4 단계

    는 ToolStripMenuItems의 클릭 이벤트에 다음 코드를 추가합니다 :

    private void Undo_Click(object sender, EventArgs e) 
    { 
        textBox1.Undo(); 
    } 
    
    private void Cut_Click(object sender, EventArgs e) 
    { 
        textBox1.Cut(); 
    } 
    
    private void Copy_Click(object sender, EventArgs e) 
    { 
        textBox1.Copy(); 
    } 
    
    private void Paste_Click(object sender, EventArgs e) 
    { 
        textBox1.Paste(); 
    } 
    
    private void Delete_Click(object sender, EventArgs e) 
    { 
        int SelectionIndex = textBox1.SelectionStart; 
        int SelectionCount = textBox1.SelectionLength; 
        textBox1.Text = textBox1.Text.Remove(SelectionIndex, SelectionCount); 
        textBox1.SelectionStart = SelectionIndex; 
    } 
    
    private void SelectAll_Click(object sender, EventArgs e) 
    { 
        textBox1.SelectAll(); 
    } 
    
    private void Font_Click(object sender, EventArgs e) 
    { 
        FontDialog fontDialog = new FontDialog(); 
        if (fontDialog.ShowDialog() == DialogResult.OK) 
        { 
         textBox1.Font = fontDialog.Font; 
        } 
    } 
    
    private void Forecolor_Click(object sender, EventArgs e) 
    { 
        ColorDialog colorDialog = new ColorDialog(); 
        if (colorDialog.ShowDialog() == DialogResult.OK) 
        { 
         textBox1.ForeColor = colorDialog.Color; 
        } 
    } 
    
    private void Backcolor_Click(object sender, EventArgs e) 
    { 
        ColorDialog colorDialog = new ColorDialog(); 
        if (colorDialog.ShowDialog() == DialogResult.OK) 
        { 
         textBox1.BackColor = colorDialog.Color; 
        } 
    }