忙活了一上午,总结出WPF 前台一般会用到的API 方法,参数,返回值等还是很详细的!
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.InteropServices; namespace SoftRGB.WinAPI { public delegate bool CallBack(IntPtr hwnd, int lParam); public class User32 { /// <summary> /// 返回指定窗口的边框矩形的尺寸 /// </summary> /// <param name="hWnd">窗口句柄</param> /// <param name="rect">该结构接收窗口的方位的屏幕坐标。</param> /// <returns></returns> [DllImport("user32.dll")] public static extern IntPtr GetWindowRect(IntPtr hWnd, ref RECT rect); /// <summary> /// 设置指定窗口的显示状态。 /// 最大化窗口3,最小化窗口2,正常大小窗口1; /// </summary> [DllImport("user32.dll", EntryPoint = "ShowWindow", CharSet = CharSet.Auto)] public static extern int ShowWindow(IntPtr hwnd, int nCmdShow); /// <summary> /// 检索处理顶级窗口的类名和窗口名称匹配指定的字符串 /// 不搜索子窗口 /// </summary> /// 如果有指定的类名和窗口的名字则表示成功返回一个窗口的句柄。否则返回零。 /// <param name="lpClassName">指向类名</param> /// <param name="lpWindowName">指向窗口名</param> /// <returns></returns> [DllImport("user32.dll")] public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); /// <summary> /// 在窗口列表中寻找与指定条件相符的第一个子窗口 /// </summary> /// <param name="hwndParent">要查找的子窗口所在的父窗口的句柄</param> /// <param name="hwndChildAfter">子窗口句柄</param> /// <param name="lpszClass">指向一个指定了类名的空结束字符串,或一个标识类名字符串的成员的指针</param> /// <param name="lpszWindow">指向一个指定了窗口名(窗口标题)的空结束字符串。如果该参数为 NULL,则为所有窗口全匹配。</param> /// <returns></returns> [DllImport("user32.dll")] public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow); /// <summary> /// 创建指定窗口的线程设置到前台,并且激活该窗口。 /// </summary> /// <param name="hwnd">将要设置前台的窗口句柄.</param> [DllImport("user32.dll", EntryPoint = "SetForegroundWindow", SetLastError = true)] public static extern void SetForegroundWindow(IntPtr hwnd); /// <summary> /// 根据继承关系的函数功能,返回窗口中指定参数ID的子元素的句柄,可以通过返回的句柄对窗口内的子元素进行操作。 /// </summary> /// <param name="hDlg">子类窗口的指针;</param> /// <param name="nIDDlgItem">接收消息的控件的标识;</param> /// <returns>标识所标记的控制窗口句柄;</returns> [DllImport("user32.dll")] public static extern IntPtr GetDlgItem(IntPtr hDlg, int nIDDlgItem); /// <summary> /// 将一个消息放入(寄送)到与指定窗口创建的线程相联系消息队列里, /// 不等待线程处理消息就返回,是异步消息模式。 /// 消息队列里的消息通过调用GetMessage和PeekMessage取得。 /// </summary> /// <param name="hwnd">其窗口程序接收消息的窗口的句柄。可取有特定含义的两个值: ///HWND_BROADCAST:消息被寄送到系统的所有顶层窗口,包括无效或不可见的非自身拥有的窗口、 被覆盖的窗口和弹出式窗口。消息不被寄送到子窗口 ///NULL:此函数的操作和调用参数dwThread设置为当前线程的标识符PostThreadMessage函数一样</param> /// <param name="wMsg">指定被寄送的消息。</param> /// <param name="wParam">指定附加的消息特定的信息。</param> /// <param name="lParam">指定附加的消息特定的信息。</param> /// <returns>如果函数调用成功,返回非零,否则函数调用返回值为零</returns> [DllImport("user32.dll", EntryPoint = "PostMessage")] public static extern int PostMessage(IntPtr hwnd, int wMsg, int wParam, int lParam); /// <summary> /// 将指定的消息发送到一个或多个窗口。 /// 此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回。 /// 而和函数PostMessage不同,PostMessage是将一个消息寄送到一个线程的消息队列后就立即返回。 /// </summary> /// <param name="hwnd">其窗口程序将接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口。</param> /// <param name="wMsg">指定被发送的消息。</param> /// <param name="wParam">指定附加的消息特定信息。</param> /// <param name="lParam">指定附加的消息特定信息。</param> /// <returns>返回值指定消息处理的结果,依赖于所发送的消息。</returns> /// 备注:需要用HWND_BROADCAST通信的应用程序应当使用函数RegisterWindowMessage来为应用程序间的通信取得一个唯一的消息。 [DllImport("user32.dll", EntryPoint = "SendMessage", SetLastError = true, CharSet = CharSet.Auto)] public static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam); /// <summary> /// 该函数合成一次击键事件。 /// 系统可使用这种合成的击键事件来产生WM_KEYUP或WM_KEYDOWN消息,键盘驱动程序的中断处理程序调用keybd_event函数。 /// 在Windows NT中该函数己被使用SendInput来替代它完成操作。 /// </summary> /// <param name="bVk">定义一个虚拟键码。键码值必须在1~254之间。</param> /// <param name="bScan">定义该键的硬件扫描码。</param> /// <param name="dwFlags">定义函数操作的各个方面的一个标志位集。应用程序可使用如下一些预定义常数的组合设置标志位。 /// KEYEVENTF_EXTENDEDKEY:若指定该值,则扫描码前一个值为OXEO(224)的前缀字节。 /// KEYEVENTF_KEYUP:若指定该值,该键将被释放;若未指定该值,该键将被按下。</param> /// <param name="dwExtraInfo">定义与击键相关的附加的32位值。</param> [DllImport("user32")] public static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo); /// <summary> /// 检查与特定父窗口相联的子窗口z序,并返回在z序顶部的子窗口的句柄。 /// </summary> /// <param name="hWnd">被查序的父窗口的句柄。 /// 如果该参数为NULL,函数返回Z序顶部的窗口句柄。</param> /// <returns>如果函数成功,返回值为在Z序顶部的子窗口句柄。如果指定的窗口无子窗口,返回值为NULL。</returns> [DllImport("user32.dll")] public static extern IntPtr GetTopWindow(IntPtr hWnd); /// <summary> /// 窗口的标题条文本(如果存在)拷贝到一个缓存区内。 /// 如果指定的窗口是一个控件,则拷贝控件的文本。 /// 但是,GetWindowText可能无法获取外部应用程序中控件的文本,获取自绘的控 ///件或者是外部的密码编辑框很有可能会失败。 /// </summary> /// <param name="hWnd">带文本的窗口或控件的句柄。</param> /// <param name="lpString">指向接收文本的缓冲区的指针。</param> /// <param name="nMaxCount">指定要保存在缓冲区内的字符的最大个数,其中包含NULL字符。如果文本超过界限,它就被截断。</param> /// <returns>如果函数成功,返回值是拷贝的字符串的字符个数,不包括中断的空字符;如果窗口无标题栏或文本,或标题栏为空,或窗口或控制的句柄无效,则返回值为零。若想获得更多错误信息,请调用GetLastError函数。 ///函数不能返回在其他应用程序中的编辑控件的文本。</returns> [DllImport("user32.dll")] public static extern Int32 GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount); /// <summary> /// 获取指定窗口所属的类的类名。 /// </summary> /// <param name="hWnd">窗口的句柄及间接给出的窗口所属的类。</param> /// <param name="lpClassName">指向接收窗口类名字符串的缓冲区的指针。</param> /// <param name="nMaxCount">指定由参数lpClassName指示的缓冲区的字节数。 /// 如果类名字符串大于缓冲区的长度,则多出的部分被截断。</param> /// <returns>如果函数成功,返回值为拷贝到指定缓冲区的字符个数:如果函数失败,返回值为0。 /// 若想获得更多错误信息,请调用GetLastError函数。</returns> [DllImport("user32.dll")] public static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount); /// <summary> /// 返回与指定窗口有特定关系(如Z序或所有者)的窗口句柄,函数原型是HWND GetWindow(HWND hWnd,UNIT nCmd)。 /// </summary> /// <param name="hWnd">窗口句柄。这个函数要返回的窗口句柄是依据nCmd参数值相对于hWnd参数的关系。</param> /// <param name="uCmd">说明指定窗口与要获得句柄的窗口之间的关系。该参数值可以是下列之一: ///GW_CHILD(&H5):如果指定窗口是父窗口,则获得的是在Tab序顶端的子窗口的句柄,否则为NULL。函数仅检查指定父窗口的子窗口,不检查继承窗口。 ///GW_ENABLEDPOPUP(&H6):(WindowsNT 5.0)返回的句柄标识了属于指定窗口的处于使能状态弹出式窗口(检索使用第一个由GW_HWNDNEXT 查找到的满足前述条件的窗口);如果无使能窗口,则获得的句柄与指定窗口相同。 ///GW_HWNDFIRST(&H0):返回的句柄标识了在Z序最高端的相同类型的窗口。如果指定窗口是最高端窗口,则该句柄标识了在Z序最高端的最高端窗口;如果指定窗口是顶层窗口,则该句柄标识了在z序最高端的顶层窗口:如果指定窗口是子窗口,则句柄标识了在Z序最高端的同属窗口。 ///GW_HWNDLAST(&H1):返回的句柄标识了在z序最低端的相同类型的窗口。如果指定窗口是最高端窗口,则该柄标识了在z序最低端的最高端窗口:如果指定窗口是顶层窗口,则该句柄标识了在z序最低端的顶层窗口;如果指定窗口是子窗口,则句柄标识了在Z序最低端的同属窗口。 ///GW_HWNDNEXT(&H2):返回的句柄标识了在Z序中指定窗口下的相同类型的窗口。如果指定窗口是最高端窗口,则该句柄标识了在指定窗口下的最高端窗口:如果指定窗口是顶层窗口,则该句柄标识了在指定窗口下的顶层窗口;如果指定窗口是子窗口,则句柄标识了在指定窗口下的同属窗口。 ///GW HWNDPREV(&H3):返回的句柄标识了在Z序中指定窗口上的相同类型的窗口。如果指定窗口是最高端窗口,则该句柄标识了在指定窗口上的最高端窗口;如果指定窗口是顶层窗口,则该句柄标识了在指定窗口上的顶层窗口;如果指定窗口是子窗口,则句柄标识了在指定窗口上的同属窗口。 ///GW_OWNER(&H4):返回的句柄标识了指定窗口的所有者窗口(如果存在)。GW_OWNER与GW_CHILD不是相对的参数,没有父窗口的含义,如果想得到父窗口请使用GetParent()。例如:例如有时对话框的控件的GW_OWNER,是不存在的。</param> /// <returns>如果函数成功,返回值为窗口句柄;如果与指定窗口有特定关系的窗口不存在,则返回值为NULL。</returns> [DllImport("user32.dll")] public static extern IntPtr GetWindow(IntPtr hWnd, UInt32 uCmd); /// <summary> /// 功能是找出某个窗口的创建者(线程或进程),返回创建者的标志符,函数原型是DWORD GetWindowThreadProcessId。 /// </summary> /// <param name="hWnd">(向函数提供的)被查找窗口的句柄.</param> /// <param name="lpdwProcessId">进程号的存放地址(变量地址)</param> /// <returns>返回线程号,注意,lpdwProcessId 是存放进程号的变量。返回值是线程号,lpdwProcessId 是进程号存放处。</returns> [DllImport("user32.dll")] public static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId); /// <summary> /// 该函数枚举所有屏幕上的顶层窗口,并将窗口句柄传送给应用程序定义的回调函数。 /// </summary> /// <param name="x">指向一个应用程序定义的回调函数指针</param> /// <param name="y">指定一个传递给回调函数的应用程序定义值</param> /// <returns></returns> [DllImport("user32")] public static extern int EnumWindows(CallBack x, int y); /// <summary> /// 获得一个指定子窗口的父窗口句柄。 /// </summary> /// <param name="hWnd">子窗口句柄,函数要获得该子窗口的父窗口句柄。</param> /// <returns>如果函数成功,返回值为父窗口句柄。如果窗口无父窗口,则函数返回NULL。若想获得更多错误信息,请调用GetLastError函数。</returns> [DllImport("user32")] public static extern int GetParent(IntPtr hWnd); /// <summary> /// 获得指定窗口的可视状态,即显示或者隐藏。 /// </summary> /// <param name="hWnd">被测试窗口的句柄。</param> /// <returns>如果指定的窗口及其父窗口具有WS_VISIBLE风格,返回值为非零;如果指定的窗口及其父窗口不具有WS_VISIBLE风格,返回值为零。由于返回值表明了窗口是否具有Ws_VISIBLE风格,因此,即使该窗口被其他窗口遮盖,函数返回值也为非零。</returns> [DllImport("user32")] public static extern int IsWindowVisible(IntPtr hWnd); } [StructLayout(LayoutKind.Sequential)] public struct RECT { public int left; public int top; public int right; public int bottom; } }