Windows API常用函数

转自:http://www.cnblogs.com/xiashengwang/p/4026259.html

.NET中虽然类库很强,但还是有些时候功能有限,掌握常用的api函数,

会给我们解决问题提供另一种思路。

1、SetForegroundWindow

将窗口显示到最前面,前提是窗口没有最小化。

[DIIImport("User32.dll")]

public static extern bool SetForegroundWindow(IntPtrh Wnd);

2、ShowWindowAsync

 

显示窗口,如最小化后显示正常,这是异步的。 

[DllImport("User32.dll")]

public static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow); 

public enum ShowState : int 

SW_HIDE = 0, 

SW_SHOWNORMAL = 1, 

SW_NORMAL = 1, 

SW_SHOWMINIMIZED = 2, 

SW_SHOWMAXIMIZED = 3, 

SW_MAXIMIZE = 3, 

SW_SHOWNOACTIVATE = 4, 

SW_SHOW = 5, 

SW_MINIMIZE = 6, 

SW_SHOWMINNOACTIVE = 7, 

SW_SHOWNA = 8, 

SW_RESTORE = 9, 

SW_SHOWDEFAULT = 10,

SW_FORCEMINIMIZE = 11, 

SW_MAX = 11 

}

3,SendMessage

进程间通信,接受窗口要有消息循环才行。WM_COPYDATA 

public const int WM_COPYDATA = 0x004A; 

public struct COPYDATASTRUCT 

public IntPtr dwData; 

public int cbData; 

[MarshalAs(UnmanagedType.LPStr)] 

public string lpData; 

[DllImport("User32.dll", EntryPoint = "SendMessage")] 

public static extern int SendMessage( 

IntPtr hWnd, // handle to destination window 

int Msg, // message 

int wParam, // first message parameter 

ref COPYDATASTRUCT lParam // second message parameter 

); 

例子: 

发送方: 

byte[] sarr = System.Text.Encoding.Default.GetBytes(args[0]); 

Winn32.COPYDATASTRUCT copyData = new Winn32.COPYDATASTRUCT(); 

copyData.cbData = sarr.Length + 1; 

copyData.lpData = args[0]; 

copyData.dwData = (IntPtr)100; //这里随便写什么数字 

Winn32.SendMessage(runningInstance.MainWindowHandle, Winn32.WM_COPYDATA, 0, ref copyData); 

接收方 

protected override void DefWndProc(ref Message m) 

if (m.Msg == Winn32.WM_COPYDATA) 

Winn32.COPYDATASTRUCT copyData = new Winn32.COPYDATASTRUCT(); 

Type type = copyData.GetType(); 

copyData = (Winn32.COPYDATASTRUCT)m.GetLParam(type); 

this.textBox1.Text = copyData.lpData; 

base.DefWndProc(ref m); 

}

4,FindWindow

找到窗口句柄 

[DllImport("User32.dll", EntryPoint = "FindWindow")] 

private static extern int FindWindow(string lpClassName, string lpWindowName); 

5,SetLocalTime

设定系统时间 

[StructLayout(LayoutKind.Sequential)] 

public struct SYSTEMTIME 

public ushort wYear; 

public ushort wMonth; 

public ushort wDayOfWeek; 

public ushort wDay; 

public ushort wHour; 

public ushort wMinute; 

public ushort wSecond; 

public ushort wMilliseconds; 

public void FromDateTime(DateTime dateTime) 

wYear = (ushort)dateTime.Year; 

wMonth = (ushort)dateTime.Month; 

wDayOfWeek = (ushort)dateTime.DayOfWeek; 

wDay = (ushort)dateTime.Day; 

wHour = (ushort)dateTime.Hour; 

wMinute = (ushort)dateTime.Minute; 

wSecond = (ushort)dateTime.Second; 

wMilliseconds = (ushort)dateTime.Millisecond; 

public DateTime ToDateTime() 

