2010-10-22 52 views
4

我想鼠標FREEZ(不能移動)時,按下鼠標 感謝如何使鼠標凍結C#

+7

爲什麼你想這樣做? – 2010-10-22 11:37:40

+4

也許是爲了它的樂趣:) – balexandre 2010-10-22 11:39:55

+4

所以切斷鼠標電纜:) – 2010-10-22 11:40:36

回答

4

你不能。

鼠標在操作系統層中運行,而不是您的應用程序......即使您凍結您的應用程序,鼠標也能運行。

您可以嘗試斷開鼠標驅動程序/端口,但您確實需要詢問用戶鼠標使用的端口,因爲它是輸入設備,就像設計板中的筆一樣,您不會知道要斷開的那個。

3

您可以假冒,對於您通過以下方式窗口行爲:

  1. 記住當前光標和它的位置。

  2. this.Cursor = Cursors.None;

  3. 繪製記住的光標在指定位置,並介紹canExecute標誌所有鼠標處理程序「假鼠標凍結」期間禁用它們。

+2

當隱藏的鼠標指針移動到其他控件上時,您仍然可以獲得其他效果。另一方面,這整個問題可能是一個壞主意。 – JasonFruit 2010-10-22 12:03:13

2

難道你不能移動鼠標指針嗎?移動時可能會重置其位置(這可能看起來很醜)。

6

我用一個TableLayoutPanel供大家參考(只記得執行代碼是在前面的控制):

OPTION1:重置鼠標位置:

定義兩個全局變量:

bool mousemove = true; 
Point currentp = new Point(0, 0); 

亨德爾MouseDown事件更新mousemove

private void tableLayoutPanel1_MouseDown(object sender, MouseEventArgs e) 
{ 
    int offsetX = (sender as Control).Location.X + this.Location.X; 
    int offsetY = (sender as Control).Location.Y + this.Location.Y; 
    mousemove = false; 
    currentp = new Point(e.X+offsetX, e.Y+offsetY); //or just use Cursor.Position 
} 

亨德爾MouseMove禁用/啓用移動:

private void tableLayoutPanel1_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (!mousemove) 
     { 
      this.Cursor = new Cursor(Cursor.Current.Handle); 
      Cursor.Position = currentp; 
     } 
    } 

重置mousemove而鼠標鬆開

private void tableLayoutPanel1_MouseUp(object sender, MouseEventArgs e) 
    { 
     mousemove = true; 
    } 

OPTION2:限制鼠標剪裁矩形:

限制它,而的MouseDown:

private void tableLayoutPanel1_MouseDown(object sender, MouseEventArgs e) 
     {    
      this.Cursor = new Cursor(Cursor.Current.Handle); 
      Cursor.Position = Cursor.Position; 
      Cursor.Clip = new Rectangle(Cursor.Position, new Size(0, 0)); 
     } 

釋放它的MouseUp後:

private void tableLayoutPanel1_MouseUp(object sender, MouseEventArgs e) 
    { 
     this.Cursor = new Cursor(Cursor.Current.Handle); 
     Cursor.Position = Cursor.Position; 
     Cursor.Clip = Screen.PrimaryScreen.Bounds; 
    } 
+0

沒有測試過,但它正是我想到的。保持重置鼠標位置會產生所需的效果。 – 2010-10-22 12:54:02

+0

@Bruno:您也可以通過將鼠標的剪切矩形設置爲0來凍結鼠標,並且我更新了我的答案。 – Bolu 2010-10-22 13:03:48

+0

@sam:有何評論? – Bolu 2010-10-25 15:25:08

4

這是可能的,Windows有一個專用的API吧,了BlockInput()。當你嘗試使用它時,一定要保存所有的工作,這是非常有效的。您可能需要重新啓動計算機,這是用戶在程序中使用時所要執行的操作。下面是一個使用它的樣品Windows窗體形式,它需要一個按鈕和一個計時器:

public partial class Form1 : Form { 
    public Form1() { 
     InitializeComponent(); 
     timer1.Interval = 3000; 
     timer1.Tick += new EventHandler(timer1_Tick); 
     button1.Click += new EventHandler(button1_Click); 
    } 
    private void button1_Click(object sender, EventArgs e) { 
     timer1.Enabled = true; 
     BlockInput(true); 
    } 
    private void timer1_Tick(object sender, EventArgs e) { 
     timer1.Enabled = false; 
     BlockInput(false); 
    } 
    [System.Runtime.InteropServices.DllImport("user32.dll")] 
    private static extern bool BlockInput(bool block); 
} 
+0

這會阻止輸入3秒,但直到釋放鼠標按鈕。根據定義,只要用戶輸入被阻止,就不會收到MouseButton的釋放。 – chiccodoro 2010-10-22 13:16:09

+1

@chicco - 這是正常的按鈕行爲,ClickUp事件在MouseUp上引發。 – 2010-10-22 13:22:51

0

設置一個較低的水平鼠標鉤子與SetWindowsHookEx,而忽略到指定(該HOOKPROC代表所有的消息表示不叫CallNextHookEx