匯出 (0) 列印
全部展開
本主題尚未接受評分 - 為這個主題評分

HOW TO:以程式碼模擬滑鼠和鍵盤事件

Windows Form 提供了幾個選項,用於以程式設計方式模擬滑鼠和鍵盤輸入。本說明主題將概要說明這些選項。

模擬滑鼠輸入

模擬滑鼠事件的最佳方式是呼叫 OnEventName 方法,它會引發您要模擬的滑鼠事件。通常只有在自訂控制項和表單內才能使用這個選項,因為引發事件的方法會受到保護,而且無法在控制項或表單外進行存取。例如,下列步驟說明了如何在程式碼中模擬按一下滑鼠右鍵的動作。

若要以程式設計方式按一下滑鼠右鍵

  1. 建立 MouseEventArgs,將它的 Button 屬性設為 System.Windows.Forms.MouseButtons.Right 值。

  2. 使用這個 MouseEventArgs 做為引數以呼叫 OnMouseClick 方法。

如需自訂控制項的詳細資訊,請參閱在設計階段開發 Windows Form 控制項

還有其他方式可以模擬滑鼠輸入。例如,您可以使用程式設計方式設定代表狀態的控制項屬性,而此狀態通常是經由滑鼠輸入來設定 (例如 CheckBox 控制項的 Checked 屬性),或者是直接呼叫附加至您要模擬的事件的委派。

模擬鍵盤輸入

雖然您也可以使用上述用於滑鼠輸入的策略來模擬鍵盤輸入,Windows Form 還是提供了 SendKeys 類別,以便將按鍵動作傳送至使用中的應用程式。

Caution note警告

如果應用程式是設計成可搭配國際上現有的各種鍵盤來使用,則使用 System.Windows.Forms.SendKeys.Send(System.String) 可能會產生無法預期的結果,應該要避免。

若要將按鍵動作傳送至相同的應用程式

  • 呼叫 SendKeys 類別的 SendSendWait 方法。應用程式目前使用中的控制項就會接收指定的按鍵動作。當使用者按兩下表單表面時,下列程式碼範例是使用 Send,以模擬按下 ENTER 鍵的動作。這個範例是假設 Form 含有一個定位點索引為 0 的 Button 控制項。

    // Send a key to the button when the user double-clicks anywhere 
    // on the form.
    private void Form1_DoubleClick(object sender, EventArgs e)
    {
        // Send the enter key to the button, which raises the click 
        // event for the button. This works because the tab stop of 
        // the button is 0.
        SendKeys.Send("{ENTER}");
    }
    
    

若要將按鍵動作傳送至不同的應用程式

  • 啟動會接收按鍵動作的應用程式視窗,然後呼叫 SendSendWait 方法。因為沒有 Managed 方法可用來啟動另一個應用程式,所以您必須使用原生 Windows 方法強制將焦點放在其他應用程式上。下列程式碼範例是使用平台叫用以呼叫 FindWindowSetForegroundWindow 方法而啟動 [小算盤] 應用程式視窗,然後再呼叫 SendWait 將一系列的計算發送至 [小算盤] 應用程式。

    // Get a handle to an application window.
    [DllImport("USER32.DLL")]
    public static extern IntPtr FindWindow(string lpClassName,
        string lpWindowName);
    
    // Activate an application window.
    [DllImport("USER32.DLL")]
    public static extern bool SetForegroundWindow(IntPtr hWnd);
    
    // Send a series of key presses to the Calculator application.
    private void button1_Click(object sender, EventArgs e)
    {
        // Get a handle to the Calculator application. The window class
        // and window name were obtained using the Spy++ tool.
        IntPtr calculatorHandle = FindWindow("SciCalc", "Calculator");
    
        // Verify that Calculator is a running process.
        if (calculatorHandle == IntPtr.Zero)
        {
            MessageBox.Show("Calculator is not running.");
            return;
        }
    
        // Make Calculator the foreground application and send it 
        // a set of calculations.
        SetForegroundWindow(calculatorHandle);
        SendKeys.SendWait("111");
        SendKeys.SendWait("*");
        SendKeys.SendWait("11");
        SendKeys.SendWait("=");
    }
    
    

範例

下列程式碼範例是先前程式碼範例的完整應用程式。

using System;
using System.Runtime.InteropServices;
using System.Drawing;
using System.Windows.Forms;

namespace SimulateKeyPress
{
    class Form1 : Form
    {
        private Button button1 = new Button();

        [STAThread]
        public static void Main()
        {
            Application.EnableVisualStyles();
            Application.Run(new Form1());
        }

        public Form1()
        {
            button1.Location = new Point(10, 10);
            button1.TabIndex = 0;
            button1.Text = "Click to automate Calculator";
            button1.AutoSize = true;
            button1.Click += new EventHandler(button1_Click);

            this.DoubleClick += new EventHandler(Form1_DoubleClick);
            this.Controls.Add(button1);
        }

        // Get a handle to an application window.
        [DllImport("USER32.DLL")]
        public static extern IntPtr FindWindow(string lpClassName,
            string lpWindowName);

        // Activate an application window.
        [DllImport("USER32.DLL")]
        public static extern bool SetForegroundWindow(IntPtr hWnd);

        // Send a series of key presses to the Calculator application.
        private void button1_Click(object sender, EventArgs e)
        {
            // Get a handle to the Calculator application. The window class
            // and window name were obtained using the Spy++ tool.
            IntPtr calculatorHandle = FindWindow("SciCalc", "Calculator");

            // Verify that Calculator is a running process.
            if (calculatorHandle == IntPtr.Zero)
            {
                MessageBox.Show("Calculator is not running.");
                return;
            }

            // Make Calculator the foreground application and send it 
            // a set of calculations.
            SetForegroundWindow(calculatorHandle);
            SendKeys.SendWait("111");
            SendKeys.SendWait("*");
            SendKeys.SendWait("11");
            SendKeys.SendWait("=");
        }

        // Send a key to the button when the user double-clicks anywhere 
        // on the form.
        private void Form1_DoubleClick(object sender, EventArgs e)
        {
            // Send the enter key to the button, which raises the click 
            // event for the button. This works because the tab stop of 
            // the button is 0.
            SendKeys.Send("{ENTER}");
        }
    }
}

編譯程式碼

這項範例需要:

請參閱

本文對您有任何幫助嗎?
(剩餘 1500 個字元)
感謝您提供意見

社群新增項目

新增
Microsoft 正展開一份線上問卷調查,了解您對於 MSDN 網站的看法。 如果您選擇參加,您離開 MSDN 網站時即會顯示線上問卷調查。

您是否想要參加?
顯示:
© 2014 Microsoft. 著作權所有,並保留一切權利。