2017-03-08 89 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是什么? –