项目告一段落了,整理下在项目中使用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);//将窗体移动到指定位置
}
}