zoukankan      html  css  js  c++  java
  • 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(); 

    }

    “fool me once,shame on you. fool me twice, shame on me.”,翻译过来的意思是“愚弄我一次,是你坏;愚弄我两次,是我蠢”。
  • 相关阅读:
    Vsftp的PASV mode(被动模式传送)和Port模式及 Linux下VsFTP配置全方案
    vsftpd:500 OOPS: vsftpd: refusing to run with writable root inside chroot ()错误的解决方法
    CentOS7.2部署FTP
    Apache与Nginx的优缺点比较
    MySQL存储引擎--MyISAM与InnoDB区别
    CentOS 7下搭建配置SVN服务器
    Remi 安装源
    tmpx75 I2C 温度传感器驱动程序添加
    QT 5.7.0 交叉编译记录
    am335x SGX 移植
  • 原文地址:https://www.cnblogs.com/newcapecjmc/p/6979605.html
Copyright © 2011-2022 走看看