2017-03-08 86 views
0

我需要在代碼(c#.net)中的某些場景中模擬鼠標左鍵單擊。 這個模擬必須完成,但它必須對用戶不可見。所以當左鍵點擊時,我將保存光標位置。在左鍵單擊後,我應該將光標位置設置爲保存值。 有問題。模擬鼠標左鍵單擊目標,然後將鼠標移動到C#中的前一個位置.net

   int save_cursur_x = Cursor.Position.X; 
       int save_cursur_y = Cursor.Position.Y; 
       int current_node_x = newGraphEditor.getCurrentNodeGlobalPosition_x(); 
       int current_node_y = newGraphEditor.getCurrentNodeGlobalPosition_y(); 
       LeftMouseClick(current_node_x, current_node_y); 
       Cursor.Position = new Point(save_cursur_x, save_cursur_y); 

當最後一行(Cursor.Position =新的點(save_cursur_x,save_cursur_y))被移除左鍵點擊目標位置正確地發生。但是,當我再補充一點線,左擊發生在一個未知的位置(或者左鍵點擊不會發生)

這是LeftMouseClick方法:

  //This is a replacement for Cursor.Position in WinForms 
      [System.Runtime.InteropServices.DllImport("user32.dll")] 
      static extern bool SetCursorPos(int x, int y); 

      [System.Runtime.InteropServices.DllImport("user32.dll")] 
      public static extern void mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo); 

      public const int MOUSEEVENTF_LEFTDOWN = 0x02; 
      public const int MOUSEEVENTF_LEFTUP = 0x04; 

      //This simulates a left mouse click 
      public static void LeftMouseClick(int xpos, int ypos) 
      { 
       SetCursorPos(xpos, ypos); 
       mouse_event(MOUSEEVENTF_LEFTDOWN, xpos, ypos, 0, 0); 
       mouse_event(MOUSEEVENTF_LEFTUP, xpos, ypos, 0, 0); 
      } 

更新: 有一個選擇代表目標位置設置的位置。此代理應該在您點擊目標時正好運行。我認爲問題在這裏。在目標上點擊左鍵後,這個委託就不會運行。將Cursor位置設置爲之前的值後,代表運行。所以目標位置設置不正確,因爲現在光標不在目標。(它的位置改變)

ItemEventHandler<IModelItem> selectionDelegate = 

        delegate (object source, ItemEventArgs<IModelItem> args) 
        { 
         var tag = ((INode)(args.Item)).Tag; 
         if (tag is HostInnerNodeTag) 
         { 
          currentNodeGlobalPosition_x = Cursor.Position.X; 
          currentNodeGlobalPosition_y = Cursor.Position.Y; 
         } 
        } 

回答

0

您可以使用SendMessage函數來代替。

[DllImport("user32.dll")] 
    public static extern int SendMessage(
         IntPtr hWnd,  // handle to destination window 
         uint Msg,  // message 
         IntPtr wParam, // first message parameter 
         IntPtr lParam // second message parameter 
        ); 

    public const uint WM_LBUTTONDOWN = 0x0201; 
    public const uint WM_LBUTTONUP = 0x0202;  

    //This simulates a left mouse click 
    public static void LeftMouseClick(IntPtr hwnd, uint xpos, uint ypos) 
    { 
     SendMessage(hwnd, WM_LBUTTONDOWN, new IntPtr(xpos), new IntPtr(ypos)); 
     SendMessage(hwnd, WM_LBUTTONUP, new IntPtr(xpos), new IntPtr(ypos)); 
    } 

    private void send() 
    {    
     LeftMouseClick(newGraphEditor.Handle, 10, 10); 
    } 
+0

我認爲線程有問題。不是錯誤的位置。我認爲移動光標和左鍵單擊有衝突 –

+0

您是否嘗試使用此代碼'mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_ABSOLUTE,xpos,ypos,0,0);'? – user3811082

+0

tagINPUT是什麼? –