1. 程式人生 > >c#設定滑鼠無法使用和啟用滑鼠

c#設定滑鼠無法使用和啟用滑鼠

    class Program
    {
        [StructLayout(LayoutKind.Sequential)]
        public struct tagRECT
        {

            /// LONG->int
            public int left;

            /// LONG->int
            public int top;

            /// LONG->int
            public int right;

            /// LONG->int
public int bottom; } /// Return Type: BOOL->int ///lpRect: RECT* [DllImport("user32.dll", EntryPoint = "ClipCursor")] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool ClipCursor([In] IntPtr lpRect); /// <summary> ///
應用程式的主入口點。
/// </summary> [STAThread] static void Main() { tagRECT rect = new tagRECT() { left = 0, top = 0, right = 1, bottom = 1 }; var p = Marshal.AllocHGlobal(Marshal.SizeOf(rect)); Marshal.StructureToPtr(rect, p, false); ClipCursor(p);//鎖定
ClipCursor(IntPtr.Zero);//解鎖 } } //如果需要,還可以隱藏指標

呼叫滑鼠對用的介面,設定disable即可,啟用則為enable
怎樣利用多執行緒控制代碼設定滑鼠忙碌狀態呢?當我們在讀取資料的時候,或者處理大量資料的時候可能需要把滑鼠設定為忙碌狀態,等待返回結果。下面的程式碼可以幫忙實現這點:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
namespace CursorThread
{
    public partial class Form1 : Form
    {
        public delegate int DoSomethingDelegate(int data);
        public Form1()
        {
            InitializeComponent();
        }
        static int DoSomething(int data)
        {
            /// <sumary>
            /// Do something in this method
            /// </sumary>
            Thread.Sleep(300);
            return data++;

        }
        private void button1_Click(object sender, EventArgs e)
        {
            this.Cursor = Cursors.Default;
            DoSomethingDelegate d = DoSomething;
            IAsyncResult ar = d.BeginInvoke(100,null, null);
            while (true)
            {
                this.Cursor = Cursors.WaitCursor;
                if(ar.AsyncWaitHandle.WaitOne(50, false))
                {
                    this.Cursor = Cursors.Arrow;
                    break;
                }
            }
            //Get the result
            int result = d.EndInvoke(ar);
            MessageBox.Show(result.ToString());
        }
    }
}

這樣在點選滑鼠後,滑鼠會變成忙碌狀態一直等待DoSomething這個方法呼叫結束,然後變回箭頭狀態。
當然你也可以這樣:

// Set the status of the cursor
this.Cursor = Cursor.Busy;
// Do Something
// Set the status of the cursor
this.Cursor = Cursor.Arrow;
--如果是在方法裡面呼叫的話,不能使用this關鍵字,那你可以這樣做:
private void Method()
{    
         Curosor.Current = Cursor.WaitCursor;
         /// Do Something
         Cursor.Current = Cursor.Arrow;
}
--在c#程式中,當程式執行某功能時,可以將滑鼠設定成忙碌狀態。
 private void Ddocilck_Click(object sender, EventArgs e)
        {
            this.Cursor = System.Windows.Forms.Cursors.WaitCursor;//滑鼠為忙碌狀態
/*

**執行程式碼**

*/
this.Cursor = System.Windows.Forms.Cursors.Arrow;//設定滑鼠為正常狀態
}
/**
使用C#改變滑鼠的指標形狀
1.在一個無標題的窗體中用MOUSEMOVE事件判斷滑鼠座標是否到達窗體的邊緣,如果是的話將滑鼠指標改為可調整窗體大小的雙向箭頭.
**/ 
private   void   Form1_MouseMove(object sender,   System.Windows.Forms.MouseEventArgs e)  
  {  
  if(0   ==   e.X)  
  {  
      this.Cursor   =   Cursors.SizeWE;  
  }  

  //改成這樣就可以了,很奇怪(不能寫成:e.X   >=   this.Width)   
 else   if(e.X   >=   this.Width-2)      

 {  
      this.Cursor   =   Cursors.SizeWE;  
  }    
  else  
  {  
      this.Cursor   =   Cursors.Default;  
  }  
    }
/**
2.但c#.net提供的cursor類只能做windows提供的游標形狀之間的變換,cursor類貌似不支援動畫以及多色的檔案。我想要用自己的點陣圖檔案作為游標,應該怎麼弄呢?
 方案:使用滑鼠檔案定義自己的滑鼠指標。
      Cursor.Current=new Cursor(@"C:\my.cur"); 
    OR: Cursor Cur=new Cursor(@"C:\my.cur"); 
      this.Cursor = Cur;
    在窗體的建構函式里加入上面的程式碼,就可以改變滑鼠指標形狀。
    my.cur是滑鼠點陣圖檔案,將滑鼠圖片直接作為檔案加入到工程內,在工程內選擇新增的檔案後察看屬性,修改生成屬性值為嵌入的資源,這樣就可以編譯到exe裡面取了。
**/