using System.Text;
using System;
using System.Runtime.InteropServices;
using System.Collections;
using System.Collections.Generic;
namespace Win32API
{
public class WinAPI
{
#region "API函数定义 "
[DllImport("user32.dll ", CharSet = CharSet.Unicode)]
private static extern int SendMessage(int hWnd, int msg, IntPtr wParam, IntPtr lparam);
[DllImport("user32.dll ", CharSet = CharSet.Unicode)]
private static extern int SendMessage(int hWnd, int msg, IntPtr wParam, TVITEM lparam);
[DllImport("user32.dll ", CharSet = CharSet.Auto)]
public static extern IntPtr SendMessage(IntPtr hWnd, int Msg, int wParam, IntPtr lParam);
[DllImport("user32.dll ", CharSet = CharSet.Auto)]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, string lParam);
//此处用于将窗口设置在最前
[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern bool SendMessage(IntPtr hWnd,
int hWndInsertAfter,
int X,
int Y,
int cx,
int cy,
int uFlags
);
//此处用于向窗口发送消息
[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
[DllImport("User32.dll", EntryPoint = "SendMessage")]
public static extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, string lParam);
[DllImport("user32.dll")]
public static extern int EnumChildWindows(int hWndParent, EnumChildWndProc lpfn, int lParam);
[DllImport("user32.dll ")]
public static extern int GetWindowText(int hWnd, StringBuilder lpString, int nMaxCount);
[DllImport("user32.dll ")]
public static extern int GetClassName(int hwnd, StringBuilder lpClassName, int nMaxCount);
[DllImport("kernel32 ", CharSet = CharSet.Unicode)]
public static extern int CopyMemory(StringBuilder Destination, IntPtr Source, int Length);
[DllImport("kernel32 ", CharSet = CharSet.Unicode)]
public static extern int GlobalAlloc(int wFlags, int dwBytes);
[DllImport("kernel32 ", CharSet = CharSet.Unicode)]
public static extern int GlobalFree(IntPtr hMem);
#endregion
#region 委托定义
///
/// 回调函数代理
///
public delegate bool EnumChildWndProc(int hwnd, int lParam);
///
/// 子窗口回调函数代理
///
public static EnumChildWndProc childWindowProcess = new EnumChildWndProc(ChildWindowProcess);
#endregion
#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;
private const int GMEM_Expand = 0x1102;
private const int WM_SYSCOMMAND = 0x0112;
private const int SC_MAXIMIZE = 0xF030;
private const int SC_MINIMIZE = 0xf020;
private const int SC_RESTORE = 0xF120;
private const int SC_CLOSE = 0xF060;
private const int WM_SETTEXT = 0x000C;
private const int WM_CLICK = 0x00F5;
private const int CB_SELECTSTRING = 0x014D;
private const int LB_ADDSTRING = 0x0180;
private const int wm_syskeydown = 0x0104, vk_down = 0x28;
private const int LB_DELETESTRING = 0x0182;
private const int LB_SETCURSEL = 0x0186;
private const int BM_CLICK = 0x00F5;
const int CB_SHOWDROPDOWN = 0x014F;
#endregion
#region TreeView操作
///
/// 选取TreeView指定项
///
/// 树对象句柄
/// 节点对象句柄
/// 成功选中返回true 没找到返回false
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;
}
}
///
/// 获取TreeView根节点
///
/// 树对象句柄
/// 成功返回根节点句柄 否则返回 0
public static IntPtr GetRoot(IntPtr TreeViewHwnd)
{
TVITEM tv = new TVITEM();
IntPtr hStr = Marshal.AllocHGlobal(1024);
tv.hItem = TreeViewHwnd;
tv.mask = TVIF_TEXT;
tv.pszText = hStr;
tv.cchTextMax = 1024;
int result = SendMessage(TreeViewHwnd.ToInt32(), TVM_GETNEXTITEM, new IntPtr(TVGN_ROOT), tv);
Marshal.FreeHGlobal(hStr);
return new IntPtr(result);
}
///
/// 获取同级下一节点句柄
///
/// 树对象句柄
/// 上一项节点句柄
/// 成功返回下一项节点句柄 否则返回 0
public static IntPtr GetNextItem(IntPtr TreeViewHwnd, IntPtr PrevHwnd)
{
int mbHwnd = 0;
mbHwnd = SendMessage(TreeViewHwnd.ToInt32(), TVM_GETNEXTITEM, new IntPtr(TVGN_NEXT), PrevHwnd);
return new IntPtr(mbHwnd);
}
///
/// 获取第一个子节点句柄
///
/// 树对象句柄
/// 父节点句柄
/// 成功返回第一个子节点句柄 否则返回 0
public static IntPtr GetFirstChildItem(IntPtr TreeViewHwnd, IntPtr ParentHwnd)
{
int result = SendMessage(TreeViewHwnd.ToInt32(), TVM_GETNEXTITEM, new IntPtr(TVGN_CHILD), ParentHwnd);
return new IntPtr(result);
}
///
/// 获取指定项文本
///
/// 树对象句柄
/// 节点句柄
///
public static string GetItemText(IntPtr TreeViewHwnd, IntPtr ItemHwnd)
{
StringBuilder sb = new StringBuilder(1024);
int hStr = GlobalAlloc(GMEM_FIXED, 1024);
if (hStr > 0)
{
TVITEM tv = new TVITEM();
tv.mask = TVIF_TEXT;
tv.HTreeItem = ItemHwnd.ToInt32();
tv.pszText = new IntPtr(hStr);
tv.cchTextMax = 1023;
int i = SendMessage(TreeViewHwnd.ToInt32(), TVM_GETITEM, IntPtr.Zero, tv);
int iCopy = CopyMemory(sb, new IntPtr(hStr), 1024);
GlobalFree(new IntPtr(hStr));
}
return sb.ToString();
}
///
/// 获取指定项文本
///
/// 树对象句柄
/// 节点句柄
///
public static string GetItemText2(IntPtr TreeViewHwnd, IntPtr ItemHwnd)
{
IntPtr hStr = Marshal.AllocHGlobal(1024);
TVITEM tv = new TVITEM();
tv.hItem = ItemHwnd;
tv.mask = TVIF_TEXT;
tv.pszText = hStr;
tv.cchTextMax = 1024;
StringBuilder sb = new StringBuilder(1024);
int result = SendMessage(TreeViewHwnd.ToInt32(), TVM_GETITEM, new IntPtr(0), tv);
int iCopy = CopyMemory(sb, hStr, 1024);
Marshal.FreeHGlobal(hStr);
return sb.ToString();
}
///
/// 展开节点
///
/// 树对象句柄
/// 节点句柄
/// 要展开的节点索引
public static IntPtr ExpandNode(IntPtr TreeViewHwnd, IntPtr ItemHwnd, int index)
{
return SendMessage(TreeViewHwnd, GMEM_Expand, index, ItemHwnd);
}
#endregion
#region 窗体操作
///
/// 关闭窗体
///
///
public static void SetWindowClose(IntPtr hWnd)
{
SendMessage(hWnd, WM_SYSCOMMAND, SC_CLOSE, 0);
}
///
/// 窗体恢复原来的大小
///
///
public static void SetWindowRestore(IntPtr hWnd)
{
SendMessage(hWnd, WM_SYSCOMMAND, SC_RESTORE, 0);
}
///
/// 窗口最小化
///
///
public static void SetWindowMin(IntPtr hWnd)
{
SendMessage(hWnd, WM_SYSCOMMAND, SC_MINIMIZE, 0);
}
///
/// 窗口最大化
///
///
public static void SetWindowMax(IntPtr hWnd)
{
SendMessage(hWnd, WM_SYSCOMMAND, SC_MAXIMIZE, 0);
}
///
/// 窗口置前
///
///
public static void SetWindowPos(IntPtr hWnd)
{
SendMessage(hWnd, -1, 0, 0, 0, 0, 3);
}
#endregion
#region 列表框操作
///
/// 查询ListBox中的文本
///
///
///
/// 索引,没找到返回-1
public static int QueryListBoxItem(IntPtr listboxHwnd, string queryText)
{
return SendMessage(listboxHwnd, 0x018F, -1, queryText);
}
///
/// 向列表添加项
///
///
///
///
public static int AddItem(IntPtr hwnd, string text)
{
return SendMessage(hwnd, LB_ADDSTRING, (IntPtr)0, text);
}
///
/// 删除列表项
///
///
/// 项的索引(以0为基数)
/// 删除后列表项数;如果nIndex比总数大时,则返回LB_ERR. (int)
public static int DeleteItem(IntPtr hwnd, int itemIndex)
{
return SendMessage((IntPtr)hwnd, LB_DELETESTRING, itemIndex, 0);
}
///
/// 设置列表框的当前选择项
/// 只能对单选列表框调用此函数,否则返回LB_ERR
///
///
/// 项索引(以0为基数),若为-1,则设列表框为无选则壮态
/// 返回值:成功,原本的选择项索引.若失败,则返回LB_ERR. (int)
public static int SelectItem(IntPtr hwnd, int itemIndex)
{
return SendMessage(hwnd, LB_SETCURSEL, itemIndex, 0);
}
#endregion
///
/// 单击RadioButton,CheckBox实现选中或反选
///
///
///
public static int ClickCheckCon(IntPtr hwnd)
{
return SendMessage(hwnd, BM_CLICK, 0, 0);
}
///
/// 为可输入控件赋值
///
///
///
///
public static int SetText(IntPtr hwnd, string text)
{
return SendMessage(hwnd, WM_SETTEXT, (IntPtr)0, text);
}
///
/// 模拟单击
///
///
///
public static int ClickCon(IntPtr hwnd)
{
return SendMessage(hwnd, WM_CLICK, (IntPtr)0, "0");
}
///
/// 设置下拉控件选中值
///
///
///
///
public static int SelectCommBoxText(IntPtr hwnd, string text)
{
return SendMessage(hwnd, CB_SELECTSTRING, (IntPtr)0, text);
}
///
/// 强制ComboBox弹出下拉框
///
///
///
public static int SelectCommBoxText(IntPtr hwnd)
{
return SendMessage((IntPtr)hwnd, CB_SHOWDROPDOWN, 1, 0);
}
///
/// 展开日期下拉
///
///
/// IntPtr
public static int DownDateTimePicker(IntPtr hwnd)
{
return SendMessage(hwnd, wm_syskeydown, vk_down, 0);
}
static int m_iChildFor = 0;
public static Dictionary m_AlChildConHwnd = new Dictionary();
///
/// 子窗口回调处理函数
///
///
///
///
public static bool ChildWindowProcess(int hwnd, int lParam)
{
StringBuilder _sbClassName = new StringBuilder(255);
WinAPI.GetClassName(hwnd, _sbClassName, 255);
m_AlChildConHwnd.Add((IntPtr)hwnd, _sbClassName.ToString());
//if (_sbClassName.ToString().Contains("EDIT"))
//{
// m_AlChildConHwnd.Add((IntPtr)hwnd, m_iChildFor.ToString());
// m_iChildFor++;
//}
//else if (_sbClassName.ToString().Contains("BUTTON"))
//{
// m_AlChildConHwnd.Add((IntPtr)hwnd, m_iChildFor.ToString());
// m_iChildFor++;
//}
//else if (_sbClassName.ToString().Contains("COMBOBOX"))
//{
// m_AlChildConHwnd.Add((IntPtr)hwnd, m_iChildFor.ToString());
// m_iChildFor++;
//}
return true;
}
}
///
/// TV_ITEM结构
///
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public class TVITEM
{
public int mask;
public IntPtr hItem;
public int state;
public int stateMask;
public IntPtr pszText;
public int cchTextMax;
public int iImage;
public int iSelectedImage;
public int cChildren;
public IntPtr lParam;
public int HTreeItem;
}
}
API常用函数封装
最新推荐文章于 2024-07-10 14:52:21 发布