return new DateTime(wYear, wMonth, wDay, wHour, wMinute, wSecond); 

[DllImport("kernel32.dll")] 

public static extern bool SetLocalTime(ref SYSTEMTIME Time); 

6,SHGetFileInfo

获取执行文件的图标icon 

[Flags] 

enum SHGFI : int 

/// <summary>get icon</summary> 

Icon = 0x000000100, 

/// <summary>get display name</summary> 

DisplayName = 0x000000200, 

/// <summary>get type name</summary> 

TypeName = 0x000000400, 

/// <summary>get attributes</summary> 

Attributes = 0x000000800, 

/// <summary>get icon location</summary> 

IconLocation = 0x000001000, 

/// <summary>return exe type</summary> 

ExeType = 0x000002000, 

/// <summary>get system icon index</summary> 

SysIconIndex = 0x000004000, 

/// <summary>put a link overlay on icon</summary> 

LinkOverlay = 0x000008000, 

/// <summary>show icon in selected state</summary> 

Selected = 0x000010000, 

/// <summary>get only specified attributes</summary> 

Attr_Specified = 0x000020000, 

/// <summary>get large icon</summary> 

LargeIcon = 0x000000000, 

/// <summary>get small icon</summary> 

SmallIcon = 0x000000001, 

/// <summary>get open icon</summary> 

OpenIcon = 0x000000002, 

/// <summary>get shell size icon</summary> 

ShellIconSize = 0x000000004, 

/// <summary>pszPath is a pidl</summary> 

PIDL = 0x000000008, 

/// <summary>use passed dwFileAttribute</summary> 

UseFileAttributes = 0x000000010, 

/// <summary>apply the appropriate overlays</summary> 

AddOverlays = 0x000000020, 

/// <summary>Get the index of the overlay in the upper 8 bits of the iIcon</summary> 

OverlayIndex = 0x000000040, 

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] 

public struct SHFILEINFO 

public SHFILEINFO(bool b) 

hIcon = IntPtr.Zero; 

iIcon = 0; 

dwAttributes = 0; 

szDisplayName = ""; 

szTypeName = ""; 

public IntPtr hIcon; 

public int iIcon; 

public uint dwAttributes; 

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] 

public string szDisplayName; 

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)] 

public string szTypeName; 

}; 

[DllImport("shell32.dll", CharSet = CharSet.Unicode)]//路径有中文字符,要用unicode

public static extern int SHGetFileInfo( 

string pszPath, 

int dwFileAttributes, 

out SHFILEINFO psfi, 

uint cbfileInfo, 

SHGFI uFlags); 

例子: 

private static Icon GetIcon(string strPath, bool bSmall) 

SHFILEINFO info = new SHFILEINFO(true); 

int cbFileInfo = Marshal.SizeOf(info); 

SHGFI flags; 

if (bSmall) 

flags = SHGFI.Icon | SHGFI.SmallIcon | SHGFI.UseFileAttributes; 

else 

flags = SHGFI.Icon | SHGFI.LargeIcon; 

Win32API.SHGetFileInfo(strPath, 256, out info, (uint)cbFileInfo, flags); 

return Icon.FromHandle(info.hIcon);

}

7,GetWindowThreadProcessId

得到句柄的进程和线程ID,返回的是线程ID,ref返回的是进程ID 

[System.Runtime.InteropServices.DllImport("User32.dll")] 

private static extern int GetWindowThreadProcessId(int Hwnd, ref int OutPressId); 

例子:杀死excel进程 

int processID = 0; 

int threadID; 

threadID = GetWindowThreadProcessId(excelApp.Hwnd, ref processID); 

if (processID > 0) 

System.Diagnostics.Process process = System.Diagnostics.Process.GetProcessById(processID); 

if (process != null) 

process.Kill(); 

}

 

posted @ 2017-06-10 19:07  朕在coding  阅读(401)  评论(0编辑  收藏  举报