日期:2014-05-17  浏览次数:21362 次

C#操作API相关文档,使用API选择TreeView节点,使用API控制TreeView滚动条,使用API控制接收消息的时候任务栏高亮效果,使用API移动窗体

项目告一段落了,整理下在项目中使用WINDOWS的API的理解
API常用的三大模块:
user32.dll(Windows用户界面相关应用程序接口,用于包括Windows处理,基本用户界面等特性,如创建窗口和发送消息);
gdi32.dll(Windows GDI图形用户界面相关程序,包含的函数用来绘制图像和显示文字);
kernel32.dll(控制着系统的内存管理、数据的输入输出操作和中断处理);

使用API可以做一些控件没办法实现的功能,以及程序比较棘手的问题,下面这个几个例子是我在项目开发中遇到的,我把它整理出来,希望对大家有帮助.
例子中没有你想要的例子,我对API的熟悉,你有需要用到API的话,我们可以一起找资料,互相探讨,互相学习.解决你项目中实际遇到的问题.

1.使用API选择TreeView节点(由于TreeView的SelectNode只能选中一级节点,没办法选中二级节点)

?[DllImport("user32.dll ", CharSet = CharSet.Unicode)]
??????? private static extern int SendMessage(int hWnd, int msg, IntPtr wParam, IntPtr lparam);

??????? #region "常量定义 "
??????? private const int TVGN_CARET = 0x00000009;
??????? private const int TVM_SELECTITEM = 0x0000110b;
??????? private const int TVGN_ROOT = 0x00000000;
??????? private const int TVM_GETNEXTITEM = 0x0000110a;
??????? private const int TVIF_TEXT = 0x0001;
??????? private const int TVGN_NEXT = 0x00000001;
??????? private const int TVM_GETITEM = 0x0000110c;
??????? private const int TVGN_CHILD = 0x00000004;
??????? private const int GMEM_FIXED = 0x0000;
??????? #endregion

??????? /// <summary>
??????? /// 选取TreeView指定项
??????? /// </summary>
??????? /// <param name= "TreeViewHwnd "> 树对象句柄 </param>
??????? /// <param name= "ItemHwnd "> 节点对象句柄 </param>
??????? /// <returns> 成功选中返回true 没找到返回false </returns>
??????? public static bool SelectNode(IntPtr TreeViewHwnd, IntPtr ItemHwnd)
??????? {
??????????? int result = SendMessage(TreeViewHwnd.ToInt32(), TVM_SELECTITEM, new IntPtr(TVGN_CARET), ItemHwnd);
??????????? if (result == 0)
??????????? {
??????????????? return false;
??????????? }
??????????? else
??????????? {
??????????????? return true;
??????????? }
??????? }
??????? #endregion

?调用方法:SelectNode(this.tvFriendShow.Handle, sel.Handle); //TreeView句柄,节点句柄

2.使用API控制TreeView滚动条(其他控件的滚动条一样的,变换下句柄就可以了)
?//获取滚动条的位置
?[DllImport("user32.dll", EntryPoint = "GetScrollPos")]
??????? public static extern int GetScrollPos(IntPtr hwnd, int nbar);
?//设置滚动条的位置
??????? [DllImport("user32.dll", EntryPoint = "SetScrollPos")]
??????? public static extern int SetScrollPos(IntPtr hwnd, int nBar, int nPos, bool bRedraw);

??????? public const int sb_horz = 0; //滚动条水平常量

??????? public const int sb_vert = 1; //滚动条垂直常量

??????? private int nPos = 0; //原始滚动条的位置


?调用方法:
?nPos = GetScrollPos(tvFriendShow.Handle, sb_vert); //获取滚动条的位置(TreeView句柄,滚动条的方向/水平/垂直)

?SetScrollPos(tvFriendShow.Handle, sb_vert, nPos, false); //设置滚动条位置(TreeView句柄,滚动条的方向/水平/垂直,滚动条的位置,是否重新描绘)


3.使用API控制接收消息的时候任务栏高亮效果(提醒用户接收到消息,提高用户体验)
?[DllImport("user32.dll")]
??????? public static extern bool FlashWindow(
?????????? IntPtr hWnd,?????????? //? 要闪烁显示的窗口的句柄。?
?????????? bool bInvert?????? //?? flash?? status?? TRUE(非零)表示切换窗口标题;FALSE返回最初状态。
??????? );
?调用方法:FlashWindow(this.Handle, true);//活动状态

4.使用API移动窗体(根据窗体需要可能要隐藏窗体边框,就无法移动窗体,使用API移动窗体实现移动效果)
?[DllImport("User32.dll", EntryPoint = "SendMessage")]
??????? private static extern int SendMessage(int hWnd, int Msg, int wParam, int lParam);
??????? [DllImport("User32.dll", EntryPoint = "ReleaseCapture")]
??????? private static extern int ReleaseCapture();
?
?调用方法:
?/// <summary>
??????? /// 鼠标按下的时候做处理
??????? /// </summary>
??????? /// <param name="sender"></param>
??????? /// <param name="e"></param>
?private void pnlTitle_MouseDown(object sender, MouseEventArgs e)
??????? {
??//判断用户按下的是否是左键
??????????? if (e.Button == MouseButtons.Left)
??????????? {
??????????????? ReleaseCapture();//移动
??????????????? SendMessage(this.Handle.ToInt32(), 0x0112, 0xF012, 0);//将窗体移动到指定位置
???????????