转自: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();

}

}

Windows API常用函数的更多相关文章

  1. Windows API 常用函数---转载

    Windows API 常用函数 2014-10-15 14:21  xiashengwang  阅读(2105)  评论(0)  编辑  收藏 .Net中虽然类库很强的,但还是有些时候功能有限,掌握 ...

  2. Windows API 常用函数

    .Net中虽然类库很强的,但还是有些时候功能有限,掌握常用的api函数,会给我们解决问题提供另一种思路,下面给出自己常用到的Api函数,以备查询. 知道api函数,但却不知道c#或VB.net该如何声 ...

  3. 使用IDA PRO+OllyDbg+PEview 追踪windows API 动态链接库函数的调用过程

    使用IDA PRO+OllyDbg+PEview 追踪windows API 动态链接库函数的调用过程 http://blog.csdn.net/liujiayu2/article/details/5 ...

  4. Appium——api常用函数

    appium常用函数介绍:   获取页面信息:   1. def get_current_activity(cls, driver): ''' 获取当前页面的activity :param drive ...

  5. VC API常用函数简单例子大全(1-89)

    第一个:FindWindow根据窗口类名或窗口标题名来获得窗口的句柄,该函数返回窗口的句柄 函数的定义:HWND WINAPI FindWindow(LPCSTR lpClassName ,LPCST ...

  6. winform窗体之间通过 windows API SendMessage函数传值

    -----------------------------------------------------------‘接收窗体’代码.cs------------------------------ ...

  7. windows 编程—— 常用函数 与 操作

    目录: MessageBox() 和 PlaySound() 获得窗口 或屏幕大小 获得字体大小 输出文字 屏蔽和显示控制台窗口 1. MessageBox() 和 PlaySound() Messa ...

  8. C++使用Windows API CreateMutex函数多线程编程

    C++中也可以使用Windows 系统中对应的API函数进行多线程编程.使用CreateThread函数创建线程,并且可以通过CreateMutex创建一个互斥量实现线程间数据的同步: #includ ...

  9. windows API普通函数跟回调函数有何区别

    通俗点讲:1.普通函数(假设我们都是函数)你卖电脑,我买电脑,我给你钱(调用你)后,你给我电脑(得到返回值).这种情况下,我给钱后就不能走开,必须等你把电脑给我,否则你交货的时候可能找不到人.2.回调 ...

随机推荐

  1. poj 2240 Arbitrage (最短路径)

    Arbitrage Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13800   Accepted: 5815 Descri ...

  2. 洛谷树剖模板题 P3384 | 树链剖分

    原题链接 对于以u为根的子树,后代节点的dfn显然比他的dfn大,我们可以记录一下回溯到u的dfn,显然这两个dfn构成了一个连续区间,代表u及u的子树 剩下的就和树剖一样了 #include< ...

  3. BZOJ4824 [Cqoi2017]老C的键盘 【树形dp】

    题目链接 BZOJ4824 题解 观察出题目中的关系实际上是完全二叉树的父子关系 我们设\(f[i][j]\)为以\(i\)为根的节点在其子树中排名为\(j\)的方案数 转移时,枚举左右子树分别有几个 ...

  4. 《c程序设计语言》读书笔记-3.6-数字转字符串最小宽度限制

    #include <io.h> #include <stdio.h> #include <string.h> #include <stdlib.h> # ...

  5. 从日升的mecha anime看mecha genre的衰退

    注:矢立肇是日升企画部集体笔名,如勇者系列便是公司企画 这里列出一些我看过认为有意思的动画,大抵同系列的就合并了,除非后续作品(剧场版,OVA,etc)并非直接剧情承接且有趣 注意我对长篇TV动画评价 ...

  6. Sql Server 事务/回滚

    ,'test1','test1') commit tran t1  ---提交事务 功能:实现begin tran 和commit tran之间的语句,任一如果出现错误,所有都不执 事务不是有错就回滚 ...

  7. mysql 逻辑架构(三层)

    1.客户端(主要处理连接,授权认证,安全等). 2.MYSQL服务器层(核心服务功能都在这层,包括,查询解析,分析,优化,缓存以及所有的内置函数,所有跨存储引擎的功能都在这层实现:存储过程,触发器,视 ...

  8. 接下来打算写一下visual stuido 2013使用git进行远端管理。

    虽然我有了vs的账号,也vs2013开始已经可以进行远端的账户管理了,可是vs的版控毕竟有些依赖vs,想想还是用git吧 今天把这个环境的整套都弄地基本熟了.记录一下,算是一个小结.开始搭建系统框架

  9. 无线网络发射器选址 (NOIP2014)(真·纯模拟)

    原题传送门 好吧,如果说D1T1是纯模拟大水题 D2T1就是纯模拟略水题. 这道题首先我们要看一看数据范围.. 0<=n,m<=128 送分也不带这么送的吧.. 二维前缀和,前缀和,二次循 ...

  10. Fastjson.tojsonString中$ref对象重复引用问题

    import java.util.ArrayList; import java.util.List; import com.alibaba.fastjson.JSON; import com.alib ...