Windows 下 API 详解

来源:互联网 发布:网络上巴掌什么意思 编辑:程序博客网 时间:2024/04/30 22:21

API 函数

//C#操作API用到的命名空间
using System.Runtime.InteropServices;

  C#申明方法 EntryPoint="ShowWindow" 入口点在ExactSpelling为true 下找不到时才指定入口点即为API函名

============================================================================================
********************************************************************************************
============================================================================================


        /// <summary>
        /// 向指定窗体句柄发送显示状态
        /// </summary>


        /// <param name="hwnd">窗体句柄</param>
        /// <param name="nCmdShow">窗体显示参数(如下参数例表)</param>
        /// <returns></returns>
        [DllImport("user32.dll", CharSet = CharSet.Auto, EntryPoint = "ShowWindow")]
        public static extern bool ShowWindow(IntPtr hwnd,int nCmdShow);

 
 nCmdShow:为以下其参数例表

 隐藏窗口,活动状态给令一个窗口
 Public Const SW_HIDE = 0

 用原来的大小和位置显示一个窗口,同时令其进入活动状态
 Public Const SW_SHOWNORMAL = 1
  
 最小化窗口,并将其激活
 Public Const SW_SHOWMINIMIZED = 2

 最大化窗口,并将其激活
 Public Const SW_SHOWMAXIMIZED = 3

 Public Const SW_MAXIMIZE = 3

 用最近的大小和位置显示一个窗口,同时不改变活动窗口
 Public Const SW_SHOWNOACTIVATE = 4

        用当前的大小和位置显示一个窗口,同时令其进入活动状态
 Public Const SW_SHOW = 5

 最小化窗口,活动状态给令一个窗口
 Public Const SW_MINIMIZE = 6
 
 最小化一个窗口,同时不改变活动窗口
 Public Const SW_SHOWMINNOACTIVE = 7

 用当前的大小和位置显示一个窗口,不改变活动窗口
 Public Const SW_SHOWNA = 8

 用原来的大小和位置显示一个窗口,同时令其进入活动状态
 Public Const SW_RESTORE = 9


--------------------------------------------------------------------------------------------
 //调用
ShowWindow(this.Handle, 6);
//this.Handle表示当前窗体句柄
--------------------------------------------------------------------------------------------


============================================================================================
********************************************************************************************
============================================================================================

 获得当前的活动窗体
 [DllImport("user32.dll",CharSet = CharSet.Auto, ExactSpelling = true)]
 public static extern IntPtr GetActiveWindow();

--------------------------------------------------------------------------------------------
 //调用活动窗体
 GetActiveWindow()
--------------------------------------------------------------------------------------------


============================================================================================
********************************************************************************************
============================================================================================

        /// <summary>
        /// 写入字符串到配置文件中
        /// </summary>


        /// <param name="lpApplicationName">
        /// 要在其中写入新字串的小节名称。
        /// 这个字串不区分大小写</param>
        /// <param name="lpKeyName">要设置的项名或条目名。这个字串不区分大小写。</param>
        /// <param name="lpString">指定为这个项写入的字串值</param>
        /// <param name="lpFileName">初始化文件的名字。
        /// 如果没有指定完整路径名,则windows会在windows目录查找文件。
        /// 如果文件没有找到,则函数会创建它</param>
        /// <returns></returns>
        [DllImport("kernel32", CharSet = CharSet.Auto,
            EntryPoint = "WritePrivateProfileString")]
        public static extern long WritePrivateProfileString(
            string lpApplicationName, string lpKeyName,string lpString,
            string lpFileName
            );

--------------------------------------------------------------------------------------------
    //调用写文件
          WritePrivateProfileString("小节名", "条目名", "写入的字符串", @"D:/T.ini");
--------------------------------------------------------------------------------------------


