C#调用系统API
2010-12-30 15:57
411 查看
在Windows平台,可以利用很多系统API,而在.net平台下用C#调用系统API是比较方便而且也是比较轻松的事情。
我们可以利用C#调用API实现底层驱动程序驱动某一个部件(如串口通讯)和或者外设进行工作,也可以利用系统API实现图形化GUI功能
系统API一般分为:核心级(kernel32.dll),用户级(User32.dll), 应用级(gdi32.dll)和其他一些外设驱动等.
下面我们来看一个简单例子,用系统API获取窗口句柄。
代码
我们可以利用C#调用API实现底层驱动程序驱动某一个部件(如串口通讯)和或者外设进行工作,也可以利用系统API实现图形化GUI功能
系统API一般分为:核心级(kernel32.dll),用户级(User32.dll), 应用级(gdi32.dll)和其他一些外设驱动等.
下面我们来看一个简单例子,用系统API获取窗口句柄。
代码
public class User32API { private static Hashtable processWnd = null; public delegate bool WNDENUMPROC(IntPtr hwnd, uint lParam); static User32API() { if (processWnd == null) { processWnd = new Hashtable(); } } [DllImport("user32.dll", EntryPoint = "EnumWindows", SetLastError = true)] public static extern bool EnumWindows(WNDENUMPROC lpEnumFunc, uint lParam); [DllImport("user32.dll", EntryPoint = "GetParent", SetLastError = true)] public static extern IntPtr GetParent(IntPtr hWnd); [DllImport("user32.dll", EntryPoint = "GetWindowThreadProcessId")] public static extern uint GetWindowThreadProcessId(IntPtr hWnd, ref uint lpdwProcessId); [DllImport("user32.dll", EntryPoint = "IsWindow")] public static extern bool IsWindow(IntPtr hWnd); [DllImport("kernel32.dll", EntryPoint = "SetLastError")] public static extern void SetLastError(uint dwErrCode); [DllImport("User32.dll", EntryPoint = "SendMessage")] private static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam); Process[] processes; const int WM_CLOSE = 0x0010; public void GetCurrentWindowHandle() { Microsoft.Win32.RegistryKey oRegistryKey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey("Software").OpenSubKey("Amada Software"); string[] subKeys = oRegistryKey.GetSubKeyNames(); IntPtr ptrWnd = IntPtr.Zero; foreach (string subkey in subKeys) { processes = Process.GetProcessesByName(subkey); foreach (Process proc in processes) { uint uiPid = (uint)proc.Id; object objWnd = processWnd[uiPid]; if (objWnd != null) { ptrWnd = (IntPtr)objWnd; if (ptrWnd != IntPtr.Zero && IsWindow(ptrWnd)) { SendMessage(ptrWnd, WM_CLOSE, 0, 0); } else { ptrWnd = IntPtr.Zero; } } bool bResult = EnumWindows(new WNDENUMPROC(EnumWindowsProc), uiPid); if (!bResult && Marshal.GetLastWin32Error() == 0) { objWnd = processWnd[uiPid]; if (objWnd != null) { ptrWnd = (IntPtr)objWnd; SendMessage(ptrWnd, WM_CLOSE, 0, 0); } } } } } private static bool EnumWindowsProc(IntPtr hwnd, uint lParam) { uint uiPid = 0; if (GetParent(hwnd) == IntPtr.Zero) { GetWindowThreadProcessId(hwnd, ref uiPid); if (uiPid == lParam) { processWnd[uiPid] = hwnd; SetLastError(0); return false; } } return true; } }
相关文章推荐
- 使用C#调用系统API实现内存注入的代码
- 使用C#调用系统API实现内存注入
- 在C#中调用系统API使窗体下拥有阴影效果(转)
- C#调用系统API指定快捷键
- C#调用系统API
- C#调用系统API设置桌面背景
- 在C#中调用系统API使窗体下拥有阴影效果(转)
- C# winform使用系统API播放音乐(非调用控件)
- C#调用系统API指定快捷键的方法
- 在C#中调用系统API使窗体下拥有阴影效果
- C#调用系统API实现内存注入的代码
- C#中调用系统API打开和关闭光驱
- [C#] 如何调用Windows系统发送错误API
- C# 调用系统API 内核 简单样例
- java开发系统内核:实现系统API调用
- excel在系统中集成调用的方法,C#
- C#中调用WIN32的API
- C#区域截图——调用API截图
- C#调用GoogleEarth COM API开发(一)
- C# 调用ArcGIS server admin api