1. 程式人生 > >C# 滑鼠游標到達螢幕邊緣後從另一邊緣出現

C# 滑鼠游標到達螢幕邊緣後從另一邊緣出現

描述:

將滑鼠向左移動,當游標移動到螢幕左邊邊框後,滑鼠繼續向左移動,但游標位置不再變化;

現在希望滑鼠繼續向左移動時,游標能夠從螢幕右側出現,並繼續向左移動;

實現程式碼如下:

需要宣告的變數:

    bool isPrimary = true;   //是否是主屏
    int primaryScreenWidth = 0;  //主屏
    int primaryScreenHeight = 0;
    int secondScreenWidth = 0;    //副屏
    int secondScreenHeight = 0;

需要的的函式如下:

   //滑鼠到螢幕最左或最右端
        [DllImport("user32.dll")]
        private static extern int SetCursorPos(int x, int y);

        //設定螢幕大小
        private void SetScreenSize()
        {
            primaryScreenWidth = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Width;
            primaryScreenHeight = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Height;
            //判斷是否不止一個螢幕
            if (System.Windows.Forms.Screen.AllScreens.Length > 1)
            {
                secondScreenWidth = System.Windows.Forms.Screen.AllScreens[1].WorkingArea.Width;
                secondScreenHeight = System.Windows.Forms.Screen.AllScreens[1].WorkingArea.Height;
            }
        }

        //判斷游標是否在主螢幕上
        private void SetScreenState()
        {
            isPrimary = true;
            //獲取當前滑鼠游標位置
            int posX = System.Windows.Forms.Cursor.Position.X;
            int posY = System.Windows.Forms.Cursor.Position.Y;
            // 判斷當前是哪個螢幕
            if (posX > primaryScreenWidth)
            {
                isPrimary = false;
            }
        }

        //獲取游標位置
        private void GetCursorPos()
        {
            int posX = System.Windows.Forms.Cursor.Position.X;
            int posY = System.Windows.Forms.Cursor.Position.Y;
            if (isPrimary)
            {
                if (posY <= 10)
                {
                    ResetCursorPos(true);
                }
                if (posY >= primaryScreenHeight - 10)
                {
                    ResetCursorPos(false, true);
                }
                if (posX <= 10)
                {
                    ResetCursorPos(false, false, true);
                }
                if (posX >= primaryScreenWidth - 10)
                {
                    ResetCursorPos(false, false, false, true);
                }
            }
            else
            {
                if (posY <= 10)
                {
                    ResetCursorPos(true);
                }
                if (posY >= secondScreenHeight - 10)
                {
                    ResetCursorPos(false, true);
                }
                if (posX <= primaryScreenWidth + 10)
                {
                    ResetCursorPos(false, false, true, false);
                }
                if (posX >= primaryScreenWidth + secondScreenWidth - 10)
                {
                    ResetCursorPos(false, false, false, true);
                }
            }
        }
            
        //重新設定游標的位置
        private void ResetCursorPos(bool isTop=false, bool isBottom=false, bool isLeft=false, bool isRight=false)
        {
            int posX = System.Windows.Forms.Cursor.Position.X;
            int posY = System.Windows.Forms.Cursor.Position.Y;
            if (isPrimary)
            {
                if (isTop)
                {
                    SetCursorPos(posX, primaryScreenHeight-11);   //上→下
                }
                if (isBottom)
                {
                    SetCursorPos(posX, 11);   //下→上
                }
                if (isLeft)
                {
                    SetCursorPos(primaryScreenWidth-11, posY);   //左→右
                }
                if (isRight)
                {
                    SetCursorPos(11, posY);   //右→左
                }
            }
            else
            {
                if (isTop)
                {
                    SetCursorPos(posX, secondScreenHeight-11);   //上→下
                }
                if (isBottom)
                {
                    SetCursorPos(posX, 11);   //下→上
                }
                if (isLeft)
                {
                    SetCursorPos(primaryScreenWidth+secondScreenWidth-11, posY);   //左→右
                }
                if (isRight)
                {
                    SetCursorPos(primaryScreenWidth+11, posY);   //右→左
                }
            }
        }
這裡的10和11表示:在距離螢幕邊緣10畫素的時候,就把游標移動到另一端11畫素的地方;

Tip:

 private static extern int SetCursorPos(int x, int y);

 函式功能:該函式把游標移到螢幕的指定位置。如果新位置不在由 ClipCursor函式設定的螢幕矩形區域之內,則系統自動調整座標,使得游標在矩形之內。

函式原型:BOOL SetCursorPOS(int X,int Y);

引數:

X:指定游標的新的X座標,以螢幕座標表示。

Y:指定游標的新的Y座標,以螢幕座標表示。

返回值:如果成功,返回非零值;如果失敗,返回值是零,若想獲得更多錯誤資訊,請呼叫GetLastError函式。

備註:該游標是共享資源,僅當該游標在一個視窗的客戶區域內時它才能移動該游標。

C#中使用該函式首先匯入名稱空間:

using System.Runtime.InteropServices;  

然後寫API引用部分的程式碼,放入 class 內部:

[DllImport("user32.dll", EntryPoint = "SetCursorPos")]  
private static extern int SetCursorPos(int x, int y);  

這個函式有兩個個引數,第一個引數是指定游標的新的X座標;第二個引數是指定游標的新的Y座標。例如:

SetCursorPos(100, 100);