public class User32API { private static Hashtable processWnd = null; public delegate bool WNDENUMPROC(IntPtr hwnd, uint lParam); static User32API() { if (processWnd == null) { processWnd = new Hashtable(); } } [DllImport("user32.dll", EntryPoint = "EnumWindows", SetLastError = true)] public static extern bool EnumWindows(WNDENUMPROC lpEnumFunc, uint lParam); [DllImport("user32.dll", EntryPoint = "GetParent", SetLastError = true)] public static extern IntPtr GetParent(IntPtr hWnd); [DllImport("user32.dll", EntryPoint = "GetWindowThreadProcessId")] public static extern uint GetWindowThreadProcessId(IntPtr hWnd, ref uint lpdwProcessId); [DllImport("user32.dll", EntryPoint = "IsWindow")] public static extern bool IsWindow(IntPtr hWnd); [DllImport("kernel32.dll", EntryPoint = "SetLastError")] public static extern void SetLastError(uint dwErrCode); [DllImport("user32.dll")] public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam); [DllImport("User32.dll")] public static extern bool SetForegroundWindow(IntPtr hWnd); [DllImport("user32.dll", CharSet = CharSet.Auto)] public static extern IntPtr GetForegroundWindow(); [DllImport("user32.dll")] public static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, uint dwExtraInfo); public static IntPtr GetCurrentWindowHandle() { IntPtr ptrWnd = IntPtr.Zero; uint uiPid = (uint)Process.GetCurrentProcess().Id; // 当前进程 ID object objWnd = processWnd[uiPid]; if (objWnd != null) { ptrWnd = (IntPtr)objWnd; if (ptrWnd != IntPtr.Zero && IsWindow(ptrWnd)) // 从缓存中获取句柄 { return ptrWnd; } else { ptrWnd = IntPtr.Zero; } } bool bResult = EnumWindows(new WNDENUMPROC(EnumWindowsProc), uiPid); // 枚举窗口返回 false 并且没有错误号时表明获取成功 if (!bResult && Marshal.GetLastWin32Error() == 0) { objWnd = processWnd[uiPid]; if (objWnd != null) { ptrWnd = (IntPtr)objWnd; } } return ptrWnd; } private static bool EnumWindowsProc(IntPtr hwnd, uint lParam) { uint uiPid = 0; if (GetParent(hwnd) == IntPtr.Zero) { GetWindowThreadProcessId(hwnd, ref uiPid); if (uiPid == lParam) // 找到进程对应的主窗口句柄 { processWnd[uiPid] = hwnd; // 把句柄缓存起来 SetLastError(0); // 设置无错误 return false; // 返回 false 以终止枚举窗口 } } return true; } }
public class VK_Keys { //Windows 使用的256个虚拟键码 public const int VK_LBUTTON = 0x1; public const int VK_RBUTTON = 0x2; public const int VK_CANCEL = 0x3; public const int VK_MBUTTON = 0x4; public const int VK_BACK = 0x8; public const int VK_TAB = 0x9; public const int VK_CLEAR = 0xC; public const int VK_RETURN = 0xD; public const int VK_SHIFT = 0x10; public const int VK_CONTROL = 0x11; public const int VK_MENU = 0x12; public const int VK_PAUSE = 0x13; public const int VK_CAPITAL = 0x14; public const int VK_ESCAPE = 0x1B; public const int VK_SPACE = 0x20; public const int VK_PRIOR = 0x21; public const int VK_NEXT = 0x22; public const int VK_END = 0x23; public const int VK_HOME = 0x24; public const int VK_LEFT = 0x25; public const int VK_UP = 0x26; public const int VK_RIGHT = 0x27; public const int VK_DOWN = 0x28; public const int VK_Select = 0x29; public const int VK_PRINT = 0x2A; public const int VK_EXECUTE = 0x2B; public const int VK_SNAPSHOT = 0x2C; public const int VK_Insert = 0x2D; public const int VK_Delete = 0x2E; public const int VK_HELP = 0x2F; public const int VK_0 = 0x30; public const int VK_1 = 0x31; public const int VK_2 = 0x32; public const int VK_3 = 0x33; public const int VK_4 = 0x34; public const int VK_5 = 0x35; public const int VK_6 = 0x36; public const int VK_7 = 0x37; public const int VK_8 = 0x38; public const int VK_9 = 0x39; public const int VK_A = 0x41; public const int VK_B = 0x42; public const int VK_C = 0x43; public const int VK_D = 0x44; public const int VK_E = 0x45; public const int VK_F = 0x46; public const int VK_G = 0x47; public const int VK_H = 0x48; public const int VK_I = 0x49; public const int VK_J = 0x4A; public const int VK_K = 0x4B; public const int VK_L = 0x4C; public const int VK_M = 0x4D; public const int VK_N = 0x4E; public const int VK_O = 0x4F; public const int VK_P = 0x50; public const int VK_Q = 0x51; public const int VK_R = 0x52; public const int VK_S = 0x53; public const int VK_T = 0x54; public const int VK_U = 0x55; public const int VK_V = 0x56; public const int VK_W = 0x57; public const int VK_X = 0x58; public const int VK_Y = 0x59; public const int VK_Z = 0x5A; public const int VK_STARTKEY = 0x5B; public const int VK_CONTEXTKEY = 0x5D; public const int VK_NUMPAD0 = 0x60; public const int VK_NUMPAD1 = 0x61; public const int VK_NUMPAD2 = 0x62; public const int VK_NUMPAD3 = 0x63; public const int VK_NUMPAD4 = 0x64; public const int VK_NUMPAD5 = 0x65; public const int VK_NUMPAD6 = 0x66; public const int VK_NUMPAD7 = 0x67; public const int VK_NUMPAD8 = 0x68; public const int VK_NUMPAD9 = 0x69; public const int VK_MULTIPLY = 0x6A; public const int VK_ADD = 0x6B; public const int VK_SEPARATOR = 0x6C; public const int VK_SUBTRACT = 0x6D; public const int VK_DECIMAL = 0x6E; public const int VK_DIVIDE = 0x6F; public const int VK_F1 = 0x70; public const int VK_F2 = 0x71; public const int VK_F3 = 0x72; public const int VK_F4 = 0x73; public const int VK_F5 = 0x74; public const int VK_F6 = 0x75; public const int VK_F7 = 0x76; public const int VK_F8 = 0x77; public const int VK_F9 = 0x78; public const int VK_F10 = 0x79; public const int VK_F11 = 0x7A; public const int VK_F12 = 0x7B; public const int VK_F13 = 0x7C; public const int VK_F14 = 0x7D; public const int VK_F15 = 0x7E; public const int VK_F16 = 0x7F; public const int VK_F17 = 0x80; public const int VK_F18 = 0x81; public const int VK_F19 = 0x82; public const int VK_F20 = 0x83; public const int VK_F21 = 0x84; public const int VK_F22 = 0x85; public const int VK_F23 = 0x86; public const int VK_F24 = 0x87; public const int VK_NUMLOCK = 0x90; public const int VK_OEM_SCROLL = 0x91; public const int VK_OEM_1 = 0xBA; public const int VK_OEM_PLUS = 0xBB; public const int VK_OEM_COMMA = 0xBC; public const int VK_OEM_MINUS = 0xBD; public const int VK_OEM_PERIOD = 0xBE; public const int VK_OEM_2 = 0xBF; public const int VK_OEM_3 = 0xC0; public const int VK_OEM_4 = 0xDB; public const int VK_OEM_5 = 0xDC; public const int VK_OEM_6 = 0xDD; public const int VK_OEM_7 = 0xDE; public const int VK_OEM_8 = 0xDF; public const int VK_ICO_F17 = 0xE0; public const int VK_ICO_F18 = 0xE1; public const int VK_OEM102 = 0xE2; public const int VK_ICO_HELP = 0xE3; public const int VK_ICO_00 = 0xE4; public const int VK_ICO_CLEAR = 0xE6; public const int VK_OEM_RESET = 0xE9; public const int VK_OEM_JUMP = 0xEA; public const int VK_OEM_PA1 = 0xEB; public const int VK_OEM_PA2 = 0xEC; public const int VK_OEM_PA3 = 0xED; public const int VK_OEM_WSCTRL = 0xEE; public const int VK_OEM_CUSEL = 0xEF; public const int VK_OEM_ATTN = 0xF0; public const int VK_OEM_FINNISH = 0xF1; public const int VK_OEM_COPY = 0xF2; public const int VK_OEM_AUTO = 0xF3; public const int VK_OEM_ENLW = 0xF4; public const int VK_OEM_BACKTAB = 0xF5; public const int VK_ATTN = 0xF6; public const int VK_CRSEL = 0xF7; public const int VK_EXSEL = 0xF8; public const int VK_EREOF = 0xF9; public const int VK_PLAY = 0xFA; public const int VK_ZOOM = 0xFB; public const int VK_NONAME = 0xFC; public const int VK_PA1 = 0xFD; public const int VK_OEM_CLEAR = 0xFE; }
向指定句柄发送按键消息,
var tmp = Process.GetProcessesByName("EzCad2")[0].MainWindowHandle; User32API.SetForegroundWindow(tmp); // 按下 User32API.keybd_event(VK_Keys.VK_CONTROL, 0, 0, 0); User32API.keybd_event(VK_Keys.VK_N, 0, 0, 0); // 抬起 User32API.keybd_event(VK_Keys.VK_N, 0, 2, 0); User32API.keybd_event(VK_Keys.VK_CONTROL, 0, 2, 0); User32API.SetForegroundWindow(this.Handle);