============================================================================================
********************************************************************************************
============================================================================================

 

        /// <summary>
        /// 获得字符串中的相应数据
        /// </summary>


        /// <param name="lpApplicationName">欲在其中查找条目的小节名称。
        /// 这个字串不区分大小写。</param>
        /// <param name="lpKeyName">欲获取的项名或条目名。
        /// 这个字串不区分大小写</param>
        /// <param name="lpDefault">指定的条目没有找到时返回的默认值。
        /// 可设为空("")</param>
        /// <param name="lpReturnedString">指定一个字串缓冲区,
        /// 长度至少为nSize</param>
        /// <param name="nSize">指定装载到lpReturnedString缓冲区的最大字符数量</param>
        /// <param name="lpFileName">初始化文件的名字。如没有指定一个完整路径名</param>
        /// <returns></returns>
        [DllImport("kernel32", CharSet = CharSet.Auto,
            EntryPoint = "GetPrivateProfileString")]
         public static extern long GetPrivateProfileString(string
            lpApplicationName, string lpKeyName, string lpDefault,
            string lpReturnedString, int nSize, string lpFileName );

--------------------------------------------------------------------------------------------
     //调用读文件
     //缓冲大小  也可用 new StringBuilder(255);
            char[] buffer=new char[255];
            string bullder = new string(buffer);
             GetPrivateProfileString("小节名", "条目名", "", bullder, 255, @"D:/T.ini");
             MessageBox.Show(bullder);
--------------------------------------------------------------------------------------------


============================================================================================
********************************************************************************************
============================================================================================

        /// <summary>
        /// 最小话窗口
        /// </summary>


        /// <param name="hwnd">窗口句柄</param>
        /// <returns></returns>
        [DllImport("user32.dll", CharSet = CharSet.Auto, EntryPoint = "CloseWindow",ExactSpelling=true)]
        public static extern bool CloseWindow(IntPtr hwnd);


--------------------------------------------------------------------------------------------
 //调用最小化窗口     GetActiveWindow()获取当前活动窗体句柄
 CloseWindow(GetActiveWindow());
--------------------------------------------------------------------------------------------


============================================================================================
********************************************************************************************
============================================================================================

 //SendMessage() 在下列例子参数二不变的情况下

               参数三0xF001~0xF009为窗体变形
                     0xF010~20 为窗体移动
                     0xF020~29 为窗体最小化
                     0xF030~39 为窗体最大化
                     0xF040~49 为显示窗体Z-Index纵轴顺序
                     0xF050~59 为显示窗体Z-Index纵轴顺序
                     0xF060~69 为窗体关闭

        /// <summary>
        /// 移动窗体
        /// </summary>
      //调用一个窗口的窗口函数,将一条消息发给那个窗口
      [DllImport("user32.dll", EntryPoint = "SendMessage", CharSet = CharSet.Auto)]
      private  static extern int SendMessage(IntPtr hwnd,int wMsg,int wpla,int wp);

       //为当前的应用程序释放鼠标捕获
        [DllImport("user32.dll", EntryPoint = "ReleaseCapture", CharSet = CharSet.Auto)]
        private static extern int ReleaseCapture();
      

//  SendMessage(this.Handle, 0x112, 0xF020, 0);最小化

       //SendMessage(this.Handle, WM_SYSCOMMAND, SC_MOVE, 0);
  
        private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            //为当前的应用程序释放鼠标捕获
            ReleaseCapture();

            SendMessage(this.Handle, 0x112, 0xF012, 0);

        }


   

API 函数 mciSendString()方法

  mciSendString是用来播放多媒体文件的API指令,可以播放MPEG,AVI,WAV,MP3,等等,下面介绍一下它的使用方法:

  该函数有四个参数:
第一个参数:要发送的命令字符串。字符串结构是:[命令][设备别名][命令参数].
第二个参数:返回信息的缓冲区,为一指定了大小的字符串变量.
第三个参数:缓冲区的大小,就是字符变量的长度.
第四个参数:回调方式,一般设为零
返回值:函数执行成功返回零,否则返回错误代码


一、常用命令
  1.打开:
Dim mName as string
mName = "f://mpeg//mpeg1.avi"
mciSendString "open mName type MPEGVideo Alias movie parent %u Style %u notify",0&, 0, 0
 其中:
open             操作命令
mName            全路径文件名
type MPEGVideo   是指打开MPEG,AVI等类型,如果不加这一句,就是打开WAV,MP3等
Alias movie      定义了该操作的别名为movie,后续操作只要指明别名即可
parent %u        源
Style %u         风格、样式
notify           通知

  2.播放:
mciSendString "play movie", 0&, 0, 0 
mciSendString "play movie fullscreen", 0&, 0, 0 '全屏播放
  3.暂停:
