2011-05-05 3 views
3

두 좌표간에 마우스를 프로그래밍 방식으로 이동하려고합니다. 그러나 모든 고속 또는 저속 처리 기계에서 안정적으로 속도를 유지하려고합니다. this link here을 봤습니다. 그러나 두 좌표 사이의 이동을 시뮬레이션 할 때 커서의 최적의 부드럽고 보이는 속도를 보장하지는 못합니다. 나는 누군가가 지연과 같은 매개 변수를 결정하는 트릭을 아는 지 궁금해하고 다양한 기계에 대한 최적의 값을 단계 내 첫 번째 생각처럼 특정 iteraton에 대한 fororop을 사용하여 기계의 성능을 결정한 다음 얼마나 많은 시간을 기준으로 매개 변수의 등급을 매기는지 -loop은 아이디어를 얻었습니까? 또는 나는 이것에 완전히 틀린가? 감사합니다.두 좌표 사이의 C#에서 마우스 커서 이동을 시뮬레이트합니다.

답변

3

운동을 시간의 함수로 만들어야합니다. C# moving the mouse around realistically에서 답을 시작하고 경과 시간을 측정하는 스톱워치 클래스를 사용하여 :

public void LinearSmoothMove(Point newPosition, TimeSpan duration) 
{ 
    Point start = GetCursorPosition(); 

    // Find the vector between start and newPosition 
    double deltaX = newPosition.X - start.X; 
    double deltaY = newPosition.Y - start.Y; 

    // start a timer 
    Stopwatch stopwatch = new Stopwatch(); 
    stopwatch.Start(); 

    double timeFraction = 0.0; 

    do 
    { 
     timeFraction = (double)stopwatch.Elapsed.Ticks/duration.Ticks; 
     if (timeFraction > 1.0) 
      timeFraction = 1.0; 

     PointF curPoint = new PointF(start.X + timeFraction * deltaX, 
            start.Y + timeFraction * deltaY); 
     SetCursorPosition(Point.Round(curPoint)); 
     Thread.Sleep(20); 
    } while (timeFraction < 1.0); 
} 
+0

이 좋아 보인다하지만 난이 알고리즘으로도 느린 속도에 잡을 수 없었다. 그것은 단지 즉시가됩니다. 나는 그것을 측정하기 위해 다른 Timespan과 지연 값을 사용했다. – Deku

+0

@Deku - 귀하의 의견을 듣고 1 시간에서 2 시간 이내에 대답을 받았다는 것을 알았습니다. 뭐가 잘못 됐는지 알아 냈어? 나는이 코드를 테스트하지 않았다. 어떤 변화가 필요 했습니까? – Justin

+0

.. 더 나은 솔루션이기 때문에 답변을주었습니다. 하지만 정확히 위 질문에 대한 내 질문에 대답하지 않았다. 여기에 그것을 테스트하는 코드가있다. – Deku

0

좀 물리학을 추천 할 것입니다. 속도는 거리를 시간으로 나눈 것입니다. 모든 컴퓨터에 적절한 마우스 속도를 원하면 정확한 시간을 가져야합니다.

당신은 600분의 400 지점으로 0/0에서 마우스를 이동할 및 엔드 포인트는 항상 삼초 후에 도달해야합니다

는 다음의 예제를 만들어 보자.

시작 시간을 저장하고 starttime + 3s에 끝나는 while 루프를 만들어야합니다. 루프에서 경과 시간과 총 시간에서 X와 Y 좌표를 계산합니다.

X = 400/3s * ElapsedTime 
Y = 600/3s * ElapsedTime 

이것은 기계에 의존하지 않습니다. 좋은 결과를 얻으려면 Stopwatch과 같이 정확한 시간을 사용해야합니다.

0

나는 이것을 시도했지만 아직 최적이 아니다. 여전히 기계 처리 능력에 따라 다릅니다. @ 저스틴, 지속 시간과 절전 시간에 다른 값을 사용하십시오. 테스트 한 후에 더 나은 솔루션을 제안한다면 알려주세요. 감사합니다.

using System; 
using System.Drawing; 
using System.Runtime.InteropServices; 
using System.Windows.Forms; 
using System.Diagnostics; 
using System.Threading; 

namespace ConsoleApplication11 
{ 
    class Program 
    { 

     [DllImport("user32.dll")] 
     static extern bool SetCursorPos(int X, int Y); 

     public static void LinearSmoothMove(Point newPosition, TimeSpan duration) 
     { 
      Point start = Cursor.Position; 
      int sleep = 10; 
      //PointF iterPoint = start; 
      // Find the vector between start and newPosition 
      double deltaX = newPosition.X - start.X; 
      double deltaY = newPosition.Y - start.Y; 
      // start a timer  
      Stopwatch stopwatch = new Stopwatch(); 
      stopwatch.Start(); 
      double timeFraction = 0.0; 
      do 
      { 
       timeFraction = (double)stopwatch.Elapsed.Ticks/duration.Ticks; 
       if (timeFraction > 1.0) 
       timeFraction = 1.0; 
       PointF curPoint = new PointF((float)(start.X + timeFraction * deltaX), (float)(start.Y + timeFraction * deltaY)); 
       SetCursorPos(Point.Round(curPoint).X, Point.Round(curPoint).Y); 
       Thread.Sleep(sleep); 
      } while (timeFraction < 1.0); 
     } 
     static void Main(string[] args) 
     { 
      TimeSpan delayt = new TimeSpan(0, 0, 3); 
      LinearSmoothMove(new Point(20, 40), delayt); 
      Console.Read(); 
     }  
    } 
} 
관련 문제