• 00
  • :
  • 00
  • :
  • 00

User32API

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);

 

posted @ 2020-11-13 08:12  Garson_Zhang  阅读(280)  评论(0编辑  收藏  举报