mciSendString "pause movie", 0&, 0, 0
  4.继续:
mciSendString "resume movie", 0&, 0, 0
  5.停止:
mciSendString "stop movie", 0&, 0, 0
  6.关闭:
mciSendString "close movie", 0&, 0, 0
  7.前进到下一个位置:
mciSendString "step movie", 0&, 0, 0     
  8.后退到上一个位置:
mciSendString "step movie reverse", 0&, 0, 0
  9.前进或后退 N 個位置(其中 N<0 即表示后退)
mciSendString "step movie by " & str(N), 0&, 0, 0  
  10.获取当前播放位置:
Dim ST As String*64
mciSendString "status movie position", st, len(st), 0 
  11. 获取媒体的总长度:
mciSendString "status movie length", st, len(st), 0
l=val(st) 'L就是所播放文件的长度
  12.获取播放信息:
Dim ST As String*64
mciSendString "status movie mode", ST, Len(ST), 0
If Left(ST, 7) = "stopped" Then (处理代码) '播放完毕
  13.循环播放:
mciSendString "play movie repeat", 0&, 0, 0


二、控制声音大小:
Dim V As Long
mciSendString "status movie volume", V, 0, 0 'V是获取的音量大小值。
V = 50
mciSendString "setaudio movie volume to " & V, &0, 0, 0 'V是设置的音量值

三、控制亮度(如果是播放视频)
Dim B As Long
mciSendString "status movie brightness", B, 0, 0 'B是获取的亮度值。
B = 50
mciSendString "setvideo movie brightness to " & B, &0, 0, 0 'B是设置的亮度值

四、到指定的位置播放。
Dim P1 as Long, P2 as Long
P1 = 100: P2 = 3000
mciSendString "seek movie to ", P1, 0, 0 'P1是当前起始位置,单位:毫秒
mciSendString "seek movie to start", 0&, 0, 0 '定位到开头位置
mciSendString "play movie", 0&, 0, 0 '定位后再播放
或者:
mciSendString "play movie FROM P1 to P2",0&, 0, 0 'P1是起始位置,P2是停止位置。单位:毫秒

mciSendString "seek movie to end", 0&, 0, 0 '定位到最后位置

五、在指定控件上播放视频:
mciSendString "open AVI 文件名 parent hWnd style child", 0&, 0, 0
其中,hWnd 是控件的句柄
执行上述命令之后,影片会被放置在控件的左上角,且影片的大小不受控件大小的影响,如果想要改变
影片播放的位置及大小,可以在執行 play  指令前先执行 put 指令,格式如下:

mciendString "put AVI 文件名 window at X Y [Width Height]", 0&, 0, 0
 其中 X  及 Y 参数须填入位置,而 Width 及 Height 参数则填入影片显示出來的宽度及高度

六、录音设置:
  录音前,用以下语句初始化
  1.设为8位:
mciSendString "set wave bitpersample 8", "", 0, 0
  2.设为11025Hz
mciSendString "set wave samplespersec 11025", "", 0, 0
  3.设为立体声:
mciSendString "set wave channels 2", "", 0, 0
  4.实现PCM格式(不一定正确):
MCISENDSTRING "set wave format tag pcm","", 0, 0
  5.开始录音:
mciSendString "close movie",0&,0,0
mciSendString "open new type WAVEAudio alias movie",0&,0,0
mciSendString "record movie",0&,0,0
  6.保存录音到c:/123.wav
mciSendString "stop movie",0&,0,0
mciSendString "save movie C://123.wav",0&,0,0
mciSendString "close movie",0&,0,0

七、开关光驱:
mciSendString "set cdaudio door open", "", 0, 0 '打开
mciSendString "set cdaudio door close", "", 0, 0 '关闭

 


API 对文件夹进行监视
============================================================================================
********************************************************************************************
============================================================================================

        [DllImport("kernel32.dll", EntryPoint = "FindFirstChangeNotification", CharSet = CharSet.Auto)]
        public static extern IntPtr FindFirstChangeNotification(string lpPathName, bool bWatchSubtree,dwNotifyFilter dw);

        [DllImport("Kernel32.dll", EntryPoint = "WaitForSingleObject", CharSet = CharSet.Auto)]
        public static extern int WaitForSingleObject(IntPtr hHandle, int dwMilliseconds);

       public enum dwNotifyFilter:uint
        {
          
            folderSizeChange=1, //监视文件夹内容大小的变化
            folderNameChange=2,  //监视文件夹改名
     
        }

