您的位置:首页 > 其它

Windows 下 API 详解

2010-04-28 10:07 239 查看
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消息。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: