C# WinAPI 编程详解 (二 )

忙活了一上午,总结出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;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_23018459/article/details/80480480
今日推荐