由於我平常會用到的Windows API幾乎都實作成.Net可以簡單使用的之後就存在DLL檔裡面,並且為了方便日後使用且根據Microsoft的規則集,我習慣把原生方法整理在NativeMethods類別裡面。
如果有閱讀小弟其他範例也會用這篇文章。
※全文歡迎轉載但請註明出處,謝謝。※
1. 滑鼠相關:
mouse_event:用於模擬各種滑鼠點擊行為。(聽說可以模擬移動,但我沒成功過。)
1 [DllImport("User32")] 2 public extern static void mouse_event(int dwFlags, int dx, int dy, int dwData, IntPtr dwExtraInfo);
SetCursorPos:用於設定滑鼠游標在螢幕中的座標位置。
1 [DllImport("User32")] 2 public extern static void SetCursorPos(int x, int y);
GetCursorPos:用於取得滑鼠游標在螢幕中的座標位置。
1 [DllImport("User32")] 2 public extern static bool GetCursorPos(out Point p);
ShowCursor:用於設定是否顯示滑鼠游標在螢幕上。(僅作用於該執行緒上的所有視窗)
1 [DllImport("User32")] 2 public extern static int ShowCursor(bool bShow);
2. 視窗相關:
FindWindow:透過字串尋找目前開啟中的視窗,其標題與之符合的視窗控制代碼。
1 [DllImport("USER32.DLL", CharSet = CharSet.Unicode, ThrowOnUnmappableChar = true)] 2 public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[範例:待續]
SetForegroundWindow:試著讓指定視窗控制代碼的視窗取得焦點。
[DllImport("USER32.DLL")] public static extern bool SetForegroundWindow(IntPtr hWnd);
[範例:待續]
3. 鍵盤相關:
keybd_event:用於模擬鍵盤按下放開行為。
1 [DllImport("user32.dll")] 2 public static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo);
GetKeyState:取得鍵盤按鍵的狀態,也可用來取得NumLock、CapsLock、ScrollLock是否啟動。
1 [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true, CallingConvention = CallingConvention.Winapi)] 2 public static extern short GetKeyState(int keyCode);
4.Windows Hook相關:
SetWindowsHookEx:用來向Windows註冊Hook來接收全域事件。
1 [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] 2 public static extern int SetWindowsHookEx(int idHook, NativeStructs.HookProc lpfn, IntPtr hInstance, int threadId);
UnhookWindowsHookEx:用來向Window解除已經註冊的Hook。
1 [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] 2 public static extern bool UnhookWindowsHookEx(int idHook);
CallNextHookEx:將Hook事件傳給Windows的下一個Hook。
1 [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] 2 public static extern int CallNextHookEx(int idHook, int nCode, IntPtr wParam, IntPtr lParam);
[範例:接收全域滑鼠事件(Windows Hook for Mouse)]
5.輸入法相關:
1 [DllImport("Imm32.dll")] 2 public static extern IntPtr ImmGetContext(IntPtr hWnd);
1 [DllImport("Imm32.dll")] 2 public static extern IntPtr ImmAssociateContext(IntPtr hWnd, IntPtr hIMC);
NativeMethods類別的完整程式碼:
1 internal static class NativeMethods 2 { 3 #region #####Mouse##### 4 [STAThread] 5 [DllImport("User32")] 6 public extern static void mouse_event(int dwFlags, int dx, int dy, int dwData, IntPtr dwExtraInfo); 7 [DllImport("User32")] 8 public extern static void SetCursorPos(int x, int y); 9 [DllImport("User32")] 10 public extern static bool GetCursorPos(out Point p); 11 [DllImport("User32")] 12 public extern static int ShowCursor(bool bShow); 13 #endregion 14 15 #region #####Window##### 16 [DllImport("USER32.DLL", CharSet = CharSet.Unicode, ThrowOnUnmappableChar = true)] 17 public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 18 [DllImport("USER32.DLL")] 19 public static extern bool SetForegroundWindow(IntPtr hWnd); 20 #endregion 21 22 #region #####Keyboard##### 23 [DllImport("user32.dll")] 24 public static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo); 25 [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true, CallingConvention = CallingConvention.Winapi)] 26 public static extern short GetKeyState(int keyCode); 27 #endregion 28 29 #region #####Art##### 30 31 [DllImport("shell32.dll")] 32 public static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, ref Art.GetIncoIntPtrStruct.SHFILEINFO psfi, uint cbSizeFileInfo, uint uFlags); 33 34 [DllImport("user32.dll")] 35 public static extern bool ClientToScreen(IntPtr hWnd, ref Art.DismantleElmentStruct.POINT lpPoint); 36 37 [DllImport("user32.dll")] 38 public static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint); 39 40 #endregion 41 42 #region #####Device##### 43 [DllImport("User32.dll")] 44 public static extern bool GetLastInputInfo(ref Device.LASTINPUTINFO info); 45 #endregion 46 47 #region #####Hook##### 48 49 [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] 50 public static extern int SetWindowsHookEx(int idHook, NativeStructs.HookProc lpfn, IntPtr hInstance, int threadId); 51 [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] 52 public static extern bool UnhookWindowsHookEx(int idHook); 53 [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] 54 public static extern int CallNextHookEx(int idHook, int nCode, IntPtr wParam, IntPtr lParam); 55 56 #endregion 57 58 #region #####Window##### 59 [DllImport("user32.dll")] 60 public static extern int GetForegroundWindow(); 61 [DllImport("user32.dll", CharSet = CharSet.Auto)] 62 public static extern int GetWindowText(int hWnd, String str, Int32 count); 63 [DllImport("user32.dll", CharSet = CharSet.Auto)] 64 public static extern bool SetWindowText(int hWnd, string lpString); 65 [DllImport("user32.dll", CharSet = CharSet.Auto)] 66 public static extern int GetWindowTextLength(int hWnd); 67 [DllImport("user32.dll")] 68 public static extern IntPtr WindowFromPoint(Point Point); 69 [DllImport("user32.dll")] 70 public static extern int GetFocus(); 71 #endregion 72 73 #region #####Input Method Editor##### 74 [DllImport("Imm32.dll")] 75 public static extern IntPtr ImmGetContext(IntPtr hWnd); 76 [DllImport("Imm32.dll")] 77 public static extern IntPtr ImmAssociateContext(IntPtr hWnd, IntPtr hIMC); 78 [DllImport("Imm32.dll")] 79 public static extern Boolean ImmReleaseContext(IntPtr hWnd, IntPtr hIMC); 80 #endregion 81 82 [DllImport("user32")] 83 public static extern int GetDoubleClickTime(); 84 [DllImport("user32")] 85 public static extern int ToAscii(int uVirtKey, int uScanCode, byte[] lpbKeyState, byte[] lpwTransKey, int fuState); 86 [DllImport("user32")] 87 public static extern int GetKeyboardState(byte[] pbKeyState); 88 [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] 89 public static extern IntPtr GetModuleHandle(string lpModuleName); 90 [DllImport("user32.dll")] 91 public static extern IntPtr SendMessageW(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam); 92 }
【以上原文】http://www.dotblogs.com.tw/optimist9266/archive/2011/06/06/27194.aspx
Win32的API函数是微软自己的东西,可以直接在C#中直接调用,在做WinForm时还是很有帮助的。有时候我们之直接调用Win32 的API,可以很高效的实现想要的效果。
代码
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Runtime.InteropServices; 6 7 namespace WindowsAPI 8 { 9 class CSharp_Win32Api 10 { 11 #region User32.dll 函数 12 /// <summary> 13 /// 该函数检索一指定窗口的客户区域或整个屏幕的显示设备上下文环境的句柄,以后可以在GDI函数中使用该句柄来在设备上下文环境中绘图。hWnd:设备上下文环境被检索的窗口的句柄 14 /// </summary> 15 [DllImport("user32.dll", CharSet = CharSet.Auto)] 16 public static extern IntPtr GetDC(IntPtr hWnd); 17 /// <summary> 18 /// 函数释放设备上下文环境(DC)供其他应用程序使用。 19 /// </summary> 20 public static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC); 21 /// <summary> 22 /// 该函数返回桌面窗口的句柄。桌面窗口覆盖整个屏幕。 23 /// </summary> 24 static public extern IntPtr GetDesktopWindow(); 25 /// <summary> 26 /// 该函数设置指定窗口的显示状态。 27 /// </summary> 28 static public extern bool ShowWindow(IntPtr hWnd, short State); 29 /// <summary> 30 /// 通过发送重绘消息 WM_PAINT 给目标窗体来更新目标窗体客户区的无效区域。 31 /// </summary> 32 static public extern bool UpdateWindow(IntPtr hWnd); 33 /// <summary> 34 /// 该函数将创建指定窗口的线程设置到前台,并且激活该窗口。键盘输入转向该窗口,并为用户改各种可视的记号。系统给创建前台窗口的线程分配的权限稍高于其他线程。 35 /// </summary> 36 static public extern bool SetForegroundWindow(IntPtr hWnd); 37 /// <summary> 38 /// 该函数改变一个子窗口,弹出式窗口式顶层窗口的尺寸,位置和Z序。 39 /// </summary> 40 static public extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int Width, int Height, uint flags); 41 /// <summary> 42 /// 打开剪切板 43 /// </summary> 44 static public extern bool OpenClipboard(IntPtr hWndNewOwner); 45 46 47 /// <summary> 48 /// 关闭剪切板 49 /// </summary> 50 static public extern bool CloseClipboard(); 51 /// <summary> 52 /// 打开清空</summary> 53 static public extern bool EmptyClipboard(); 54 /// <summary> 55 /// 将存放有数据的内存块放入剪切板的资源管理中 56 /// </summary> 57 static public extern IntPtr SetClipboardData(uint Format, IntPtr hData); 58 /// <summary> 59 /// 在一个矩形中装载指定菜单条目的屏幕坐标信息 60 /// </summary> 61 static public extern bool GetMenuItemRect(IntPtr hWnd, IntPtr hMenu, uint Item, ref RECT rc); 62 63 [DllImport("user32.dll", ExactSpelling = true, CharSet = CharSet.Auto)] 64 /// <summary> 65 /// 该函数获得一个指定子窗口的父窗口句柄。 66 /// </summary> 67 public static extern IntPtr GetParent(IntPtr hWnd); 68 /// <summary> 69 /// 该函数将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回。 70 /// </summary> 71 /// <param name="hWnd">其窗口程序将接收消息的窗口的句柄</param> 72 /// <param name="msg">指定被发送的消息</param> 73 /// <param name="wParam">指定附加的消息指定信息</param> 74 /// <param name="lParam">指定附加的消息指定信息</param> 75 /// <returns></returns> 76 public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, int lParam); 77 public static extern IntPtr SendMessage(IntPtr hWnd, int msg, int wParam, IntPtr lParam); 78 public static extern void SendMessage(IntPtr hWnd, int msg, int wParam, ref RECT lParam); 79 public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, ref POINT lParam); 80 public static extern void SendMessage(IntPtr hWnd, int msg, int wParam, ref TBBUTTON lParam); 81 public static extern void SendMessage(IntPtr hWnd, int msg, int wParam, ref TBBUTTONINFO lParam); 82 public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, ref REBARBANDINFO lParam); 83 public static extern void SendMessage(IntPtr hWnd, int msg, int wParam, ref TVITEM lParam); 84 public static extern void SendMessage(IntPtr hWnd, int msg, int wParam, ref LVITEM lParam); 85 public static extern void SendMessage(IntPtr hWnd, int msg, int wParam, ref HDITEM lParam); 86 public static extern void SendMessage(IntPtr hWnd, int msg, int wParam, ref HD_HITTESTINFO hti); 87 /// <summary> 88 /// 该函数将一个消息放入(寄送)到与指定窗口创建的线程相联系消息队列里 89 /// </summary> 90 public static extern IntPtr PostMessage(IntPtr hWnd, int msg, int wParam, int lParam); 91 public static extern IntPtr SetWindowsHookEx(int hookid, HookProc pfnhook, IntPtr hinst, int threadid); 92 93 [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)] 94 public static extern bool UnhookWindowsHookEx(IntPtr hhook); 95 96 [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)] 97 public static extern IntPtr CallNextHookEx(IntPtr hhook, int code, IntPtr wparam, IntPtr lparam); 98 /// <summary> 99 /// 该函数对指定的窗口设置键盘焦点。 100 /// </summary> 101 public static extern IntPtr SetFocus(IntPtr hWnd); 102 /// <summary> 103 /// 该函数在指定的矩形里写入格式化文本,根据指定的方法对文本格式化(扩展的制表符,字符对齐、折行等)。 104 /// </summary> 105 public extern static int DrawText(IntPtr hdc, string lpString, int nCount, ref RECT lpRect, int uFormat); 106 /// <summary> 107 /// 该函数改变指定子窗口的父窗口。 108 /// </summary> 109 public extern static IntPtr SetParent(IntPtr hChild, IntPtr hParent); 110 /// <summary> 111 /// 获取对话框中子窗口控件的句柄 112 /// </summary> 113 public extern static IntPtr GetDlgItem(IntPtr hDlg, int nControlID); 114 /// <summary> 115 /// 该函数获取窗口客户区的坐标。 116 /// </summary> 117 public extern static int GetClientRect(IntPtr hWnd, ref RECT rc); 118 /// <summary> 119 /// 该函数向指定的窗体添加一个矩形,然后窗口客户区域的这一部分将被重新绘制。 120 /// </summary> 121 public extern static int InvalidateRect(IntPtr hWnd, IntPtr rect, int bErase); 122 /// <summary> 123 /// 该函数产生对其他线程的控制,如果一个线程没有其他消息在其消息队列里。 124 /// </summary> 125 public static extern bool WaitMessage(); 126 /// <summary> 127 /// 该函数为一个消息检查线程消息队列,并将该消息(如果存在)放于指定的结构。 128 /// </summary> 129 public static extern bool PeekMessage(ref MSG msg, int hWnd, uint wFilterMin, uint wFilterMax, uint wFlag); 130 /// <summary> 131 /// 该函数从调用线程的消息队列里取得一个消息并将其放于指定的结构。此函数可取得与指定窗口联系的消息和由PostThreadMesssge寄送的线程消息。此函数接收一定范围的消息值。 132 /// </summary> 133 public static extern bool GetMessage(ref MSG msg, int hWnd, uint wFilterMin, uint wFilterMax); 134 /// <summary> 135 /// 该函数将虚拟键消息转换为字符消息。 136 /// </summary> 137 public static extern bool TranslateMessage(ref MSG msg); 138 /// <summary> 139 /// 该函数调度一个消息给窗口程序。 140 /// </summary> 141 public static extern bool DispatchMessage(ref MSG msg); 142 /// <summary> 143 /// 该函数从一个与应用事例相关的可执行文件(EXE文件)中载入指定的光标资源. 144 /// </summary> 145 public static extern IntPtr LoadCursor(IntPtr hInstance, uint cursor); 146 /// <summary> 147 /// 该函数确定光标的形状。 148 /// </summary> 149 public static extern IntPtr SetCursor(IntPtr hCursor); 150 /// <summary> 151 /// 确定当前焦点位于哪个控件上。 152 /// </summary> 153 public static extern IntPtr GetFocus(); 154 /// <summary> 155 /// 该函数从当前线程中的窗口释放鼠标捕获,并恢复通常的鼠标输入处理。捕获鼠标的窗口接收所有的鼠标输入(无论光标的位置在哪里),除非点击鼠标键时,光标热点在另一个线程的窗口中。 156 /// </summary> 157 public static extern bool ReleaseCapture(); 158 /// <summary> 159 /// 准备指定的窗口来重绘并将绘画相关的信息放到一个PAINTSTRUCT结构中。 160 /// </summary> 161 public static extern IntPtr BeginPaint(IntPtr hWnd, ref PAINTSTRUCT ps); 162 /// <summary> 163 /// 标记指定窗口的绘画过程结束,每次调用BeginPaint函数之后被请求 164 /// </summary> 165 public static extern bool EndPaint(IntPtr hWnd, ref PAINTSTRUCT ps); 166 /// <summary> 167 /// 半透明窗体 168 /// </summary> 169 public static extern bool UpdateLayeredWindow(IntPtr hwnd, IntPtr hdcDst, ref POINT pptDst, ref SIZE psize, IntPtr hdcSrc, ref POINT pprSrc, Int32 crKey, ref BLENDFUNCTION pblend, Int32 dwFlags); 170 /// <summary> 171 /// 该函数返回指定窗口的边框矩形的尺寸。该尺寸以相对于屏幕坐标左上角的屏幕坐标给出。 172 /// </summary> 173 public static extern bool GetWindowRect(IntPtr hWnd, ref RECT rect); 174 /// <summary> 175 /// 该函数将指定点的用户坐标转换成屏幕坐标。 176 /// </summary> 177 public static extern bool ClientToScreen(IntPtr hWnd, ref POINT pt); 178 /// <summary> 179 /// 当在指定时间内鼠标指针离开或盘旋在一个窗口上时,此函数寄送消息。 180 /// </summary> 181 public static extern bool TrackMouseEvent(ref TRACKMOUSEEVENTS tme); 182 /// <summary> 183 /// 184 /// </summary> 185 public static extern bool SetWindowRgn(IntPtr hWnd, IntPtr hRgn, bool redraw); 186 /// <summary> 187 /// 该函数检取指定虚拟键的状态。 188 /// </summary> 189 public static extern ushort GetKeyState(int virtKey); 190 /// <summary> 191 /// 该函数改变指定窗口的位置和尺寸。对于顶层窗口,位置和尺寸是相对于屏幕的左上角的:对于子窗口,位置和尺寸是相对于父窗口客户区的左上角坐标的。 192 /// </summary> 193 public static extern bool MoveWindow(IntPtr hWnd, int x, int y, int width, int height, bool repaint); 194 /// <summary> 195 /// 该函数获得指定窗口所属的类的类名。 196 /// </summary> 197 public static extern int GetClassName(IntPtr hWnd, out STRINGBUFFER ClassName, int nMaxCount); 198 /// <summary> 199 /// 该函数改变指定窗口的属性 200 /// </summary> 201 public static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong); 202 /// <summary> 203 /// 该函数检索指定窗口客户区域或整个屏幕的显示设备上下文环境的句柄,在随后的GDI函数中可以使用该句柄在设备上下文环境中绘图。 204 /// </summary> 205 public static extern IntPtr GetDCEx(IntPtr hWnd, IntPtr hRegion, uint flags); 206 /// <summary> 207 /// 获取整个窗口(包括边框、滚动条、标题栏、菜单等)的设备场景 返回值 Long。 208 /// </summary> 209 public static extern IntPtr GetWindowDC(IntPtr hWnd); 210 /// <summary> 211 /// 该函数用指定的画刷填充矩形,此函数包括矩形的左上边界,但不包括矩形的右下边界。 212 /// </summary> 213 public static extern int FillRect(IntPtr hDC, ref RECT rect, IntPtr hBrush); 214 /// <summary> 215 /// 该函数返回指定窗口的显示状态以及被恢复的、最大化的和最小化的窗口位置。 216 /// </summary> 217 public static extern int GetWindowPlacement(IntPtr hWnd, ref WINDOWPLACEMENT wp); 218 /// <summary> 219 /// 该函数改变指定窗口的标题栏的文本内容 220 /// </summary> 221 public static extern int SetWindowText(IntPtr hWnd, string text); 222 /// <summary> 223 /// 该函数将指定窗口的标题条文本(如果存在)拷贝到一个缓存区内。如果指定的窗口是一个控制,则拷贝控制的文本。 224 /// </summary> 225 public static extern int GetWindowText(IntPtr hWnd, out STRINGBUFFER text, int maxCount); 226 /// <summary> 227 /// 用于得到被定义的系统数据或者系统配置信息. 228 /// </summary> 229 static public extern int GetSystemMetrics(int nIndex); 230 /// <summary> 231 /// 该函数设置滚动条参数,包括滚动位置的最大值和最小值,页面大小,滚动按钮的位置。 232 /// </summary> 233 static public extern int SetScrollInfo(IntPtr hwnd, int bar, ref SCROLLINFO si, int fRedraw); 234 /// <summary> 235 /// 该函数显示或隐藏所指定的滚动条。 236 /// </summary> 237 public static extern int ShowScrollBar(IntPtr hWnd, int bar, int show); 238 /// <summary> 239 /// 该函数可以激活一个或两个滚动条箭头或是使其失效。 240 /// </summary> 241 public static extern int EnableScrollBar(IntPtr hWnd, uint flags, uint arrows); 242 /// <summary> 243 /// 该函数将指定的窗口设置到Z序的顶部。 244 /// </summary> 245 public static extern int BringWindowToTop(IntPtr hWnd); 246 /// <summary> 247 /// 该函数滚动指定窗体客户区域的目录。 248 /// </summary> 249 static public extern int ScrollWindowEx(IntPtr hWnd, int dx, int dy,ref RECT rcScroll, ref RECT rcClip, IntPtr UpdateRegion, ref RECT rcInvalidated, uint flags); 250 /// <summary> 251 /// 该函数确定给定的窗口句柄是否识别一个已存在的窗口。 252 /// </summary> 253 public static extern int IsWindow(IntPtr hWnd); 254 /// <summary> 255 /// 该函数将256个虚拟键的状态拷贝到指定的缓冲区中。 256 /// </summary> 257 public static extern int GetKeyboardState(byte[] pbKeyState); 258 /// <summary> 259 /// 该函数将指定的虚拟键码和键盘状态翻译为相应的字符或字符串。该函数使用由给定的键盘布局句柄标识的物理键盘布局和输入语言来翻译代码。 260 /// </summary> 261 public static extern int ToAscii(int uVirtKey,int uScanCode, byte[] lpbKeyState, byte[] lpwTransKey,int fuState); 262 #endregion 263 264 }