2013-03-25 44 views
7

Tôi đang sử dụng chức năng này để di chuyển con trỏ.C# MouseMove đáng tin cậy (hop)

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

Khi tôi sử dụng phím nóng để kích hoạt nó, con trỏ sẽ di chuyển đến đúng coords và lần sau tôi di chuyển chuột tiếp tục từ vị trí đó. Làm việc như dự định.

Tuy nhiên tôi cần kích hoạt SetCursorPos trong sự kiện MouseMove. Nếu người dùng di chuyển chuột vào một khu vực nhất định tôi muốn nó nhảy đến một địa điểm khác và tiếp tục từ đó. Nhưng ngay bây giờ nó nhảy đến đích và sau đó ngay lập tức nhảy trở lại (90% thời gian). Làm cách nào để tránh hành vi đó?

Chỉnh sửa: Tôi quyết định làm việc xung quanh nó bằng cách cắt con trỏ trong ô vuông 1 x 1 px cho 1 sự kiện mousemove. Cursor.Clip (MousePosition, hình chữ nhật mới (1, 1));

+4

Vui lòng đăng mã trình xử lý sự kiện MouseMove của bạn. –

+0

Tôi nghĩa là chỉ cần gọi hàm đó và không có gì khác trong sự kiện MouseMove. – user1340531

+0

@ user1340531: Vẫn đăng bài? – mpen

Trả lời

1

Đoán của tôi là có một điều khiển khác ở trên cùng của biểu mẫu của bạn trong khu vực nơi bạn muốn kích hoạt sự kiện. Nếu vậy, điều khiển sẽ ghi lại sự kiện MouseMove.

Ví dụ: tại đây tôi đã thêm bảng màu xanh lục 200x200 ở vị trí 0, 0 ở góc trên bên trái. Nếu chuột di chuyển qua bảng điều khiển, sự kiện MouseMove của biểu mẫu sẽ dừng chụp vị trí con trỏ chuột. Trong sự kiện mouse_move của biểu mẫu của tôi, tôi đặt văn bản của biểu mẫu để hiển thị tọa độ chuột. Chú ý các tọa độ trong văn bản cửa sổ vẫn là 200, 200 khi chuột thực sự là 0, 0 (không thể nhìn thấy con trỏ của tôi do phải nhấp vào SnippingTool.exe để có được ảnh chụp màn hình).

enter image description here

Để khắc phục điều này, sử dụng mã tương tự như bạn đặt trong sự kiện của mẫu của bạn MouseMove trong trường hợp MouseMove của bảng điều khiển (hoặc bất cứ điều khiển bạn đang sử dụng). Điều này dẫn đến tọa độ chính xác trong văn bản của biểu mẫu.

enter image description here

Và đây là đoạn code (Điều này rõ ràng có thể được refactored thành một phương pháp duy nhất):

public partial class Form1 : Form 
{ 
    [DllImport("user32.dll")] 
    static extern bool SetCursorPos(int X, int Y); 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_MouseMove(object sender, MouseEventArgs e) 
    { 
     this.Text = string.Format("X: {0}, Y: {1}", e.X, e.Y); 

     if (e.X >= 0 && e.X <= 200) 
     { 
      if (e.Y >= 0 && e.Y <= 200) 
      { 
       SetCursorPos(500, 500); 
      } 
     } 
    } 

    private void panel1_MouseMove(object sender, MouseEventArgs e) 
    { 
     this.Text = string.Format("X: {0}, Y: {1}", e.X, e.Y); 

     if (e.X >= 0 && e.X <= 200) 
     { 
      if (e.Y >= 0 && e.Y <= 200) 
      { 
       SetCursorPos(500, 500); 
      } 
     } 
    } 
} 
+0

Sự kiện MouseMove của tôi thực sự toàn cầu, nó được kích hoạt bất kể tôi đang lơ lửng gì, miễn là con trỏ di chuyển. – user1340531

+2

@ user1340531 Như những người bình luận khác đã nói, bạn cần phải thêm mã đó vào câu hỏi của bạn. – Inisheer

+1

Chủ yếu là do không có sự kiện như một sự kiện MouseMove "toàn cầu", trừ khi bạn đã cài đặt một móc toàn cục. –

0

Khó nói với thông tin ít như vậy (có thể là một ảnh chụp màn hình của GUI sẽ giúp) . Bạn có thể thử:

private void Button_MouseMove_1(object sender, MouseEventArgs e) 
    { 
     SetCursorPos(0, 0); 
     e.Handled = true; 
    } 
Các vấn đề liên quan