[C#]送出特定應用程式的鍵盤事件(抓Chrome為例)

本紀錄為如何由C#進行其他應用程式存取
透過Visual studio 提供工具 Spy++ 抓取應用程式類別及title
在透過user32.dll進行存取

Spy++是Visual studio提供的工具
目錄位置位於Visual studio安裝下例如

C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\Tools\spyxx.exe

利用搜尋工具,點選後拖曳滑鼠找到你要的目標視窗

移動滑鼠到Chrome時會顯示如下

找到目標應用程式視窗

呼叫user32.dll FindWindows
傳入部分的lpClassName就是Spyxx抓到的類別
lpWindowName就是標題

DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr FindWindow([MarshalAs(UnmanagedType.LPTStr)] string lpClassName, [MarshalAs(UnmanagedType.LPTStr)] string lpWindowName);
       
IntPtr Handle = 
FindWindow("Chrome_WidgetWin_1",
 "GOOGLE - Google 搜尋 - Google Chrome");

其中Chrome_WidgetWin_1是Chrome的類別
“GOOGLE – Google 搜尋 – Google Chrome”是現在分頁的名稱

判斷是否正確抓取視窗

if (Handle == IntPtr.Zero)
{
    MessageBox.Show("Handle is not running.");
    return;
}

將應用程式帶到前景

[DllImport("USER32.DLL")]
public static extern bool SetForegroundWindow(IntPtr hWnd);

呼叫SetForegroundWindow來將應用程式帶到前景

SetForegroundWindow(Handle);

送出鍵盤資訊

記得呼叫user32.dll

[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, uint lParam);

呼叫函數送出

SendKeys.SendWait("{RIGHT}");
SendKeys.SendWait("111");
SendKeys.SendWait("*");
SendKeys.SendWait("11");
SendKeys.SendWait("=");

Key list 清單如下

https://docs.microsoft.com/zh-tw/dotnet/api/system.windows.forms.sendkeys.send?view=netframework-4.8

參考連結

https://xiang1023.blogspot.com/2017/11/c_6.html

http://mirlab.org/jang/books/wsh/sendKeys.asp?title=24-10%20%B6%C7%B0e%C1%E4%BDL%A8%C6%A5%F3

發佈留言