private void Click_Event()
{
   IntPtr hdw=   FindFirstChangeNotification(@"C:/TDDOWNLOAD", false, dwNotifyFilter.num0);

         new Thread(delegate() {

             while (true)
             {
//API休眠函数  -1表示一直进行监视               hdw 字柄,监视时间
                 int nval = WaitForSingleObject(hdw, -1);

                 switch (nval)
                 {
                     case 0:
   //表示动作获取成功!
                         MessageBox.Show("aaaaaaaaa");
                         break;
                     default:
                         //MessageBox.Show("bbbbbbbbb");
                         break;
                 }
             }
}
        
        
         }).Start();


API 在图片可见的情况下进行局部区域拷贝到另一张图片上(不能操作内存图片)
============================================================================================
********************************************************************************************
============================================================================================

       [DllImport("gdi32", EntryPoint = "BitBlt", CharSet = CharSet.Auto)]
       private static extern  bool  BitBlt(IntPtr hDestwnd,int x,int y,int nWidth,int nHeight,IntPtr hScrwnd,int srcx,int srcy,int dwRop);


参数:
   hDestwnd:目标设备名柄
   x,y:表示坐标
  nWwidth,nHeight 表示剪切大小
  hScrwnd 源设备句柄
  srcx,srcy:源坐标
  int dwRop :光栅效果

  private void button1_Click(object sender, EventArgs e)
        {
    //pictureBox1 表示存在图片的pictureBox1对象
  
            Graphics gsrc =this.pictureBox1.CreateGraphics(); 

            Bitmap bitMap = new Bitmap(this.pictureBox1.Width, this.pictureBox1.Height,gsrc);
            Graphics gdes = Graphics.FromImage(bitMap);
       
        

            BitBlt(gdes.GetHdc(), 200, 200, 100, 100, gsrc.GetHdc(), 0, 0, 0x00CC0020);
           
            this.pictureBox2.BorderStyle = BorderStyle.FixedSingle;
            this.pictureBox2.Image = bitMap;
            gsrc.ReleaseHdc();
            gdes.ReleaseHdc();
            gsrc.Dispose();
            gdes.Dispose();

        }

dwRop :光栅效果
{
 名称
SRCCOPY--->0x00CC0020 :表示从源拷贝到目标,光栅效果以源为准
BLACKNESS--->0x000042 :表示拷贝到目标为黑色区域
NOTSRCERASE--->001100A6 :表示从源拷贝到目标设备 颜色取反并呈波浪状暗纹
NOTSRCCOPY--->00330008 :表示从源拷贝到目标设备 颜色取反
SRCERASE---> 00440328 :----------------------- 图片呈波浪状暗纹
DSTINVERT--->00550009 :-----------------------目标为白色区域
SRCINVERT--->00660046 :----------------------- 图片呈波浪状暗纹更突显更粗糙
}

  public const int WM_PAINT = 0x000F;

        public const int WM_CTLCOLOREDIT = 0x0133;

        /// <summary>
        /// 获取设备场景
        /// </summary>
        /// <param name="hWnd"></param>
        /// <returns></returns>
        [DllImport("user32.dll", EntryPoint = "GetWindowDC", CharSet = CharSet.Auto)]
        public static extern IntPtr GetWindowDC(IntPtr hWnd);
        /// <summary>
        ///
        /// </summary>
        /// <param name="hWnd"></param>
        /// <param name="hDC"></param>
        /// <returns></returns>
        [DllImport("user32.dll", EntryPoint = "GetWindowDC", CharSet = CharSet.Auto)]
        public static extern IntPtr ReleaseDC(IntPtr hWnd, IntPtr hDC);


        protected override void WndProc(ref Message m)
        {
            base.WndProc(ref m);

            switch (m.Msg)
            {
                case WM_CTLCOLOREDIT:
                    goto case WM_PAINT;
                case WM_PAINT:
                    IntPtr hDC = GetWindowDC(this.Handle);
                    if (hDC.ToInt32() != 0)
                    {
                        using (Graphics g = Graphics.FromHdc(hDC))
                        {
                            DrawBottomLines(g);
                            g.Dispose();
                        }

                    }
                    m.Result = IntPtr.Zero;
                    ReleaseDC(m.HWnd, hDC);
                    break;
            }
        }

 

        public void DrawBottomLines(Graphics g)
        {
            Pen p = new Pen(Color.Red, 1);
            g.DrawRectangle(p, 0, 0, this.Width, this.Height);
            g.DrawLine(p, 0, this.Height - 1, this.Width, this.Height - 1);
            p.Dispose();
        }
 //判定一个点是否在一个区或内部
        [DllImport("user32.dll")]
        public static extern bool PtInRect(ref Rectangle r, Point p); 
 //设置为窗体为顶部窗体
 [DllImport("user32.dll")]
        public static extern void SetForegroundWindow(IntPtr hwnd);

 


