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);//将窗体移动到指定位置
            }
        }

你可能感兴趣的:(C++,c,windows,C#,项目管理)