두 좌표간에 마우스를 프로그래밍 방식으로 이동하려고합니다. 그러나 모든 고속 또는 저속 처리 기계에서 안정적으로 속도를 유지하려고합니다. this link here을 봤습니다. 그러나 두 좌표 사이의 이동을 시뮬레이션 할 때 커서의 최적의 부드럽고 보이는 속도를 보장하지는 못합니다. 나는 누군가가 지연과 같은 매개 변수를 결정하는 트릭을 아는 지 궁금해하고 다양한 기계에 대한 최적의 값을 단계 내 첫 번째 생각처럼 특정 iteraton에 대한 fororop을 사용하여 기계의 성능을 결정한 다음 얼마나 많은 시간을 기준으로 매개 변수의 등급을 매기는지 -loop은 아이디어를 얻었습니까? 또는 나는 이것에 완전히 틀린가? 감사합니다.두 좌표 사이의 C#에서 마우스 커서 이동을 시뮬레이트합니다.
3
A
답변
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
좀 물리학을 추천 할 것입니다. 속도는 거리를 시간으로 나눈 것입니다. 모든 컴퓨터에 적절한 마우스 속도를 원하면 정확한 시간을 가져야합니다.
당신은 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();
}
}
}
이 좋아 보인다하지만 난이 알고리즘으로도 느린 속도에 잡을 수 없었다. 그것은 단지 즉시가됩니다. 나는 그것을 측정하기 위해 다른 Timespan과 지연 값을 사용했다. – Deku
@Deku - 귀하의 의견을 듣고 1 시간에서 2 시간 이내에 대답을 받았다는 것을 알았습니다. 뭐가 잘못 됐는지 알아 냈어? 나는이 코드를 테스트하지 않았다. 어떤 변화가 필요 했습니까? – Justin
.. 더 나은 솔루션이기 때문에 답변을주었습니다. 하지만 정확히 위 질문에 대한 내 질문에 대답하지 않았다. 여기에 그것을 테스트하는 코드가있다. – Deku