使用AnimationWindow美化窗口
AnimationWindow函数在C#中声明如下:
[DllImportAttribute("user32.dll")]
private static extern bool AnimateWindow(IntPtr hwnd,int dwTime,int dwFlags);

 

其中dwFlags参数在C#中声明如下:

public const Int32  AW_HOR_POSITIVE =           0x00000001
public const Int32  AW_HOR_NEGATIVE =           0x00000002
public const Int32  AW_VER_POSITIVE =           0x00000004
public const Int32  AW_VER_NEGATIVE =           0x00000008
public const Int32  AW_CENTER       =           0x00000010
public const Int32  AW_HIDE         =           0x00010000
public const Int32  AW_ACTIVATE     =           0x00020000
public const Int32  AW_SLIDE        =           0x00040000
public const Int32  AW_BLEND        =           0x00080000

 

命名空间:
using System.Runtime.InteropServices;

 

参数说明如下:

hwnd: 目标窗口句柄

dwTime:动画的持续时间,以微秒计,完成一个动画的标准时间为200微秒,数值越大动画效果的时间越长

dwFlags:是动画的效果类型,这个参数可以是一个或者多个下列标识的组合,标识描述:

 

AW_SLIDE:使用滑动类型。缺省则为滚动动画类型。当使用AW_CENTER标志时,这个标志就被忽略。   
AW_ACTIVATE:激活窗口。在使用了AW_HIDE标志后不能使用这个标志。   
AW_BLEND:实现淡出效果。只有当hWnd为顶层窗口的时候才可以使用此标志。   
AW_HIDE:隐藏窗口,缺省则显示窗口。   
AW_CENTER:若使用了AW_HIDE标志,则使窗口向内重叠,即收缩窗口;若未使用AW_HIDE标志,则使窗口向外扩展,即展开窗口。   
AW_HOR_POSITIVE:自左向右显示窗口。该标志可以在滚动动画和滑动动画中使用。当使用AW_CENTER标志时,该标志将被忽略。

AW_HOR_NEGATIVE:自右向左显示窗口。当使用了 AW_CENTER标识时,该标志将被忽略

AW_VER_POSITIVE:自顶向下显示窗口。该标志可以在滚动动画和滑动动画中使用。当使用AW_CENTER标志时,该标志将被忽略。   
AW_VER_NEGATIVE:自下向上显示窗口。该标志可以在滚动动画和滑动动画中使用。当使用AW_CENTER标志时,该标志将被忽略。 

 

 

返回值:如果函数成功,返回值为非零;如果函数失败,返回值为零。在下列情况下函数将失败:  
  (1)窗口使用了窗口边界;(2)窗口已经可见仍要显示窗口;(3)窗口已经隐藏仍要隐藏窗口。若想获得更多错误信息,请调用GetLastError函数。

 

  备注:可以将AW_HOR_POSITIVE或AW_HOR_NEGTVE与AW_VER_POSITVE或AW_VER_NEGATIVE组合来激活一个窗口。

  可能需要在该窗口的窗口过程和它的子窗口的窗口过程中处理WM_PRINT或WM_PRINTCLIENT消息。对话框,控制,及共用控制已处理WM_PRINTCLIENT消息,缺省窗口过程也已处理WM_PRINT消息。

 

原创粉丝点击