2006年04月01日

1. API之网络函数
WNetAddConnection 创建同一个网络资源的永久性连接
WNetAddConnection2 创建同一个网络资源的连接
WNetAddConnection3 创建同一个网络资源的连接
WNetCancelConnection 结束一个网络连接
WNetCancelConnection2 结束一个网络连接
WNetCloseEnum 结束一次枚举操作
WNetConnectionDialog 启动一个标准对话框,以便建立同网络资源的连接
WNetDisconnectDialog 启动一个标准对话框,以便断开同网络资源的连接
WNetEnumResource 枚举网络资源
WNetGetConnection 获取本地或已连接的一个资源的网络名称
WNetGetLastError 获取网络错误的扩展错误信息
WNetGetUniversalName 获取网络中一个文件的远程名称以及/或者UNC(统一命名规范)名称
WNetGetUser 获取一个网络资源用以连接的名字
WNetOpenEnum 启动对网络资源进行枚举的过程

2. API之消息函数
BroadcastSystemMessage 将一条系统消息广播给系统中所有的顶级窗口
GetMessagePos 取得消息队列中上一条消息处理完毕时的鼠标指针屏幕位置
GetMessageTime 取得消息队列中上一条消息处理完毕时的时间
PostMessage 将一条消息投递到指定窗口的消⒍恿?
PostThreadMessage 将一条消息投递给应用程序
RegisterWindowMessage 获取分配给一个字串标识符的消息编号
ReplyMessage 答复一个消息
SendMessage 调用一个窗口的窗口函数,将一条消息发给那个窗口
SendMessageCallback 将一条消息发给窗口
SendMessageTimeout 向窗口发送一条消息
SendNotifyMessage 向窗口发送一条消息
3. API之文件处理函数
CloseHandle 关闭一个内核对象。其中包括文件、文件映射、进程、线程、安全和同步对象等
CompareFileTime 对比两个文件的时间
CopyFile 复制文件
CreateDirectory 创建一个新目录
CreateFile 打开和创建文件、管道、邮槽、通信服务、设备以及控制台
CreateFileMapping 创建一个新的文件映射对象
DeleteFile 删除指定文件
DeviceIoControl 对设备执行指定的操作
DosDateTimeToFileTime 将DOS日期和时间值转换成一个 win32 FILETIME 值
FileTimeToDosDateTime 将一个 win32 FILETIME 值转换成DOS日期和时间值
FileTimeToLocalFileTime 将一个FILETIME结构转换成本地时间
FileTimeToSystemTime 根据一个FILETIME结构的内容,装载一个SYSTEMTIME结构
FindClose 关闭由FindFirstFile函数创建的一个搜索句柄
FindFirstFile 根据文件名查找文件
FindNextFile 根据调用FindFirstFile函数时指定的一个文件名查找下一个文件
FlushFileBuffers 针对指定的文件句柄,刷新内部文件缓冲区
FlushViewOfFile 将写入文件映射缓冲区的所有数据都刷新到磁盘
GetBinaryType 判断文件是否可以执行
GetCompressedFileSize 判断一个压缩文件在磁盘上实际占据的字节数
GetCurrentDirectory 在一个缓冲区中装载当前目录
GetDiskFreeSpace 获取与一个磁盘的组织有关的信息,以及了解剩余空间的容量
GetDiskFreeSpaceEx 获取与一个磁盘的组织以及剩余空间容量有关的信息
GetDriveType 判断一个磁盘驱动器的类型
GetExpandedName 取得一个压缩文件的全名
GetFileAttributes 判断指定文件的属性
GetFileInformationByHandle 这个函数提供了获取文件信息的一种机制
GetFileSize 判断文件长度
GetFileTime 取得指定文件的时间信息
GetFileType 在给出文件句柄的前提下,判断文件类型
GetFileVersionInfo 从支持版本标记的一个模块里获取文件版本信息
GetFileVersionInfoSize 针对包含了版本资源的一个文件,判断容纳文件版本信息需要一个多大的缓冲区
GetFullPathName 获取指定文件的完整路径名
GetLogicalDrives 判断系统中存在哪些逻辑驱动器字母
GetLogicalDriveStrings 获取一个字串,其中包含了当前所有逻辑驱动器的根驱动器路径
GetOverlappedResult 判断一个重叠操作当前的状态
GetPrivateProfileInt 为初始化文件(.ini文件)中指定的条目获取一个整数值
GetPrivateProfileSection 获取指定小节(在.ini文件中)所有项名和值的一个列表
GetPrivateProfileString 为初始化文件中指定的条目取得字串
GetProfileInt 取得win.ini初始化文件中指定条目的一个整数值
GetProfileSection 获取指定小节(在win.ini文件中)所有项名和值的一个列表
GetProfileString 为win.ini初始化文件中指定的条目取得字串
GetShortPathName 获取指定文件的短路径名
GetSystemDirectory 取得Windows系统目录(即System目录)的完整路径名
GetTempFileName 这个函数包含了一个临时文件的名字,它可由应用程序使用
GetTempPath 获取为临时文件指定的路径
GetVolumeInformation 获取与一个磁盘卷有关的信息
GetWindowsDirectory 获取Windows目录的完整路径名
hread 参考lread
hwrite 参考lwrite函数
lclose 关闭指定的文件
lcreat 创建一个文件
llseek 设置文件中进行读写的当前位置
LockFile 锁定文件的某一部分,使其不与其他应用程序共享
LockFileEx 与LockFile相似,只是它提供了更多的功能
lopen 以二进制模式打开指定的文件
lread 将文件中的数据读入内存缓冲区
lwrite 将数据从内存缓冲区写入一个文件
LZClose 关闭由LZOpenFile 或 LZInit函数打开的一个文件
LZCopy 复制一个文件
LZInit 这个函数用于初始化内部缓冲区
LZOpenFile 该函数能执行大量不同的文件处理,而且兼容于压缩文件
LZRead 将数据从文件读入内存缓冲区
LZSeek 设置一个文件中进行读写的当前位置
MapViewOfFile 将一个文件映射对象映射到当前应用程序的地址空间
MoveFile 移动文件
OpenFile 这个函数能执行大量不同的文件操作
OpenFileMapping 打开一个现成的文件映射对象
QueryDosDevice 在Windows NT中,DOS设备名会映射成NT系统设备名。该函数可判断当前的设备映射情况
ReadFile 从文件中读出数据
ReadFileEx 与ReadFile相似,只是它只能用于异步读操作,并包含了一个完整的回调
RegCloseKey 关闭系统注册表中的一个项(或键)
RegConnectRegistry 访问远程系统的部分注册表
RegCreateKey 在指定的项下创建或打开一个项
RegCreateKeyEx 在指定项下创建新项的更复杂的方式。在Win32环境中建议使用这个函数
RegDeleteKey 删除现有项下方一个指定的子项
RegDeleteValue 删除指定项下方的一个值
RegEnumKey 枚举指定项的子项。在Win32环境中应使用RegEnumKeyEx
RegEnumKeyEx 枚举指定项下方的子项
RegEnumValue 枚举指定项的值
RegFlushKey 将对项和它的子项作出的改动实际写入磁盘
RegGetKeySecurity 获取与一个注册表项有关的安全信息
RegLoadKey 从以前用RegSaveKey函数创建的一个文件里装载注册表信息
RegNotifyChangeKeyValue 注册表项或它的任何一个子项发生变化时,用这个函数提供一种通知机制
RegOpenKey 打开一个现有的注册表项
RegOpenKeyEx 打开一个现有的项。在win32下推荐使用这个函数
RegQueryInfoKey 获取与一个项有关的信息
RegQueryValue 取得指定项或子项的默认(未命名)值
RegQueryValueEx 获取一个项的设置值
RegReplaceKey 用一个磁盘文件保存的信息替换注册表信息;并创建一个备份,在其中包含当前注册表信息
RegRestoreKey 从一个磁盘文件恢复注册表信息
RegSaveKey 将一个项以及它的所有子项都保存到一个磁盘文件
RegSetKeySecurity 设置指定项的安全特性
RegSetValue 设置指定项或子项的默认值
RegSetValueEx 设置指定项的值
RegUnLoadKey 卸载指定的项以及它的所有子项
RemoveDirectory 删除指定目录
SearchPath 查找指定文件
SetCurrentDirectory 设置当前目录
SetEndOfFile 针对一个打开的文件,将当前文件位置设为文件末尾
SetFileAttributes 设置文件属性
SetFilePointer 在一个文件中设置当前的读写位置
SetFileTime 设置文件的创建、访问及上次修改时间
SetHandleCount 这个函数不必在win32下使用;即使使用,也不会有任何效果
SetVolumeLabel 设置一个磁盘的卷标(Label)
SystemTimeToFileTime 根据一个FILETIME结构的内容,载入一个SYSTEMTIME结构
UnlockFile 解除对一个文件的锁定
UnlockFileEx 解除对一个文件的锁定
UnmapViewOfFile 在当前应用程序的内存地址空间解除对一个文件映射对象的映射
VerFindFile 用这个函数决定一个文件应安装到哪里
VerInstallFile 用这个函数安装一个文件
VerLanguageName 这个函数能根据16位语言代码获取一种语言的名称
VerQueryValue 这个函数用于从版本资源中获取信息
WriteFile 将数据写入一个文件
WriteFileEx 与WriteFile类似,只是它只能用于异步写操作,并包括了一个完整的回调
WritePrivateProfileSection 为一个初始化文件(.ini)中指定的小节设置所有项名和值
WritePrivateProfileString 在初始化文件指定小节内设置一个字串
WriteProfileSection 为Win.ini初始化文件中一个指定的小节设置所有项名和值
WriteProfileString 在Win.ini初始化文件指定小节内设置一个字串
4. API之打印函数
AbortDoc 取消一份文档的打印
AbortPrinter 删除与一台打印机关联在一起的缓冲文件
AddForm 为打印机的表单列表添加一个新表单
AddJob 用于获取一个有效的路径名,以便用它为作业创建一个后台打印文件。它也会为作业分配一个作业编号
AddMonitor 为系统添加一个打印机监视器
AddPort 启动"添加端口"对话框,允许用户在系统可用端口列表中加入一个新端口
AddPrinter 在系统中添加一台新打印机
AddPrinterConnection 连接指定的打印机
AddPrinterDriver 为指定的系统添加一个打印驱动程序
AddPrintProcessor 为指定的系统添加一个打印处理器
AddPrintProvidor 为系统添加一个打印供应商
AdvancedDocumentProperties 启动打印机文档设置对话框
ClosePrinter 关闭一个打开的打印机对象
ConfigurePort 针对指定的端口,启动一个端口配置对话框
ConnectToPrinterDlg 启动连接打印机对话框,用它同访问网络的打印机连接
DeleteForm 从打印机可用表单列表中删除一个表单
DeleteMonitor 删除指定的打印监视器
DeletePort 启动"删除端口"对话框,允许用户从当前系统删除一个端口
DeletePrinter 将指定的打印机标志为从系统中删除
DeletePrinterConnection 删除与指定打印机的连接
DeletePrinterDriver 从系统删除一个打印机驱动程序
DeletePrintProcessor 从指定系统删除一个打印处理器
DeletePrintProvidor 从系统中删除一个打印供应商
DeviceCapabilities 利用这个函数可获得与一个设备的能力有关的信息
DocumentProperties 打印机配置控制函数
EndDocAPI 结束一个成功的打印作业
EndDocPrinter 在后台打印程序的级别指定一个文档的结束
EndPage 用这个函数完成一个页面的打印,并准备设备场景,以便打印下一个页
EndPagePrinter 指定一个页在打印作业中的结尾
EnumForms 枚举一台打印机可用的表单
EnumJobs 枚举打印队列中的作业
EnumMonitors 枚举可用的打印监视器
EnumPorts 枚举一个系统可用的端口
EnumPrinterDrivers 枚举指定系统中已安装的打印机驱动程序
EnumPrinters 枚举系统中安装的打印机
EnumPrintProcessorDatatypes 枚举由一个打印处理器支持的数据类型
EnumPrintProcessors 枚举系统中可用的打印处理器
Escape 设备控制函数
FindClosePrinterChangeNotification 关闭用FindFirstPrinterChangeNotification函数获取的一个打印机通告对象
FindFirstPrinterChangeNotification 创建一个新的改变通告对象,以便我们注意打印机状态的各种变化
FindNextPrinterChangeNotification 用这个函数判断触发一次打印机改变通告信号的原因
FreePrinterNotifyInfo 释放由FindNextPrinterChangeNotification函数分配的一个缓冲区
GetForm 取得与指定表单有关的信息
GetJob 获取与指定作业有关的信息
GetPrinter 取得与指定打印机有关的信息
GetPrinterData 为打印机设置注册表配置信息
GetPrinterDriver 针对指定的打印机,获取与打印机驱动程序有关的信息
GetPrinterDriverDirectory 判断指定系统中包含了打印机驱动程序的目录是什么
GetPrintProcessorDirectory 判断指定系统中包含了打印机处理器驱动程序及文件的目录
OpenPrinter 打开指定的打印机,并获取打印机的句柄
PrinterMessageBox 在拥有指定打印作业的系统上显示一个打印机出错消息框
PrinterProperties 启动打印机属性对话框,以便对打印机进行配置
ReadPrinter 从打印机读入数据
ResetDC 重设一个设备场景
ResetPrinter 改变指定打印机的默认数据类型及文档设置
ScheduleJob 提交一个要打印的作业
SetAbortProc 为Windows指定取消函数的地址
SetForm 为指定的表单设置信息
SetJob 对一个打印作业的状态进行控制
SetPrinter 对一台打印机的状态进行控制
SetPrinterData 设置打印机的注册表配置信息
StartDoc 开始一个打印作业
StartDocPrinter 在后台打印的级别启动一个新文档
StartPage 打印一个新页前要先调用这个函数
StartPagePrinter 在打印作业中指定一个新页的开始
WritePrinter 将发送目录中的数据写入打印机
5. API之文本和字体函数
AddFontResource 在Windows系统中添加一种字体资源
CreateFont 用指定的属性创建一种逻辑字体
CreateFontIndirect 用指定的属性创建一种逻辑字体
CreateScalableFontResource 为一种TureType字体创建一个资源文件,以便能用API函数AddFontResource将其加入Windows系统
DrawText 将文本描绘到指定的矩形中
DrawTextEx 与DrawText相似,只是加入了更多的功能
EnumFontFamilies 列举指定设备可用的字体
EnumFontFamiliesEx 列举指定设备可用的字体
EnumFonts 列举指定设备可用的字体
ExtTextOut 经过扩展的文本描绘函数。也请参考SetTextAlign函数
GetAspectRatioFilterEx 用SetMapperFlags要求Windows只选择与设备当前纵横比相符的光栅字体时,本函数可判断纵横比大小
GetCharABCWidths 判断TureType字体中一个或多个字符的A-B-C大小
GetCharABCWidthsFloat 查询一种字体中一个或多个字符的A-B-C尺寸
GetCharacterPlacement 该函数用于了解如何用一个给定的字符显示一个字串
GetCharWidth 调查字体中一个或多个字符的宽度
GetFontData 接收一种可缩放字体文件的数据
GetFontLanguageInfo 返回目前选入指定设备场景中的字体的信息
GetGlyphOutline 取得TureType字体中构成一个字符的曲线信息
GetKerningPairs 取得指定字体的字距信息
GetOutlineTextMetrics 接收与TureType字体内部特征有关的详细信息
GetRasterizerCaps 了解系统是否有能力支持可缩放的字体
GetTabbedTextExtent 判断一个字串占据的范围,同时考虑制表站扩充的因素
GetTextAlign 接收一个设备场景当前的文本对齐标志
GetTextCharacterExtra 判断额外字符间距的当前值
GetTextCharset 接收当前选入指定设备场景的字体的字符集标识符
GetTextCharsetInfo 获取与当前选定字体的字符集有关的详细信息
GetTextColor 判断当前字体颜色。通常也称为"前景色"
GetTextExtentExPoint 判断要填入指定区域的字符数量。也用一个数组装载每个字符的范围信息
GetTextExtentPoint 判断一个字串的大小(范围)
GetTextFace 获取一种字体的字样名
GetTextMetrics 获取与选入一种设备场景的物理字体有关的信息
GrayString 描绘一个以灰色显示的字串。通常由Windows用于标识禁止状态
PolyTextOut 描绘一系列字串
RemoveFontResource 从Windows系统中删除一种字体资源
SetMapperFlags Windows对字体进行映射时,可用该函数选择与目标设备的纵横比相符的光栅字体
SetTextAlign 设置文本对齐方式,并指定在文本输出过程中使用设备场景的当前位置
SetTextCharacterExtra 描绘文本的时候,指定要在字符间插入的额外间距
SetTextColor 设置当前文本颜色。这种颜色也称为"前景色"
SetTextJustification 通过指定一个文本行应占据的额外空间,可用这个函数对文本进行两端对齐处理
TabbedTextOut 支持制表站的一个文本描绘函数
TextOut 文本绘图函数
6. API之菜单函数
AppendMenu 在指定的菜单里添加一个菜单项
CheckMenuItem 复选或撤消复选指定的菜单条目
CheckMenuRadioItem 指定一个菜单条目被复选成"单选"项目
CreateMenu 创建新菜单
CreatePopupMenu 创建一个空的弹出式菜单
DeleteMenu 删除指定的菜单条目
DestroyMenu 删除指定的菜单
DrawMenuBar 为指定的窗口重画菜单
EnableMenuItem 允许或禁止指定的菜单条目
GetMenu 取得窗口中一个菜单的句柄
GetMenuCheckMarkDimensions 返回一个菜单复选符的大小
GetMenuContextHelpId 取得一个菜单的帮助场景ID
GetMenuDefaultItem 判断菜单中的哪个条目是默认条目
GetMenuItemCount 返回菜单中条目(菜单项)的数量
GetMenuItemID 返回位于菜单中指定位置处的条目的菜单ID
GetMenuItemInfo 取得(接收)与一个菜单条目有关的特定信息
GetMenuItemRect 在一个矩形中装载指定菜单条目的屏幕坐标信息
GetMenuState 取得与指定菜单条目状态有关的信息
GetMenuString 取得指定菜单条目的字串
GetSubMenu 取得一个弹出式菜单的句柄,它位于菜单中指定的位置
GetSystemMenu 取得指定窗口的系统菜单的句柄
HiliteMenuItem 控制顶级菜单条目的加亮显示状态
InsertMenu 在菜单的指定位置处插入一个菜单条目,并根据需要将其他条目向下移动
InsertMenuItem 插入一个新菜单条目
IsMenu 判断指定的句柄是否为一个菜单的句柄
LoadMenu 从指定的模块或应用程序实例中载入一个菜单
LoadMenuIndirect 载入一个菜单
MenuItemFromPoint 判断哪个菜单条目包含了屏幕上一个指定的点
ModifyMenu 改变菜单条目
RemoveMenu 删除指定的菜单条目
SetMenu 设置窗口菜单
SetMenuContextHelpId 设置一个菜单的帮助场景ID
SetMenuDefaultItem 将一个菜单条目设为默认条目
SetMenuItemBitmaps 设置一幅特定位图,令其在指定的菜单条目中使用,代替标准的复选符号(√)
SetMenuItemInfo 为一个菜单条目设置指定的信息
TrackPopupMenu 在屏幕的任意地方显示一个弹出式菜单
TrackPopupMenuEx 与TrackPopupMenu相似,只是它提供了额外的功能
7. API之位图、图标和光栅运算函数
BitBlt 将一幅位图从一个设备场景复制到另一个
CopyIcon 制作指定图标或鼠标指针的一个副本。这个副本从属于发出调用的应用程序
CopyImage 复制位图、图标或指针,同时在复制过程中进行一些转换工作
CreateBitmap 按照规定的格式创建一幅与设备有关位图
CreateBitmapIndirect 创建一幅与设备有关位图
CreateCompatibleBitmap 创建一幅与设备有关位图,它与指定的设备场景兼容
CreateCursor 创建一个鼠标指针
CreateDIBitmap 根据一幅与设备无关的位图创建一幅与设备有关的位图
CreateDIBSection 创建一个DIBSection
CreateIcon 创建一个图标
CreateIconIndirect 创建一个图标
DestroyCursor 清除指定的鼠标指针,并释放它占用的所有系统资源
DestroyIcon 清除图标
DrawIcon 在指定的位置画一个图标
DrawIconEx 描绘一个图标或鼠标指针。与DrawIcon相比,这个函数提供了更多的功能
ExtractAssociatedIcon 判断一个可执行程序或DLL中是否存在图标,或是否有图标与系统注册表中指定的文件存在关联并提取之
ExtractIcon 判断一个可执行文件或DLL中是否有图标存在,并将其提取出来
GetBitmapBits 将来自位图的二进制位复制到一个缓冲区
GetBitmapDimensionEx 取得一幅位图的宽度和高度
GetDIBColorTable 从选入设备场景的DIBSection中取得颜色表信息
GetDIBits 将来自一幅位图的二进制位复制到一幅与设备无关的位图里
GetIconInfo 取得与图标有关的信息
GetStretchBltMode 判断StretchBlt 和 StretchDIBits函数采用的伸缩模式
LoadBitmap 从指定的模块或应用程序实例中载入一幅位图
LoadCursor 从指定的模块或应用程序实例中载入一个鼠标指针
LoadCursorFromFile 在一个指针文件或一个动画指针文件的基础上创建一个指针
LoadIcon 从指定的模块或应用程序实例中载入一个图标
LoadImage 载入一个位图、图标或指针
MaskBlt 执行复杂的图象传输,同时进行掩模(MASK)处理
PatBlt 在当前选定的刷子的基础上,用一个图案填充指定的设备场景
PlgBlt 复制一幅位图,同时将其转换成一个平行四边形。利用它可对位图进行旋转处理
SetBitmapBits 将来自缓冲区的二进制位复制到一幅位图
SetBitmapDimensionEx 设置一幅位图的宽度。以一毫米的十分之一为单位
SetDIBColorTable 设置选入设备场景的一个DIBSection的颜色表信息
SetDIBits 将来自与设备无关位图的二进制位复制到一幅与设备有关的位图里
SetDIBitsToDevice 将一幅与设备无关位图的全部或部分数据直接复制到一个设备
SetStretchBltMode 指定StretchBlt 和 StretchDIBits函数的伸缩模式
StretchBlt 将一幅位图从一个设备场景复制到另一个
StretchDIBits 将一幅与设备无关位图的全部或部分数据直接复制到指定的设备场景
8. API之绘图函数
AbortPath 抛弃选入指定设备场景中的所有路径。也取消目前正在进行的任何路径的创建工作
AngleArc 用一个连接弧画一条线
Arc 画一个圆弧
BeginPath 启动一个路径分支
CancelDC 取消另一个线程里的长时间绘图操作
Chord 画一个弦
CloseEnhMetaFile 关闭指定的增强型图元文件设备场景,并将新建的图元文件返回一个句柄
CloseFigure 描绘到一个路径时,关闭当前打开的图形
CloseMetaFile 关闭指定的图元文件设备场景,并向新建的图元文件返回一个句柄
CopyEnhMetaFile 制作指定增强型图元文件的一个副本(拷贝)
CopyMetaFile 制作指定(标准)图元文件的一个副本
CreateBrushIndirect 在一个LOGBRUSH数据结构的基础上创建一个刷子
CreateDIBPatternBrush 用一幅与设备无关的位图创建一个刷子,以便指定刷子样式(图案)
CreateEnhMetaFile 创建一个增强型的图元文件设备场景
CreateHatchBrush 创建带有阴影图案的一个刷子
CreateMetaFile 创建一个图元文件设备场景
CreatePatternBrush 用指定了刷子图案的一幅位图创建一个刷子
CreatePen 用指定的样式、宽度和颜色创建一个画笔
CreatePenIndirect 根据指定的LOGPEN结构创建一个画笔
CreateSolidBrush 用纯色创建一个刷子
DeleteEnhMetaFile 删除指定的增强型图元文件
DeleteMetaFile 删除指定的图元文件
DeleteObject 删除GDI对象,对象使用的所有系统资源都会被释放
DrawEdge 用指定的样式描绘一个矩形的边框
DrawEscape 换码(Escape)函数将数据直接发至显示设备驱动程序
DrawFocusRect 画一个焦点矩形
DrawFrameControl 描绘一个标准控件
DrawState 为一幅图象或绘图操作应用各式各样的效果
Ellipse 描绘一个椭圆,由指定的矩形围绕
EndPath 停止定义一个路径
EnumEnhMetaFile 针对一个增强型图元文件,列举其中单独的图元文件记录
EnumMetaFile 为一个标准的windows图元文件枚举单独的图元文件记录
EnumObjects 枚举可随同指定设备场景使用的画笔和刷子
ExtCreatePen 创建一个扩展画笔(装饰或几何)
ExtFloodFill 在指定的设备场景里,用当前选择的刷子填充一个区域
FillPath 关闭路径中任何打开的图形,并用当前刷子填充
FillRect 用指定的刷子填充一个矩形
FlattenPath 将一个路径中的所有曲线都转换成线段
FloodFill 用当前选定的刷子在指定的设备场景中填充一个区域
FrameRect 用指定的刷子围绕一个矩形画一个边框
GdiComment 为指定的增强型图元文件设备场景添加一条注释信息
GdiFlush 执行任何未决的绘图操作
GdiGetBatchLimit 判断有多少个GDI绘图命令位于队列中
GdiSetBatchLimit 指定有多少个GDI绘图命令能够进入队列
GetArcDirection 画圆弧的时候,判断当前采用的绘图方向
GetBkColor 取得指定设备场景当前的背景颜色
GetBkMode 针对指定的设备场景,取得当前的背景填充模式
GetBrushOrgEx 判断指定设备场景中当前选定刷子起点
GetCurrentObject 获得指定类型的当前选定对象
GetCurrentPositionEx 在指定的设备场景中取得当前的画笔位置
GetEnhMetaFile 取得磁盘文件中包含的一个增强型图元文件的图元文件句柄
GetEnhMetaFileBits 将指定的增强型图元文件复制到一个内存缓冲区里
GetEnhMetaFileDescription 返回对一个增强型图元文件的说明
GetEnhMetaFileHeader 取得增强型图元文件的图元文件头
GetEnhMetaFilePaletteEntries 取得增强型图元文件的全部或部分调色板
GetMetaFile 取得包含在一个磁盘文件中的图元文件的图元文件句柄
GetMetaFileBitsEx 将指定的图元文件复制到一个内存缓冲区
GetMiterLimit 取得设备场景的斜率限制(Miter)设置
GetNearestColor 根据设备的显示能力,取得与指定颜色最接近的一种纯色
GetObjectAPI 取得对指定对象进行说明的一个结构
GetObjectType 判断由指定句柄引用的GDI对象的类型
GetPath 取得对当前路径进行定义的一系列数据
GetPixel 在指定的设备场景中取得一个像素的RGB值
GetPolyFillMode 针对指定的设备场景,获得多边形填充模式
GetROP2 针对指定的设备场景,取得当前的绘图模式
GetStockObject 取得一个固有对象(Stock)
GetSysColorBrush 为任何一种标准系统颜色取得一个刷子
GetWinMetaFileBits 通过在一个缓冲区中填充用于标准图元文件的数据,将一个增强型图元文件转换成标准windows图元文件
InvertRect 通过反转每个像素的值,从而反转一个设备场景中指定的矩形
LineDDA 枚举指定线段中的所有点
LineTo 用当前画笔画一条线,从当前位置连到一个指定的点
MoveToEx 为指定的设备场景指定一个新的当前画笔位置
PaintDesk 在指定的设备场景中描绘桌面墙纸图案
PathToRegion 将当前选定的路径转换到一个区域里
Pie 画一个饼图
PlayEnhMetaFile 在指定的设备场景中画一个增强型图元文件
PlayEnhMetaFileRecord 回放单独一条增强型图元文件记录
PlayMetaFile 在指定的设备场景中回放一个图元文件
PlayMetaFileRecord 回放来自图元文件的单条记录
PolyBezier 描绘一条或多条贝塞尔(Bezier)曲线
PolyDraw 描绘一条复杂的曲线,由线段及贝塞尔曲线组成
Polygon 描绘一个多边形
Polyline 用当前画笔描绘一系列线段
PolyPolygon 用当前选定画笔描绘两个或多个多边形
PolyPolyline 用当前选定画笔描绘两个或多个多边形
Rectangle 用当前选定的画笔描绘矩形,并用当前选定的刷子填充
RoundRect 用当前选定的画笔画一个圆角矩形,并用当前选定的刷子在其中填充
SelectClipPath 将设备场景当前的路径合并到剪切区域里
SelectObject 为当前设备场景选择图形对象
SetArcDirection 设置圆弧的描绘方向
SetBkColor 为指定的设备场景设置背景颜色
SetBkMode 指定阴影刷子、虚线画笔以及字符中的空隙的填充方式
SetBrushOrgEx 为指定的设备场景设置当前选定刷子的起点
SetEnhMetaFileBits 用指定内存缓冲区内包含的数据创建一个增强型图元文件
SetMetaFileBitsEx 用包含在指定内存缓冲区内的数据结构创建一个图元文件
SetMiterLimit 设置设备场景当前的斜率限制
SetPixel 在指定的设备场景中设置一个像素的RGB值
SetPixelV 在指定的设备场景中设置一个像素的RGB值
SetPolyFillMode 设置多边形的填充模式
SetROP2 设置指定设备场景的绘图模式。与vb的DrawMode属性完全一致
SetWinMetaFileBits 将一个标准Windows图元文件转换成增强型图元文件
StrokeAndFillPath 针对指定的设备场景,关闭路径上打开的所有区域
StrokePath 用当前画笔描绘一个路径的轮廓。打开的图形不会被这个函数关闭
UnrealizeObject 将一个刷子对象选入设备场景之前,如刷子的起点准备用SetBrushOrgEx修改,则必须先调用本函数
WidenPath 根据选定画笔的宽度,重新定义当前选定的路径
9. API之设备场景函数
CombineRgn 将两个区域组合为一个新区域
CombineTransform 驱动世界转换。它相当于依顺序进行两次转换
CreateCompatibleDC 创建一个与特定设备场景一致的内存设备场景
CreateDC 为专门设备创建设备场景
CreateEllipticRgn 创建一个椭圆
CreateEllipticRgnIndirect 创建一个内切于特定矩形的椭圆区域
CreateIC 为专用设备创建一个信息场景
CreatePolygonRgn 创建一个由一系列点围成的区域
CreatePolyPolygonRgn 创建由多个多边形构成的区域。每个多边形都应是封闭的
CreateRectRgn 创建一个矩形区域
CreateRectRgnIndirect 创建一个矩形区域
CreateRoundRectRgn 创建一个圆角矩形
DeleteDC 删除专用设备场景或信息场景,释放所有相关窗口资源
DPtoLP 将点阵从设备坐标转换到专用设备场景逻辑坐标
EqualRgn 确定两个区域是否相等
ExcludeClipRect 从专用设备场景的剪裁区中去掉一个矩形区。矩形内不能进行绘图
ExcludeUpdateRgn 从专用设备场景剪裁区去掉指定窗口的刷新区域
ExtCreateRegion 根据世界转换修改区域
ExtSelectClipRgn 将指定区域组合到设备场景的当前剪裁区
FillRgn 用指定刷子填充指定区域
FrameRgn 用指定刷子围绕指定区域画一个外框
GetBoundsRect 获取指定设备场景的边界矩形
GetClipBox 获取完全包含指定设备场景剪裁区的最小矩形
GetClipRgn 获取设备场景当前剪裁区
GetDC 获取指定窗口的设备场景
GetDCEx 为指定窗口获取设备场景。相比GetDC,本函数提供了更多的选项
GetDCOrgEx 获取指定设备场景起点位置(以屏幕坐标表示)
GetDeviceCaps 根据指定设备场景代表的设备的功能返回信息
GetGraphicsMode 确定是否允许增强图形模式(世界转换)
GetMapMode 为特定设备场景调入映象模式
GetRegionData 装入描述一个区域信息的RgnData结构或缓冲区
GetRgnBox 获取完全包含指定区域的最小矩形
GetUpdateRgn 确定指定窗口的刷新区域。该区域当前无效,需要刷新
GetViewportExtEx 获取设备场景视口(viewport)范围
GetViewportOrgEx 获取设备场景视口起点
GetWindowDC 获取整个窗口(包括边框、滚动条、标题栏、菜单等)的设备场景
GetWindowExtEx 获取指定设备场景的窗口范围
GetWindowOrgEx 获取指定设备场景的逻辑窗口的起点
GetWindowRgn 获取窗口区域
GetWorldTransform 如果有世界转换,为设备场景获取当前世界转换
IntersectClipRect 为指定设备定义一个新的剪裁区
InvalidateRgn 使窗口指定区域不活动,并将它加入窗口刷新区,使之可随后被重画
InvertRgn 通过颠倒每个像素值反转设备场景指定区域
LPtoDP 将点阵从指定设备场景逻辑坐标转换为设备坐标
ModifyWorldTransform 根据指定的模式修改世界转换
OffsetClipRgn 按指定量平移设备场景剪裁区
OffsetRgn 按指定偏移量平移指定区域
OffsetViewportOrgEx 平移设备场景视口区域
OffsetWindowOrgEx 平移指定设备场景窗口起点
PaintRgn 用当前刷子背景色填充指定区域
PtInRegion 确定点是否在指定区域内
PtVisible 确定指定点是否可见(即,点是否在设备场景剪裁区内)
RectInRegion 确定矩形是否有部分在指定区域内
RectVisible 确定指定矩形是否有部分可见(是否在设备场景剪裁区内)
ReleaseDC 释放由调用GetDC或GetWindowDC函数获取的指定设备场景
RestoreDC 从设备场景堆栈恢复一个原先保存的设备场景
SaveDC 将指定设备场景状态保存到Windows设备场景堆栈
ScaleViewportExtEx 缩放设备场景视口的范围
ScaleWindowExtEx 缩放指定设备场景窗口范围
ScrollDC 在窗口(由设备场景代表)中水平和(或)垂直滚动矩形
SelectClipRgn 为指定设备场景选择新的剪裁区
SetBoundsRect 设置指定设备场景的边界矩形
SetGraphicsMode 允许或禁止增强图形模式,以提供某些支持(包括世界转换)
SetMapMode 设置指定设备场景的映射模式
SetRectRgn 设置区域为指定的矩形
SetViewportExtEx 设置设备场景视口范围
SetViewportOrgEx 设置设备场景视口起点
SetWindowExtEx 设置指定设备场景窗口范围
SetWindowOrgEx 设置指定设备场景窗口起点
SetWindowRgn 设置窗口区域
SetWorldTransform 设置世界转换
ValidateRgn 激活窗口中指定区域,把它从刷新区移走
WindowFromDC 取回与某一设备场景相关的窗口的句柄
10. API之硬件与系统函数
ActivateKeyboardLayout 激活一个新的键盘布局。键盘布局定义了按键在一种物理性键盘上的位置与含义
Beep 用于生成简单的声音
CharToOem 将一个字串从ANSI字符集转换到OEM字符集
ClipCursor 将指针限制到指定区域
ConvertDefaultLocale 将一个特殊的地方标识符转换成真实的地方ID
CreateCaret 根据指定的信息创建一个插入符(光标),并将它选定为指定窗口的默认插入符
DestroyCaret 清除(破坏)一个插入符
EnumCalendarInfo 枚举在指定"地方"环境中可用的日历信息
EnumDateFormats 列举指定的"当地"设置中可用的长、短日期格式
EnumSystemCodePages 枚举系统中已安装或支持的代码页
EnumSystemLocales 枚举系统已经安装或提供支持的"地方"设置
EnumTimeFormats 枚举一个指定的地方适用的时间格式
ExitWindowsEx 退出windows,并用特定的选项重新启动
ExpandEnvironmentStrings 扩充环境字串
FreeEnvironmentStrings 翻译指定的环境字串块
GetACP 判断目前正在生效的ANSI代码页
GetAsyncKeyState 判断函数调用时指定虚拟键的状态
GetCaretBlinkTime 判断插入符光标的闪烁频率
GetCaretPos 判断插入符的当前位置
GetClipCursor 取得一个矩形,用于描述目前为鼠标指针规定的剪切区域
GetCommandLine 获得指向当前命令行缓冲区的一个指针
GetComputerName 取得这台计算机的名称
GetCPInfo 取得与指定代码页有关的信息
GetCurrencyFormat 针对指定的"地方"设置,根据货币格式格式化一个数字
GetCursor 获取目前选择的鼠标指针的句柄
GetCursorPos 获取鼠标指针的当前位置
GetDateFormat 针对指定的"当地"格式,对一个系统日期进行格式化
GetDoubleClickTime 判断连续两次鼠标单击之间会被处理成双击事件的间隔时间
GetEnvironmentStrings 为包含了当前环境字串设置的一个内存块分配和返回一个句柄
GetEnvironmentVariable 取得一个环境变量的值
GetInputState 判断是否存在任何待决(等待处理)的鼠标或键盘事件
GetKBCodePage 由GetOEMCP取代,两者功能完全相同
GetKeyboardLayout 取得一个句柄,描述指定应用程序的键盘布局
GetKeyboardLayoutList 获得系统适用的所有键盘布局的一个列表
GetKeyboardLayoutName 取得当前活动键盘布局的名称
GetKeyboardState 取得键盘上每个虚拟键当前的状态
GetKeyboardType 了解与正在使用的键盘有关的信息
GetKeyNameText 在给出扫描码的前提下,判断键名
GetKeyState 针对已处理过的按键,在最近一次输入信息时,判断指定虚拟键的状态
GetLastError 针对之前调用的api函数,用这个函数取得扩展错误信息
GetLocaleInfo 取得与指定"地方"有关的信息
GetLocalTime 取得本地日期和时间
GetNumberFormat 针对指定的"地方",按特定的格式格式化一个数字
GetOEMCP 判断在OEM和ANSI字符集间转换的windows代码页
GetQueueStatus 判断应用程序消息队列中待决(等待处理)的消息类型
GetSysColor 判断指定windows显示对象的颜色
GetSystemDefaultLangID 取得系统的默认语言ID
GetSystemDefaultLCID 取得当前的默认系统"地方"
GetSystemInfo 取得与底层硬件平台有关的信息
GetSystemMetrics 返回与windows环境有关的信息
GetSystemPowerStatus 获得与当前系统电源状态有关的信息
GetSystemTime 取得当前系统时间,这个时间采用的是"协同世界时间"(即UTC,也叫做GMT)格式
GetSystemTimeAdjustment 使内部系统时钟与一个外部的时钟信号源同步
GetThreadLocale 取得当前线程的地方ID
GetTickCount 用于获取自windows启动以来经历的时间长度(毫秒)
GetTimeFormat 针对当前指定的"地方",按特定的格式格式化一个系统时间
GetTimeZoneInformation 取得与系统时区设置有关的信息
GetUserDefaultLangID 为当前用户取得默认语言ID
GetUserDefaultLCID 取得当前用户的默认"地方"设置
GetUserName 取得当前用户的名字
GetVersion 判断当前运行的Windows和DOS版本
GetVersionEx 取得与平台和操作系统有关的版本信息
HideCaret 在指定的窗口隐藏插入符(光标)
IsValidCodePage 判断一个代码页是否有效
IsValidLocale 判断地方标识符是否有效
keybd_event 这个函数模拟了键盘行动
LoadKeyboardLayout 载入一个键盘布局
MapVirtualKey 根据指定的映射类型,执行不同的扫描码和字符转换
MapVirtualKeyEx 根据指定的映射类型,执行不同的扫描码和字符转换
MessageBeep 播放一个系统声音。系统声音的分配方案是在控制面板里决定的
mouse_event 模拟一次鼠标事件
OemKeyScan 判断OEM字符集中的一个ASCII字符的扫描码和Shift键状态
OemToChar 将OEM字符集的一个字串转换到ANSI字符集
SetCaretBlinkTime 指定插入符(光标)的闪烁频率
SetCaretPos 指定插入符的位置
SetComputerName 设置新的计算机名
SetCursor 将指定的鼠标指针设为当前指针
SetCursorPos 设置指针的位置
SetDoubleClickTime 设置连续两次鼠标单击之间能使系统认为是双击事件的间隔时间
SetEnvironmentVariable 将一个环境变量设为指定的值
SetKeyboardState 设置每个虚拟键当前在键盘上的状态
SetLocaleInfo 改变用户"地方"设置信息
SetLocalTime 设置当前地方时间
SetSysColors 设置指定窗口显示对象的颜色
SetSystemCursor 改变任何一个标准系统指针
SetSystemTime 设置当前系统时间
SetSystemTimeAdjustment 定时添加一个校准值使内部系统时钟与一个外部的时钟信号源同步
SetThreadLocale 为当前线程设置地方
SetTimeZoneInformation 设置系统时区信息
ShowCaret 在指定的窗口里显示插入符(光标)
ShowCursor 控制鼠标指针的可视性
SwapMouseButton 决定是否互换鼠标左右键的功能
SystemParametersInfo 获取和设置数量众多的windows系统参数
SystemTimeToTzSpecificLocalTime 将系统时间转换成地方时间
ToAscii 根据当前的扫描码和键盘信息,将一个虚拟键转换成ASCII字符
ToUnicode 根据当前的扫描码和键盘信息,将一个虚拟键转换成Unicode字符
UnloadKeyboardLayout 卸载指定的键盘布局
VkKeyScan 针对Windows字符集中一个ASCII字符,判断虚拟键码和Shift键的状态
11. API之进程和线程函数
CancelWaitableTimer 这个函数用于取消一个可以等待下去的计时器操作
CallNamedPipe 这个函数由一个希望通过管道通信的一个客户进程调用
ConnectNamedPipe 指示一台服务器等待下去,直至客户机同一个命名管道连接
CreateEvent 创建一个事件对象
CreateMailslot 创建一个邮路。返回的句柄由邮路服务器使用(收件人)
CreateMutex 创建一个互斥体(MUTEX)
CreateNamedPipe 创建一个命名管道。返回的句柄由管道的服务器端使用
CreatePipe 创建一个匿名管道
CreateProcess 创建一个新进程(比如执行一个程序)
CreateSemaphore 创建一个新的信号机
CreateWaitableTimer 创建一个可等待的计时器对象
DisconnectNamedPipe 断开一个客户与一个命名管道的连接
DuplicateHandle 在指出一个现有系统对象当前句柄的情况下,为那个对象创建一个新句柄
ExitProcess 中止一个进程
FindCloseChangeNotification 关闭一个改动通知对象
FindExecutable 查找与一个指定文件关联在一起的程序的文件名
FindFirstChangeNotification 创建一个文件通知对象。该对象用于监视文件系统发生的变化
FindNextChangeNotification 重设一个文件改变通知对象,令其继续监视下一次变化
FreeLibrary 释放指定的动态链接库
GetCurrentProcess 获取当前进程的一个伪句柄
GetCurrentProcessId 获取当前进程一个唯一的标识符
GetCurrentThread 获取当前线程的一个伪句柄
GetCurrentThreadId 获取当前线程一个唯一的线程标识符
GetExitCodeProces 获取一个已中断进程的退出代码
GetExitCodeThread 获取一个已中止线程的退出代码
GetHandleInformation 获取与一个系统对象句柄有关的信息
GetMailslotInfo 获取与一个邮路有关的信息
GetModuleFileName 获取一个已装载模板的完整路径名称
GetModuleHandle 获取一个应用程序或动态链接库的模块句柄
GetPriorityClass 获取特定进程的优先级别
GetProcessShutdownParameters 调查系统关闭时一个指定的进程相对于其它进程的关闭早迟情况
GetProcessTimes 获取与一个进程的经过时间有关的信息
GetProcessWorkingSetSize 了解一个应用程序在运行过程中实际向它交付了多大容量的内存
GetSartupInfo 获取一个进程的启动信息
GetThreadPriority 获取特定线程的优先级别
GetTheardTimes 获取与一个线程的经过时间有关的信息
GetWindowThreadProcessId 获取与指定窗口关联在一起的一个进程和线程标识符
LoadLibrary 载入指定的动态链接库,并将它映射到当前进程使用的地址空间
LoadLibraryEx 装载指定的动态链接库,并为当前进程把它映射到地址空间
LoadModule 载入一个Windows应用程序,并在指定的环境中运行
MsgWaitForMultipleObjects 等侯单个对象或一系列对象发出信号。如返回条件已经满足,则立即返回
SetPriorityClass 设置一个进程的优先级别
SetProcessShutdownParameters 在系统关闭期间,为指定进程设置他相对于其它程序的关闭顺序
SetProcessWorkingSetSize 设置操作系统实际划分给进程使用的内存容量
SetThreadPriority 设定线程的优先级别
ShellExecute 查找与指定文件关联在一起的程序的文件名
TerminateProcess 结束一个进程
WinExec 运行指定的程序
12. API之控件与消息函数
AdjustWindowRect 给定一种窗口样式,计算获得目标客户区矩形所需的窗口大小
AnyPopup 判断屏幕上是否存在任何弹出式窗口
ArrangeIconicWindows 排列一个父窗口的最小化子窗口
AttachThreadInput 连接线程输入函数
BeginDeferWindowPos 启动构建一系列新窗口位置的过程
BringWindowToTop 将指定的窗口带至窗口列表顶部
CascadeWindows 以层叠方式排列窗口
ChildWindowFromPoint 返回父窗口中包含了指定点的第一个子窗口的句柄
ClientToScreen 判断窗口内以客户区坐标表示的一个点的屏幕坐标
CloseWindow 最小化指定的窗口
CopyRect 矩形内容复制
DeferWindowPos 该函数为特定的窗口指定一个新窗口位置
DestroyWindow 清除指定的窗口以及它的所有子窗口
DrawAnimatedRects 描绘一系列动态矩形
EnableWindow 指定的窗口里允许或禁止所有鼠标及键盘输入
EndDeferWindowPos 同时更新DeferWindowPos调用时指定的所有窗口的位置及状态
EnumChildWindows 为指定的父窗口枚举子窗口
EnumThreadWindows 枚举与指定任务相关的窗口
EnumWindows 枚举窗口列表中的所有父窗口
EqualRect 判断两个矩形结构是否相同
FindWindow 寻找窗口列表中第一个符合指定条件的顶级窗口
FindWindowEx 在窗口列表中寻找与指定条件相符的第一个子窗口
FlashWindow 闪烁显示指定窗口
GetActiveWindow 获得活动窗口的句柄
GetCapture 获得一个窗口的句柄,这个窗口位于当前输入线程,且拥有鼠标捕获(鼠标活动由它接收)
GetClassInfo 取得WNDCLASS结构(或WNDCLASSEX结构)的一个副本,结构中包含了与指定类有关的信息
GetClassLong 取得窗口类的一个Long变量条目
GetClassName 为指定的窗口取得类名
GetClassWord 为窗口类取得一个整数变量
GetClientRect 返回指定窗口客户区矩形的大小
GetDesktopWindow 获得代表整个屏幕的一个窗口(桌面窗口)句柄
GetFocus 获得拥有输入焦点的窗口的句柄
GetForegroundWindow 获得前台窗口的句柄
GetLastActivePopup 获得在一个给定父窗口中最近激活过的弹出式窗口的句柄
GetParent 判断指定窗口的父窗口
GetTopWindow 搜索内部窗口列表,寻找隶属于指定窗口的头一个窗口的句柄
GetUpdateRect 获得一个矩形,它描叙了指定窗口中需要更新的那一部分
GetWindow 获得一个窗口的句柄,该窗口与某源窗口有特定的关系
GetWindowContextHelpId 取得与窗口关联在一起的帮助场景ID
GetWindowLong 从指定窗口的结构中取得信息
GetWindowPlacement 获得指定窗口的状态及位置信息
GetWindowRect 获得整个窗口的范围矩形,窗口的边框、标题栏、滚动条及菜单等都在这个矩形内
GetWindowText 取得一个窗体的标题(caption)文字,或者一个控件的内容
GetWindowTextLength 调查窗口标题文字或控件内容的长短
GetWindowWord 获得指定窗口结构的信息
InflateRect 增大或减小一个矩形的大小
IntersectRect 这个函数在lpDestRect里载入一个矩形,它是lpSrc1Rect与lpSrc2Rect两个矩形的交集
InvalidateRect 屏蔽一个窗口客户区的全部或部分区域
IsChild 判断一个窗口是否为另一窗口的子或隶属窗口
IsIconic 判断窗口是否已最小化
IsRectEmpty 判断一个矩形是否为空
IsWindow 判断一个窗口句柄是否有效
IsWindowEnabled 判断窗口是否处于活动状态
IsWindowUnicode 判断一个窗口是否为Unicode窗口。这意味着窗口为所有基于文本的消息都接收Unicode文字
IsWindowVisible 判断窗口是否可见
IsZoomed 判断窗口是否最大化
LockWindowUpdate 锁定指定窗口,禁止它更新
MapWindowPoints 将一个窗口客户区坐标的点转换到另一窗口的客户区坐标系统
MoveWindow 改变指定窗口的位置和大小
OffsetRect 通过应用一个指定的偏移,从而让矩形移动起来
OpenIcon 恢复一个最小化的程序,并将其激活
PtInRect 判断指定的点是否位于矩形内部
RedrawWindow 重画全部或部分窗口
ReleaseCapture 为当前的应用程序释放鼠标捕获
ScreenToClient 判断屏幕上一个指定点的客户区坐标
ScrollWindow 滚动窗口客户区的全部或一部分
ScrollWindowEx 根据附加的选项,滚动窗口客户区的全部或部分
SetActiveWindow 激活指定的窗口
SetCapture 将鼠标捕获设置到指定的窗口
SetClassLong 为窗口类设置一个Long变量条目
SetClassWord 为窗口类设置一个条目
SetFocusAPI 将输入焦点设到指定的窗口。如有必要,会激活窗口
SetForegroundWindow 将窗口设为系统的前台窗口
SetParent 指定一个窗口的新父
SetRect 设置指定矩形的内容
SetRectEmpty 将矩形设为一个空矩形
SetWindowContextHelpId 为指定的窗口设置帮助场景(上下文)ID
SetWindowLong 在窗口结构中为指定的窗口设置信息
SetWindowPlacement 设置窗口状态和位置信息
SetWindowPos 为窗口指定一个新位置和状态
SetWindowText 设置窗口的标题文字或控件的内容
SetWindowWord 在窗口结构中为指定的窗口设置信息
ShowOwnedPopups 显示或隐藏由指定窗口所有的全部弹出式窗口
ShowWindow 控制窗口的可见性
ShowWindowAsync 与ShowWindow相似
SubtractRect 装载矩形lprcDst,它是在矩形lprcSrc1中减去lprcSrc2得到的结果
TileWindows 以平铺顺序排列窗口
UnionRect 装载一个lpDestRect目标矩形,它是lpSrc1Rect和lpSrc2Rect联合起来的结果
UpdateWindow 强制立即更新窗口
ValidateRect 校验窗口的全部或部分客户区
WindowFromPoint 返回包含了指定点的窗口的句柄。忽略屏蔽、隐藏以及透明窗口

最近半年一直搞拖机外挂制作,自己充电比较少,内心感觉很不安,也许很多人不齿于这个行业,但是游戏公司比我们更无耻,如果你是一个有经验的游戏玩家话,就会发现游戏公司和我们做外挂是一样的,他们挖空心事掏玩家腰包,当一个游戏刚出来的时候,这一点还不是很明显,一旦运营的后期,就会发现游戏的乐趣是与人民币成正比,所以说网络游戏没有乐趣,说的更明白一点,你在用你自己人民币在游戏中寻求自慰,从这一点上我们和游戏公司是一样的.
  废话少说,转入正题,我将把我自己对脱机外挂的理解,全部变成文字,写下来,为了便于大家测试,同时为了不引来不必要的麻烦,我将以韩国现阶段正运营的某款游戏为范本进行测试.内挂我就不说了.

游戏是拖机的,所以分析协议是第一步.协议是什么呢.简单的说就是一套规则,也可以说成是一套消息的集合,游戏服务器通过它与客户端进行通信.
消息的结构
longth
code
data
也可能是
code
longth
data
.还可能在它们的前面加前缀和后缀作为分割符号.
比如:某游戏消息格式如下
0c 00 04 0a 00 00 95 00   38 7d 02 00
前边
WORD 0c 00 就是长度
后边
WORD 04 0a 是标志具体说明这条消息有什么作用.
后边
data 00 00 95 00   38 7d 02 00
是一些具体数据.

游戏是由消息驱动的,任何游戏动作都是通过消息来完成.这里的完成是指被游戏服务
器接受,而不是客户端显示的某个动作.

要分析消息,消息从那里来呢?游戏服务器,怎么样把他拦截下来呢,工拦截工具,工具在哪儿,可以自己写,也可以用现成的工具,建议还是自己写个用起来方便.
现成的工具有很多,我这里选用wpe,下载地址在这里. http://resource.gameres.com/wpepro0.9a.rar
接下来我们讨论如何自己写一个拦截封包工具,一般三种,一种是hookapi,一种是通过raw socket.最后一种是,远线程注入,我们主要分析第一种hookapi方法.后两相对比较简单.
要彻底了解hook,前提是必须充分理解动态联结的概念.
动态链接库:相对于静态链接库而言的,静态库编译链接之后的模块和exe文件链接成一个整体.动态链接是再程序运行的时候才把整个库引入内存,如果多个程序用到一个库文件,windows再物理内存中只保留一个库代码,通过分页机制将这个库代码映射到不同的进程地址空间,这样不管有多少应用程序用到库,库代码实际上只占用一个库代码的空间内存。但是动态库中的数据还是有每一个应用程序有一份,这样才能共享。如果要数据也共享,必须在编译的时候,指定共享内存段,格式如下
#pragma     data_seg ("shared")
HHOOK hHook = NULL;
DWORD hProcId = 0;
#pragma     data_seg ()
#pragma            comment(linker,"/SECTION:shared,RWS")
这样这两个变量hHook,hProcId就变成了共享的变量,对于每个引入这个动态库的exe,当它改变这两个值的时候所有的其他程序,只要它引入了这个库,就会感应到,因为他们是共享的.
应用程序可以动态也可以静态引入库。当应用装载动态库的时候,程序仅包括库的名称和函数名称,这样就能通过通过PE文件的倒入表找到对应的函数,当然程序再编译和链接的时候必须找倒这些信息,这些东西就在到入库文件里。这些理解起来比较困难如果有dos 386程序中处理份页的经验,或者内存映射文件,和PE文件方面的知识理解起来就很容易了。
动态链接库需要强调的一点是它被映射到应用程序的地址空间执行的,它和应用程序是一体的,可以访问应用程序的资源,它所拥有的资源页可以被应用程序使用,它的任何操作都是代表应用程序的,当动态库打开文件,建立窗口,分配内存时这些东西都是应用程序所有的。
hook
只要理解了动态连接,hook也就比较容易理解了.
钩子用到的几个函数如下
SetWindowsHookExA(
    IN int idHook,
    IN HOOKPROC lpfn,
    IN HINSTANCE hmod,
    IN DWORD dwThreadId);

BOOL
WINAPI
UnhookWindowsHookEx(
    IN HHOOK hhk);
LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam);
前边两个是winapi大家可以查msdn了解,后边的一个是回掉函数,作为SetWindowsHookExA的参数.
现在我们就可以把整个dll的框架搭构出来.


#include "StdAfx.h"

using namespace std;

#pragma     data_seg ("shared")
HHOOK hHook = NULL;
DWORD hProcId = 0;
#pragma     data_seg ()
#pragma            comment(linker,"/SECTION:shared,RWS")

HWND hWgDlg;
DWORD dwCurrentPID;

LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
    BOOL bKeyUp = lParam & (1 << 31);
    if(bKeyUp && wParam == VK_F12&& nCode == HC_ACTION)
    {
        dwCurrentPID = GetCurrentProcessId();
        if (dwCurrentPID == hProcId)
        {
         }


    return ::CallNextHookEx(hHook,nCode,wParam,lParam);
}

bool InstallHook(HMODULE hLib,DWORD hProcIdIn)
{  
    if(hHook == NULL)
    {
        hProcId = hProcIdIn;
        hHook = ::SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardProc, hLib, 0);
return true;
        
    }

    return false;

}

bool UninstallHook(void)
{
    if(hHook != NULL)
    {
        hHook = NULL;
        ::UnhookWindowsHookEx(hHook);
        return true;
    }
    return false;
}
简单分析一下上边的代码,有三个函数,
KeyboardProc
是一个回调函数,
InstallHook装了一个键盘钩子.安装之后,由于是全局钩子,所有只要有键按下,KeyboardProc函数就执行,然后判断当前进程id是否如我们要挂钩的进程id相同如果相同就挂钩,就可以进行响应的处理,如果不是返回,进程id在程序启动后是唯一的.怎么样得到这个id呢?等等我们来讨论.
UninstallHook卸载钩子.
然后在def文件中把它们导出去.
获取进程id要用到#include <tlhelp32.h>
头文件中的几个函数,msdn里有详细的解释.
我把它封状成一个函数.
BOOL FindProcID (DWORD *ProcessID, const char *szProcNameIn,char *szProNameOut)
{
    HANDLE         hProcessSnap = NULL;
    BOOL           bRet      = FALSE;
    PROCESSENTRY32 pe32      = {0};

    //  Take a snapshot of all processes in the system.

    hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

    if (hProcessSnap == INVALID_HANDLE_VALUE)
        return (FALSE);

    //  Fill in the size of the structure before using it.

    pe32.dwSize = sizeof(PROCESSENTRY32);

    //  Walk the snapshot of the processes, and for each process,
    //  display information.

    if (Process32First(hProcessSnap, &pe32))
    {
        
        do
        {
            
            if (strlen((const char*)pe32.szExeFile) > MAXLONTH-1)
            {
                printf("over out");
                return FALSE;
            }
            if (strcmp(szProcNameIn,pe32.szExeFile) == 0)
            {
                *ProcessID = pe32.th32ProcessID;
                strcpy(szProNameOut,pe32.szExeFile);
                //printf( "PID\t\t\t%d\n", pe32.th32ProcessID);
                //printf( "ExeFile\t\t%s\n\n", pe32.szExeFile);
                break;
            }
            else
            {
                continue;
            }
          
        }
        while (Process32Next(hProcessSnap, &pe32));
        bRet = TRUE;
    }
    else
    {
        bRet = FALSE;    // could not walk the list of processes
    }

    // Do not forget to clean up the snapshot object.
    CloseHandle (hProcessSnap);
    return (bRet);
}
这样整个钩子的架构就完成了.
接着我们来探讨怎么样来拦截api来扑获服务器发送到客户端的数据,这个是整个抓包程序的重点

(未完,待序。。。)

        如果你曾经使用过传统的windows编程方法开发应用程序,你会深刻地体会到,即使是开发一个简单的windows应用程序也需要对windows的编程原理有很深刻的认识,同时也要手工编写很多的代码。因为程序的出错率几乎是随着代码长度的增加呈几何级数增长的,这就使得调试程序变得非常困难。所以传统的windows编程是需要极大的耐心和丰富的编程经验的。

  近几年来,面向对象技术无论是在理论还是实践上都在飞速地发展。面向对象技术中最重要的就是“对象”的概念,它把现实世界中的气球、自行车等客观实体抽象成程序中的“对象”。这种“对象”具有一定的属性和方法,这里的属性指对象本身的各种特性参数。如气球的体积,自行车的长度等,而方法是指对象本身所能执行的功能,如气球能飞,自行车能滚动等。一个具体的对象可以有许多的属性和方法,面向对象技术的重要特点就是对象的封装性,对于外界而言,并不需要知道对象有哪些属性,也不需要知道对象本身的方法是如何实现的,而只需要调用对象所提供的方法来完成特定的功能。从这里我们可以看出,当把面向对象技术应用到程序设计中时,程序员只是在编写对象方法时才需要关心对象本身的细节问题,大部分的时间是放在对对象的方法的调用上,组织这些对象进行协同工作。

  MFC的英文全称是Microsoft Fundation Classes,即微软的基本类库,MFC的本质就是一个包含了许多微软公司已经定义好的对象的类库,我们知道,虽然我们要编写的程序在功能上是千差万别的,但从本质上来讲,都可以化归为用户界面的设计,对文件的操作,多媒体的使用,数据库的访问等等一些最主要的方面。这一点正是微软提供MFC类库最重要的原因,在这个类库中包含了一百多个程序开发过程中最常用到的对象。在进行程序设计的时候,如果类库中的某个对象能完成所需要的功能,这时我们只要简单地调用已有对象的方法就可以了。我们还可以利用面向对象技术中很重要的“继承”方法从类库中的已有对象派生出我们自己的对象,这时派生出来的对象除了具有类库中的对象的特性和功能之外,还可以由我们自己根据需要加上所需的特性和方法,产生一个更专门的,功能更为强大的对象。当然,你也可以在程序中创建全新的对象,并根据需要不断完善对象的功能。

  正是由于MFC编程方法充分利用了面向对象技术的优点,它使得我们编程时极少需要关心对象方法的实现细节,同时类库中的各种对象的强大功能足以完成我们程序中的绝大部分所需功能,这使得应用程序中程序员所需要编写的代码大为减少,有力地保证了程序的良好的可调试性。

  最后要指出的是MFC类库在提供的对象的各种属性和方法都是经过谨慎的编写和严格的测试,可靠性很高,这就保证了使用MFC类库不会影响程序的可靠性和正确性。

2006年03月31日

仅仅概念了,其实web2.0熟悉了解的,每个人都有自己的一些想法看法,不过下面的是我从其他地方转过来的,算是挺全面和综合了,不过技术方面介绍更多些.web2.0理念上所带来的改变和特点那就太多了.
Web2.0,是相对Web1.0(2003年以前的互联网模式)的新的一类互联网应用的统称,是一次从核心内容到外部应用的革命。由Web1.0单纯通过网络浏览器浏览html网页模式向内容更丰富、联系性更强、工具性更强的Web2.0互联网模式的发展已经成为互联网新的发展趋势。

Web1.0到Web2.0的转变,具体的说,从模式上是单纯的“读”向“写”、“共同建设”发展;由被动地接收互联网信息向主动创造互联网信息迈进!从基本构成单元上,是由“网页”向“发表/记录的信息”发展;从工具上,是由互联网浏览器向各类浏览器、rss阅读器等内容发展;运行机制上,由“Client Server”向“Web Services”转变;作者由程序员等专业人士向全部普通用户发展;应用上由初级的“滑稽”的应用向全面大量应用发展。
总之,Web2.0是以 Flickr、Craigslist、Linkedin、Tribes、Ryze、 Friendster、Del.icio.us、43Things.com等网站为代表,以Blog、TAG、SNS、RSS、wiki等应用为核心,依据六度分隔、xml、ajax等新理论和技术实现的互联网新一代模式。

应用:
1、 Blog(from wiki)
历史:
Blog一词本起源于 weblog,意思是网上日志。1997年由 Jorn Barger所提出。在1998年, infosift 的编辑Jesse J. Garrett (http://www.jjg.net),将一些类似blog的网站收集起来,寄给Cameron Barrett。 Cameron随后将名单发布在CamWorld网站上,许多人亦陆续将blog的URL给Cameron,慢慢的,一个新的网络社区俨然成型。1999年,Brigitte Eaton (http://www.eatonweb.com)成立一个weblog 目录,收集她所知道的blog站。1999年,Peter Merholz (http://www.peterme.com)首次使用缩略词“blog”,成为今天常用的术语。但是,blog 真正开始快速发展的转折点,是在1999年6月,当时Pitas开始提供免费的weblog服务,紧接着8月,Pyra lab推出了现在的blogger.com。blogger.com 提供了简单易学的说明,以及能通过FTP直接将blog发表在个人网站上的功能,这带给使用者很大的方便。目前已经有了很多Blog托管服务商(BSP),业内人士对其盈利前景,持谨慎乐观态度。
Blog的特点
Blog是个人或群体以时间顺序所作的一种记录,并且不断更新。blog之间的交流主要是通过回溯引用(TrackBack)和回响/留言/评论(comment)的方式来进行的。blog的操作管理用语,也借鉴了大量档案管理用语。一个blog亦可被视为一个档案(archives),或是卷宗(fonds)。与传统档案不同的是,blog的写作者(blogger),既是这份档案的创作人(creator),也是其档案管理人(archivist)。

Blog大量采用了RSS(Really Simple Syndication或者Rich Site Summary或者RDF Site Summary)技术,所有的RSS文件都必须符合由W3C发布的XML 1.0规范。对读者来说,可以通过RSS订阅一个blog,确知该blog作者最近的更新。对Blog作者来说,RSS可以使自己发布的文章易于被计算机程序理解并摘要。

对知识管理和创造而言,blog提供了新的形态和途径。对汉语为母语的人而言,blog写作既接续了汉语笔记文学的优秀传统,更充分鼓励了个人表达。从交往形态考察,网志空间(blogosphere)设定了积极的读者、作者、编者互动转换关系,“言者互重,阅者相惜 ”。

2、 Tag (from blogbus)
什么是Tag?
Tag(标签)是一种更为灵活、有趣的日志分类方式,您可以为每篇日志添加一个或多个Tag(标签),然后您可以看到BlogBus上所有和您使用了相同Tag的日志,并且由此和其他用户产生更多的联系和沟通。不仅如此,我们还通过与Technorati的合作,把您的Tag发送到全球Blog空间,和全世界的人们共同分享。
Tag体现了群体的力量,使得日志之间的相关性和用户之间的交互性大大增强,可以让您看到一个更加多样化的世界,一个关联度更大的Blog空间,一个热点实时播报的新闻台。Tag为您提供前所未有的网络新体验……
当然,您也可以简单地把一个Tag(标签)理解为一个日志分类,但是Tag和分类的不同之处也很明显:
首先,分类是您在写日志之前就定好的,而Tag是在您写完日志之后再添加的;
其次,您可以同时为一篇日志贴上好几个Tag(标签),方便自己随时查找,而原先一篇日志只能有一个分类;
再次,当您积累了一定数量的Tag之后,您可以看看自己在Blog中最经常写的是哪些话题;
最后,您可以看到有哪些人和自己使用了一样的Tag(标签),进而找到和您志趣相投的Blogger。
举一个例子,比如说:您写了一篇到西湖旅游的日志,原来您都是把这一类的日志放到自己的“驴行天下”分类下,但是有了Tag之后,您可以给这篇日志同时加上“旅游”、“杭州”、“西湖”、“驴行天下”等几个Tag,当浏览者点击其中任何一个Tag,他都可以看到您的这篇日志。同时您自己也可以通过点击这几个Tag,看看究竟有谁最近也去了杭州旅游,或许你们还可以交流一下旅游心得,成为下一次出游的伙伴呢!

3、 SNS
Social Network Service,社会性网络软件,依据六度理论,以认识朋友的朋友为基础,扩展自己的人脉。并且无限扩张自己的人脉,在需要的时候,可以随时获取一点,得到该人脉的帮助。

SNS网站,就是依据六度理论建立的网站,帮你运营朋友圈的朋友。

4、 RSS(from wiki)
RSS是一种用于共享新闻和其他Web内容的数据交换规范,起源于网景通讯公司的推"Push"技术,将订户订阅的内容传送给他们的通讯协同格式(Protocol)。RSS可以是以下三个解释的其中一个:

Really Simple Syndication(真正简单的整合)
RDF (Resource Description Framework) Site Summary
Rich Site Summary(丰富站点摘要)
但其实这三个解释都是指同一种Syndication的技术。

目前RSS规范的主要版本有0.91、1.0和2.0。

0.91版和1.0版完全不同,风格不同,制定标准的人也不同。0.91版和2.0版一脉相承。1.0版更靠拢XML标准。

RSS目前广泛用于blog、wiki和网上新闻频道,世界多数知名新闻社网站都提供RSS订阅支持。

5、 Wiki(from wiki)
Wiki一词源自夏威夷语的「wee kee wee kee」,本是「快点快点」之意。在这里Wiki指的是一种超文本系统。这种超文本系统系支持那些面向社群的协作式写作,同时也包括一组支持这种写作的辅助工具。有人认为,Wiki系统属於一种人类知识的网路系统,我们可以在Web的基础上对Wiki文本进行浏览、创建、更改,而且这种创建、更改、及发布的代价远比HTML文本小;与此同时Wiki系统还支持那些面向社群的协作式写作,为协作式写作提供了必要的帮助;最后,Wiki的写作者自然构成了一个社群,Wiki系统为这个社群提供了简单的交流工具。与其它超文本系统相比,Wiki有使用简便且开放的优点,所以Wiki系统可以帮助我们在一个社群内共用某个领域的知识。
Wiki起源
1995年沃德?坎宁安(Ward Cunningham)为了方便模式社群的交流创建了全世界第一个wiki系统-WikiWikiWeb,并用它建立了波特兰模式知识库(Portland Pattern Repository)。在建立这个系统的过程中,沃德?坎宁安创造了Wiki的概念和名称,并且实现了支持这些概念的服务系统。这个系统是最早的Wiki系统。从1996年至2000年间,波特兰模式知识库围绕著面向社群的协作式写作,不断发展出一些支持这种写作的辅助工具,从而使Wiki的概念不断得到丰富。同时Wiki的概念也得到了传播,出现了许多类似的网站和软体系统。
Wiki的历史不长,无论是Wiki概念本身,还是相关软体系统的特性,都还在热烈的讨论中;所以怎样的一个站点才能称得上是一个Wiki系统还是有争议的。与Wiki相关新近出现的技术还有blog,它们都降低了超文本写作和发布的难度。这两者都是同内容管理系统密切相关的。
Wiki的特点
使用方便
维护快捷:快速创建、存取、更改超文本页面(这也是为什麼叫作 "wiki wiki" 的原因)。
格式简单:用简单的格式标记来取代 HTML 的复杂格式标记。(类似所见即所得的风格)
链接方便:通过简单标记,直接以关键字名来建立链接(页面、外部连接、图像等)。
命名平易:关键字名就是页面名称,并且被置於一个单层、平直的名空间中。
可增长
可增长:页面的链接目标可以尚未存在,通过点击链接,我们可以创建这些页面,从而使系统得以增长。
修订历史:记录页面的修订历史,页面的各个版本都可以被获取。
开放性
开放的:社群内的成员可以任意创建、修改、或删除页面。
可观察:系统内页面的变动可以被来访者清楚观察得到。
由於Wiki的自组织,可增长以及可观察的特点,使Wiki本身也成为一个网路研究的对象。对Wiki的研究也许能够让人们对网路的认识更加深入

理论和技术:
1、 六度关系理论
目前流行的“六度分隔”理论是20世纪60年代由美国的心理学家米格兰姆(Stanley Milgram)提出的,这个理论可以通俗地阐述为: 最多通过六个人你就能够认识任何一个陌生人。“六度分隔”成为人际关系世界中无可否认而又令人震惊的特征,许多社会学上的深入研究也给出令人信服的证据,说明这一特征不只是特例,在一般情形下也存在。 最近,美国哥伦比亚大学社会学系的瓦茨教授领导的EMAIL试验也再次证明了这一人际关系世界中惊人的规律。然而,在现实世界中,六十亿人怎么可能真的构成如此紧密的相互关联呢?是互联网使一切成为现实。

2、 Xml
XML即可扩展标记语言(eXtensible Markup Language)。标记是指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种信息的文章等。如何定义这些标记,既可以选择国际通用的标记语言,比如HTML,也可以使用象XML这样由相关人士自由决定的标记语言,这就是语言的可扩展性。XML是从SGML中简化修改出来的。它主要用到的有XML、XSL和XPath等。

3、 AJAX
Ajax并不是一种技术。它实际上是几种已经在各自领域大行其道技术的强强结合。Ajax混合了:
* 基于XHTML/CSS
* 由DOM(Document Object Model)实现动态显示与交互
* 通过XML和XSLT进行数据交换及处理
* 使用JavaScript整合上述技术

直观一点的说Ajax能够实现不刷新浏览器窗口(当然更不用安装额外的插件)而满足用户的操作,现在一些看上去很Cool的网站,很多是用这项技术实现的,其中包括:orkut、Gmail、Google Group、Google Suggest、Google Maps、Flickr、A9.com等。2SIMPLE的Co-mment系统虽然没有用到XML/XSLT,其理念已经暗合容Ajax,实现了不刷新网页提供动态内给用户。

现有的产品:
Wiki百科、Wallop 、yahoo360 、openbc 、 cyworld 、43things 、 flickr、 del.icio.us、 cragslist 、glob 、客齐集、 friendster 、 linkin 、UU通 、 优友 、 天际网 、爱米网 、linkist 、新浪点点通、skype、亿友、cyworld

现在说说web2.0的具体应用。

历史很重要。对一个技术的学习也应当从历史出发,通过其在时间形成历史的流变,得以知晓现状,甚至能够预知未来。

那Web 1.0是什么呢?

他们说,记得静态HTML的WWW时代么?

(那个时代的WWW应用、人们的Web体验、对社会的影响如何?)

那么动态HTML和静态HTML下的Web相比,是多少版本?1.5?对了,他们是真这么叫的。

(在效果和影响上,与1.0相比,扩展和加深多少?)

要呈现的数据存储在数据库中,通过Web服务端的程序,应用户的请求,取出数据,加上事先设计的模板,动态的生成Html代码,发送到用户的浏览器那里。

他是1.0系列,应为用户在浏览器中所见和Web 1.0一样,它有0.5的升级,因为数据不是事先制作并发布,而是动态生成,和用户的需要交互生成。

那好,在加0.5,到Web 2.0,变化是在哪里呢?

(看到了正在崛起的和改变的,会继续朝着什么方向改变互联网和社会呢?)

更新:关于各个版本的差别,看看亚马逊的例子。

事情没有那么幸运,Web 2.0并不是一个具体的事物,而是一个阶段,是促成这个阶段的各种技术和相关的产品服务的一个称呼。所以,我们无法说,Web 2.0是什么,但是可以说,那些是Web 2.0。

WikiPedia的Web 2.0条目下列出了这些条件:

* CSS 和语义相关的 XHTML 标记
* AJAX 技术
* Syndication of data in RSS/ATOM
* Aggregation of RSS/ATOM data
* 简洁而有意义的 URLs
* 支持发布为 weblog
* RESTian (preferred) 或者 XML Webservice APIs
* 一些社会性网络元素

必须具备的要素有:

* 网站应该能够让用户把数据在网站系统内外倒腾。
* 用户在网站系统内拥有自己的数据
* 完全基于Web,所有的功能都能透过浏览器完成。

(以上内容引用自英文版维基百科)

虽然这只是一家之言,不过,对于其中谈到的几个要素,大家还是公认的。

- 基于RSS/ATOM/RDF/FOAF等XML数据的同步、聚合和迁移。

数据不再和页面和网站混粘在一起,它独立了,它跟着用户走。这是Web 2.0的很重要特征。这也是为什么Blog是Web 2.0的代表的原因。在网志上,常主角的是相互独立的一则则的网志。

独立,然后有物理表现。现在,就能让他们活跃起来。透过对XML数据的处理,这些内容能被自由的组合,被各种应用程序,不论是Web程序还是桌面程序等呈现和处理。

(更新:参看商业周刊的All Your Info in One Place)

当然,最重要的是背后的人。

- 社会性因素。

内容跟着人走,内容又能够被用户自由的组合,也就是说,用户能够自由的借助内容媒介,创建起一个个的社群,发生各种社会性的(网络)行为。

此外还有标签以及建立在开放标签系统之上的Folksonomy。

- 第三个公认的因素是开放API,这个技术性稍强些,得另花时间研习,可以先看看例子:amazon、flickr、google map等。

(Web 2.0是个大筐,装了好多东西)

从Web应用的产品/服务生产者角度来说,该如何创建Web 2.0的产品呢?

重要的是要抓住这么几点,一个是微内容(这里有定义),一个是用户个体。除了这两个最基本的之外,还可以考虑社群内的分享以及提供API。

微内容:英文是microcontent。用户所生产的任何数据都算是微内容,比如一则网志,评论,图片,收藏的书签,喜好的音乐列表、想要做的事情,想要去的地方、新的朋友等等。这些微内容,充斥着我们的生活、工作和学习,它的数量、重要性,还有我们对它的依赖,并不亚于那些道貌岸然、西装革履的正统文章、论文、书籍。

对微内容的重新发现和利用,是互联网所开创的平等、***、自由风气的自然衍生,也是互联网相关技术消减信息管理成本之后的一个成果。

我们每天都生产众多的微内容,也消费着同样多的微内容。对于Web 2.0来说,如何帮助用户管理、维护、存储、分享、转移微内容,就成了关键。

用户个体。对于Web 1.0的典型产品/服务来说,用户没有具体的面貌、个性,它只是一个模糊的群体的代名词而已。但是对于Web2.0的产品和服务来说,用户是个实实在在的人。Web 2.0所服务的,是具体的人,而不是一个如同幽灵般的概念。并且,这个人的具体性,会因为服务本身而不断地充实起来。

如何为这个具体的个体服务,是Web 2.0设计的起点。

因此,一类可以被称作Web 2.0的产品/服务将是这样:

服务于用户个体的微内容的收集、创建、发布、管理、分享、合作、维护等的平台。

这是表。

里呢,恐怕就设计到好些人提到的,微内容的XML表现;微内容的聚合;微内容的迁移;社会性关系的维护;界面的易用性等等。

其质,是否就是开源、参与、个人价值、草根、合作等等?

Web2.0是许多方面起头并进又相互牵连的一个新的阶段的到来。因此,不同的人,有着不同的看法。那么,对于Web开发人员来说,Web2.0意味着什么呢?

他们说Web2.0阶段,Web是一个平台,或者说,Web正在变得可编程,可以执行的Web应用。野心家们设想这个它的终极目标是Web OS。

Web 1.0时候,Web只是一个针对人的阅读的发布平台,Web由一个个的超文本链接而成。现在的趋势发生了变化,Web不仅仅是Html文档的天下,它成了交互的场所。

Web 2.0 Conference网站的横幅引用Jeff Bezos的话说“Web 1.0 is making the internet for people,web 2.0 is making the internet better for computers”。

具体来讲,他们说Web成为一个开发环境,借助Web服务提供的编程接口,网站成了软件构件。

这些,就是Web Service的目标吧,信息孤岛通过这些Web Service的对话,能够被自由构建成适合不同应用的建筑来。

一些例子:del.icio.us、flickr、a9、amazon、yahoo、google、msn等提供的编程接口衍生出的各种应用。

为什么要开放APIs,这涉及到集市中的商业方面的技术策略。当然,还有更深层的原因,那是什么呢?

这种交互不仅体现在不同的网站服务之间,同时还体现在用户和Web之间在浏览器上的交互。这也是为什么在美味书签的收藏中Web2.0和AJAX如此相关的一个原因。

在Web页面上使用桌面程序有的那些便利,真的是很享受的事情。这恐怕也是Web可编程的一个方面,Web页面不再是标记和内容混合那样的简单,它就是一个可以编程的地方(是这样理解吧?)

有人反对说,AJAX的使用对搜索引擎不友好,只有Web 1.0的站长才关心这个事情吧,在Web 2.0时候,站长应该关心的是用户参与的便利、用户的自由度,至于搜索,有RSS/ATOM/RDF等,更本用不着操心,Google不是已经顺应这个趋势,让大家主动提交了么?

可编程的第三个方面,是否在于Web应用和桌面应用之间的无缝连接趋势的出现?类似这里说的“从工具上,是由互联网浏览器向各类浏览器、rss阅读器等内容发展”

……

自己不是专业开发人员,对Web OS的学习就点到为止,下次换个方向,否则我非头大不可。

———————

cathayan和Live21说Web 2.0其实思路很古老,就是internet 1.0的回归。

Live21那里提到“关于概念的炒做应该不是一次两次的问题了”。

提到概念炒作,我还真见到过,今天在一篇报道中看到作为WEB 2.0的BSP的字眼,好笑得很。

不过,我真想说明,在目前中文Blog空间内能查阅到的学习、探讨Web 2.0的资料都不是炒作,因为包括我在内,大家都没有任何商业背景(注意,新闻报道中的那些Web 2.0除外)。

[Web 2.0是个历史学的概念,而非是个技术性的概念,它是对Web发展历史断代的成果。对这个概念的梳理,能帮助我更好的把握互联网正在发生的技术与文化。]

中文网志圈谈论的Web 2.0内容摘要:

- “我觉得最有价值的一个是, web应用的数据格式开始逐渐出现了交换“标准”…这些标准…更加容易被机器自动化处理…能帮助人更好地过滤和定制化信息。其次,更多的服务将以web service的形式来提供,…这使得web 服务可以被互相集成, 从而诞生更多新的服务…人的重要性被提高了。过去web更多注重在信息提供, 而现在的越来越多的应用更加关注人,也就是所谓“社会性”。此外web的可用性改进正在被越来越重视…”[老冒:朝web 2.0泼点冷水]

- “RSS逐渐成为在线内容提供服务的标准发行平台。Blog以及user-generated内容的兴起。My Yahoo提供的RSS整合型服务。同时提出了值得密切关注的一些发展中领域,其中包括搜索技术,个性化,User-Generated内容(包括 blog,评论,图像和声音),音乐,短视频和Accessibility(易访问性)”[Owen:Mary Meeker新作 - 关于Digital World的发展报告的摘取]

- “我们谈论的Web2.0带给我们的是一种可读写的网络,这种可读写的网络表现于用户是一种双通道的交流模式,也就是说网页与用户之间的互动关系由传统的“Push”模式演变成双向交流的“Two- Way Communication”的模式。而对于Web服务的开发者来说,Web2.0带来的理念是服务的亲和力,可操作性,用户体验以及可用性。”[Owen:BaCKpACK-体验可读写的Web服务]

- “web 2.0是一种可以被分发的信息概述,web文档被格式化成了web数据。我们不会再看到不同旧地信息,现在我们所注意到是一种聚合、再混合内容的工具。”[songzhen:也说Web 2.0的翻译]

- “从这些应用中可以看到:如果基于传统的HTML,同样的功能实现将变得非常复杂和不稳定,数据的再生产和交换成本是很高的。所以:RSS这个标准最终要的贡献就是使得互联网的大部分网站变得可编程:类似的例子还有Blog中的:TrackBack Ping等机制,这些机制都是依赖XML/RPC实现的。当初为Lucene设计一个RSS/XML的接口也是为了这个初衷,它使得全文检索服务可以轻松的嵌入到各种应用中,通过关键词将各种内容之间实现更丰富的关联(Well Referenced)。”[车东:RSS,简单协议使得互联网可编程]

- “聚合的可能性以及如何更好地聚合(通常来说,更好的聚合应该基于个人知识管理和人际关系管理)很显然应该成为新一代或者说web2.0架构的核心之一。还有,你会重新发现,恰好是分散带动了聚合,聚合促进了分散,通过聚合的思维,互联网的网络状变得越来越丰富和密集,web2.0就变得越来越有趣味,它将web1.0时代的硕大节点即门户网站不断消解,去努力创造一个更加和谐的自然网络图谱。”[Horse:rss,聚合的无数可能]

- “新的web2.0网站都依赖于用户参与、用户主导、用户建设”。[Horse:Web 2.0这个词]

- Keso:Web 1.0与Web 2.0的区别

- “表面上看,Bloglines取代了门户,成为一个新的中心,但这里有一个重大的区别。门户是只读的,它带有某种锁定的性质。你可以离开门户,但你无法带走门户的内容。Bloglines则完全不同,你觉得它好用,就会继续使用,有一天你不再喜欢Bloglines,你完全可以导出你的OPML,到另一个 RSS订阅网站,或者干脆用客户端软件浏览同样的内容。所以,像Bloglines这样的网站,是可写的,你可以导入,也可以导出。就像你对信息拥有选择权,对服务提供商也同样拥有选择权,没有人可以锁定你,主动权在你自己手上。”[Keso:再说信息选择权]

- “Flickr、del.icio.us、Bloglines等Web 2.0服务,通过开放API获得了很多有趣、有用的想法,并借助外部的力量,让用户获得了更好的体验。更多大公司也加入到开放API的潮流中,Google、Yahoo!、Amazon、Skype。Google桌面搜索今年3月才开放API,很快就产生了大量的创造,大大扩充了可搜索的文件格式。”[Keso:开放API]

- “归纳:web1.0天天谈门户,web2.0谈个人化;web1.0谈内容,web2.0谈应用;web1.0商业模式,web2.0谈服务;web1.0谈密闭、大而全,web2.0大家谈开放、谈联合;web1.0网站中心化,web2.0谈个人中心化;web1.0一对一,web2.0谈社会性网络;web1.0不知道你是狗,web2.0你去年夏天干了什么我一清二楚甚至想要干什么呢。。。”[van_wuchanghua:发现了N.HOOLYWOOD,我还知道你今年夏天要干什么]

- “我认为Web2.0有下面几个方面的特性: 个性化的传播方式. 读与写并存的表达方式. 社会化的联合方式.标准化的创作方式. 便捷化的体验方式.

Web2.0是以Flickr、43Things.com等网站为代表,以Blog、TAG、SNS、RSS、wiki等社会软件的应用为核心,依据六度分隔、xml、ajax等新理论和技术实现的互联网新一代模式。”

Blog——博客/网志:Blog的全名应该是Web log,后来缩写为Blog。Blog是一个易于使用的网站,您可以在其中迅速发布想法、与他人交流以及从事其他活动。所有这一切都是免费的。

RSS——站点摘要:RSS是站点用来和其他站点之间共享内容的一种简易方式(也叫聚合内容)的技术。最初源自浏览器“新闻频道”的技术,现在通常被用于新闻和其他按顺序排列的网站,例如Blog。

WIKI——百科全书:Wiki–一种多人协作的写作工具。Wiki站点可以有多人(甚至任何访问者)维护,每个人都可以发表自己的意见,或者对共同的主题进行扩展或者探讨。

Wiki指一种超文本系统。这种超文本系统支持面向社群的协作式写作,同时也包括一组支持这种写作的辅助工具。

网摘:“网摘”又名“网页书签”,起源于一家叫做Del.icio.us的美国网站自2003年开始提供的一项叫做“社会化书签”(Social Bookmarks)的网络服务,网友们称之为“美味书签”(Delicious在英文中的意思就是“美味的;有趣的”)。

SNS——社会网络:Social Network Sofwaret,社会性网络软件,依据六度理论,以认识朋友的朋友为基础,扩展自己的人脉。

P2P——对等联网:P2P是peer-to-peer的缩写,peer在英语里有“(地位、能力等)同等者”、“同事”和“伙伴”等意义。这样一来,P2P也就可以理解为“伙伴对伙伴”、“点对点”的意思,或称为对等联网。目前人们认为其在加强网络上人的交流、文件交换、分布计算等方面大有前途。

IM——即时通讯:即时通讯(Instant Messenger,简称IM)软件可以说是目前我国上网用户使用率最高的软件。聊天一直是网民们上网的主要活动之一,网上聊天的主要工具已经从初期的聊天室、论坛变为以MSN、QQ为代表的即时通讯软件。

RSS为Really Simple Syndication(简易供稿)的缩写,是某一站点用来和其它站点之间共享内容的一种简易方式,也叫聚合内容。网络用户可以在客户端借助于支持RSS的新闻聚合工具软件(例如SharpReader NewzCrawler、FeedDemon RSSReader),在不打开网站内容页面的情况下阅读支持RSS输出的网站内容。可见,网站提供RSS输出,有利于让用户发现网站内容的更新。在高速高质高效成为主流呼声的互联网时代,RSS无疑推动了网上信息的传播,提出了另一种看世界的方式。

RSS,原意是把网站内容如标题、链接、部分内文甚至全文转换为可延伸标示语言(XML:eXtensible Markup Language)的格式,以向其它网站供稿,使用者可以用一般的浏览器观看,也可以用特殊的“阅读器”软件来阅读。

实验六 JAVA的常用类

一.实验目的:

练习使用JAVA的常用类

 

二.实验内容:

113张红桃扑克牌,按照顺序A2345678910JQK排成一圈,从A开始,总是按照同一方向数。每数到第10张便拿出来,再从下一个开始数,如此继续下去,问:最后剩下的那张扑克牌是什么?

2.显示用户输入的日期(年月日)是星期几。

 

三.实验步骤(每个实验都用了2种方法实现)

1.编写程序如下:

方法一:预先将10去掉,然后从J开始数,每数到第10个就delete

/*计算13张牌每次去掉第10张的结果

 * 实验人:李响

* 2006-3-28

 */

public class Lab6_1

{

     public static void main(String[] args)

     {

         int n, flag = 9;   //10已经被去掉,所以index9开始,即flag=9

         //flag表示指针,n用来数10个数的计数器

         StringBuffer card = new StringBuffer("A23456789JQK");  //预先将10取出了

         for( ; card.length() > 0 ; )

         {

              for(n =1 ; n < 10 ; n++)

              {

                   flag++;

                   if(flag == card.length())

                       flag = 0;

              }

//将牌取出

              card.deleteCharAt(flag);

              //也可以用card.delete(flagflag+1);

              System.out.println(card);

              //显示每次去掉一个后的结果

              if(flag == card.length())

                   flag = 0;

              //当指针指向字符串最后一个字符的时候,因为字符被去掉,所以指针归0

         }

     }

}

方法二:数一张写一张,数到第10张跳过不写

/*计算13张牌每次去掉第10张的结果

 * 实验人:李响

* 2006-3-30

 */

import java.util.*;

public class Lab6_1 {

     public static void main(String[]args)

     {

         int n = 1;

         //cardstr用来记录card的变化

          StringBuffer cardstr = new StringBuffer("A 2 3 4 5 6 7 8 9 10 J Q K");

         //card来处理数牌的变化

         StringTokenizer card = new StringTokenizer(cardstr.toString()); 

         cardstr = new StringBuffer();

         do{

              //如果到达card的最末尾字符,则将保存在cardstr中的字符串再次导入

              if(!card.hasMoreTokens())

              {

                   card = new StringTokenizer(cardstr.toString());

                   cardstr = new StringBuffer("");

              }

              //card中的字符导入cardstr中,如果遇到第10个数则跳过,不将其导入

              if(n%10 != 0)

              {

                   cardstr = cardstr.append(" ");

                   cardstr = cardstr.append(card.nextToken());            

              }

              else

                   card.nextToken();

              n++;  //n如果是10的倍数则表示就是第10个数

         }while(card.countTokens()>0||cardstr.length()>2);

         //如果card中没有tokenizer,而且cardstr的长度小于2表示就剩一个数字,则跳出循环

         //显示这个剩余的数字

         System.out.println("The last card is" + cardstr);

     }

}

2.编写程序如下:

方法一:

/*已知日期求星期

 * 实验人:李响

 * 2006-3-28

 */

import java.util.*;

public class Lab6_2 {

     public static void main(String[] args) throws java.io.IOException

     {

         BasicIo.prompt("Input the date(Usage:XXXX-XX-XX):");

         StringTokenizer myDate = new StringTokenizer(BasicIo.readString());

         int myYear = Integer.parseInt(myDate.nextToken("-"));      //强制类型转换

         int myMonth = Integer.parseInt(myDate.nextToken("-")) – 1; //注意month范围为0-11

         int myDay = Integer.parseInt(myDate.nextToken("-"));

         GregorianCalendar myWeek = new GregorianCalendar(myYear, myMonth, myDay);

         System.out.println("The date is " + toString(myWeek.get(Calendar.DAY_OF_WEEK)));

     }

     //添加一个静态类用于处理将weekinteger转化string

     static String toString(int week)

     {

         switch(week)

         {

         case 1 : return "SUNDAY";

         case 2 : return "MONDAY";

         case 3 : return "TUESDAY";

         case 4 : return "WEDNESDAY";

         case 5 : return "THURSDAY";

         case 6 : return "FRIDAY";

         case 7 : return "SATURDAY";

         default : return "Unknown" ;

         }

     }

}

方法二:

/*已知日期求星期

 * 实验人:李响

* 2006-3-29

 */

import java.util.*;

public class Lab6_2 {

     public static void main(String[] args) throws java.io.IOException

     {

         BasicIo.prompt("Input the date(Usage:XXXX-XX-XX):");

         //建立第一个取词器实例,"-"分隔符,以分开年月日

         StringTokenizer myDate = new StringTokenizer(BasicIo.readString(),"-");

         //将年转化为int

         int myYear = Integer.parseInt(myDate.nextToken());

         //将月转化为int

         int myMonth = Integer.parseInt(myDate.nextToken()) – 1;

         //将日转化为int   

         int myDay = Integer.parseInt(myDate.nextToken());

         //建立一个日历类,并将类初始化为用户输入的日期

         GregorianCalendar myCalendar = new GregorianCalendar(myYear, myMonth, myDay);

         //得到完整日历,并将其中的week分离出来

         Date current = myCalendar.getTime();

         String str = current.toString(); //Date类型数据->String类型

         StringTokenizer myWeek=new StringTokenizer(str); //取出week部分

         //显示week

         System.out.println("The date is " + myWeek.nextToken() + "!");

     }

}

 

四.实验结果

1.在Eclipse中运行结果如下:

方法一结果:

A2345689JQK

A234689JQK

A23689JQK

A2389JQK

A238JQK

A238JQ

A23JQ

A2JQ

A2J

2J

2

方法二结果:

The last card is 2

2.在Eclipse中运行结果如下:

方法一结果:

Input the date(Usage:XXXX-XX-XX):2006-3-28

The date is TUESDAY

方法二结果:

Input the date(Usage:XXXX-XX-XX):2006-3-29

The date is Wed!

 

五.实验分析

1.掌握了StringStringBufferStringTokenizerDateCalendarGregorianCalendar这几个常用类的成员函数调用以及静态属性的使用方法;

2.学会了如何将String转化为integer的类型转换:

1) int i = Integer.parseInt([String]);

i = Integer.parseInt([String],[int radix]);

2) int i = Integer.valueOf(my_str).intValue();

3.巩固了类方法的调用,区别staticpublic的不同。

 

 

PS:本次实验,我都用了两种方法来完成这次实验,原因是第一次写程序的时候没有参看老师提供的DEMO,然后在参考了DEMO后写了第二次程序,对代码进行修改或者精简。

 

 

 

 

报告人:李响

实验日期:2006-3-30

实验四   String类操作

 

一.实验目的:

练习使用Java基本数据类型。使用JavaString类操作字符串和子串。

 

二.实验内容:

1.写一个程序提示用户键入某一货币数量(以分为单位),该程序应计算出如何用最少量的1元,50分,10分和1分硬币得到该数目。如195分最少可以用一个1元硬币,150分硬币,410分硬币和51分硬币组成。

注意不要用数组存放不同硬币的值。

 

2.写一个程序可以对两个字符串进行测试,得知第一个字符串是否包含在第二个字符串中。如字符串 pen包含在字符串independent中。

可以利用字符串类方法

boolean regionMatches(int toffset, String other, int ooffset, int len)

toffset 指从被调用方法的字符串的第几个字符开始测试,如果是0,表明从字符串的首字符开始。other是指使用的另一个字符串。ooffset指从另一个字符串的第几个字符开始。len指要比较几个字符。该方法返回boolean值。

在本题中,ooffset0,因为我们要测试整个短字符串;len是短字符串的长度;所以应该用

big.regionMatches(index, small, 0, small.length())

如果big指“independent"small"pen",则index=2时为假,index=4时为真。

然后改进程序,当第一个字符串包含在第二个字符串中时,显示第一个字符串在第二个字符串中的起始位置。

再次改进程序,即使当用户输入顺序错误时(第一个是长字符串,第二个是短字符串),能自动在长字符串中搜寻短字符串。

 

三.实验步骤

1.编写程序:

public class Lab4_1

{

   public static void main(String[] args) throws java.io.IOException

   {

       int iconNum, sum;

       System.out.print("请输入要计算的金额:");

       sum = BasicIo.readInteger();

       iconNum = sum/100;

       System.out.print("1元的" + iconNum + ",");

       sum = sum%100;

       iconNum = sum/50;

       System.out.print("50分的" + iconNum + ",");

       sum = sum%50;

       iconNum = sum/10;

       System.out.print("10分的" + iconNum + ",");

       sum = sum%10;

       iconNum = sum/1;

       System.out.print("1分的" + iconNum + ".");

   }

}

2.编写程序:

public class Lab4_2

{

     public static void main(String[] args) throws java.io.IOException

     {

         int index = 0;

         boolean flag = false;

         String temp = new String();

         String big = new String();

         String small = new String();

 

         System.out.print("请输入一个单词:");

         big = BasicIo.readString();

         System.out.print("请再输入一个单词:");

         small = BasicIo.readString();

 

         if(big.length() < small.length())

         {

         temp = big;

             big = small;

             small = temp;

         }

 

         for( ; flag == false && index<big.length() ; index++)

         {

         flag = big.regionMatches(index, small, 0, small.length());

         }

         if(flag == true)

         System.out.println(small + "" + big + "的第" + index + "个字母开始");

         else

         System.out.println(big + "中不包含" + small);

     }

}

 

四.实验结果

1.在Eclipse中运行结果如下:

请输入要计算的金额:195

1元的1,50分的1,10分的4,1分的5.

请输入要计算的金额:120

1元的1,50分的0,10分的2,1分的0.

2Eclipse中运行结果如下:

请输入一个单词:independent

请再输入一个单词:pen

penindependent的第5个字母开始

请输入一个单词:javaAPI

请再输入一个单词:vaA

vaAjavaAPI的第3个字母开始

 

实验三    21点”的扑克游戏

 

一.实验目的:

利用Card类和循环语句编写一个扑克牌游戏

 

二.实验内容:

编写“21点”的扑克游戏

1.计算机随机地向用户发5张牌,如果牌的总点数小於或等於21点,则用户赢;超过21点则计算机赢。

注意类的没有参数的构造器随机产生一张牌,并且不会重复发牌。类模仿真实牌局的行为,可以用restart方法

从一副牌中重复抽取牌。

你的程序应该:

抽取一张牌;

向用户显示这张牌;

显示到目前为止已发牌的总点数

2.为使程序更象真实的牌局,用户应该能与计算机互动玩牌。修改刚才的程序,计算机仍然抽取5张牌,不超过21点的是赢家,如果双方都不超过21点,则双方都不算赢,你的程序应该能准确地报告结果。

程序应该:

为用户和计算机抽牌;

向用户显示牌;

分别显示用户和计算机的当前总点数;

为使游戏更加有趣,每抽一张新牌时都要显示牌和总点数

3修改程序使用户可以选择是否抽牌,而规定计算机必须抽5张牌或直到牌的总点数大於等於21

4.修改程序使得用户可以一直玩下去,并分别累计用户和计算机赢的牌局数。

 

三.实验步骤

编写程序如下:

/*

 ———————————————

  Java实验三:算21点游戏

  实验人:李响

  2006-03-06

  注意:考虑到电脑应该和人一样能自动选择是否再要牌,所以修改了程序段加入了AI,当电脑牌的总数>18点时就不再要牌

  ——————————————–

  */

public class Game

{

     private static int sumwin=0, sumdraw=0, sumlose=0;

     public static void main(String[] args) throws java.io.IOException

     {

         int n, p, sumPlayer, sumCpu;

         char flag1, flag2=’y', flag3;

         String storeCpu;

 

         for( p = 1 ; flag2 != ‘n’ ; p++)

         {

              System.out.println("——" + p + "——");  //开始新的一局游戏

              //复位段

              sumPlayer = 0;

              sumCpu = 0;

              flag1=’y';

              flag3=’n';

              storeCpu="";

 

              //发牌开始

              for(n = 1 ; n <= 5 ; n++)

              {

                   Card cardPlay = new Card();

                   Card cardCpu = new Card();

 

                   if(flag1 != ‘n’)

                   {          

                       sumPlayer = sumPlayer + cardPlay.getValue() + 1;   //计算当前玩家总点数

                       System.out.println("玩家:" + cardPlay.getSuitString() + ‘(‘ + cardPlay.getValueString() + ‘)’);   //显示玩家的牌

                   }

 

                   if(sumCpu < 18)

                   {                    

                       sumCpu = sumCpu + cardCpu.getValue() + 1;    //计算当前电脑总点数

                       storeCpu = storeCpu + cardCpu.getSuitString() + ‘(‘ + cardCpu.getValueString() + ‘)’ + ‘ ‘; //用字符串保存电脑所有的牌

                   } //电脑AI处理部分,如果电脑总点数超过18,就不要牌了

                   else

                       flag3 = ‘y’;

 

                   if(sumPlayer > 21 &&sumCpu < 22)

                   {

                       sumlose++;

                       System.out.println("你输了!");

                        System.out.println("你一共是" + sumPlayer + "");

                       break;

                   }

                   else if(sumPlayer < 22 && sumCpu > 21)

                   {

                       sumwin++;

                       System.out.println("你赢了!");

                       System.out.println("你一共是" + sumPlayer + "");

                       break;

                   }

                   else if(sumPlayer > 21 && sumCpu > 21)

                   {

                       sumdraw++;

                       System.out.println("平手!");

                       System.out.println("你一共是" + sumPlayer + "");

                       break;

                   }

                   else

                   {

                       if(flag1 != ‘n’)

                       {

                            System.out.print("你现在已经有" + sumPlayer + "点了,继续要牌吗?(y/n)");

                            flag1 = BasicIo.readCharacter();

                       }

                       if(flag1 == ‘n’ && flag3 == ‘y’)

                       {

                            HandleResult(sumPlayer, sumCpu);

                            cardPlay.restart();  //重新洗牌,开始新的一局游戏

                            cardCpu.restart();

                            break;

                       }

                   }

              }//for

 

              if(n == 6)

                   HandleResult(sumPlayer, sumCpu);  //五次发牌都没有分出结果,直接以总点数大小,判断赢家

           

              System.out.println("电脑:" + storeCpu + "一共是" + sumCpu + "");

 

              System.out.print("按任意键准备开始下一局,n结束游戏 ");

              flag2 = BasicIo.readCharacter();

              System.out.println();

         }//for

         System.out.println("——-游戏结束,结果统计——");

         System.out.println("您一共玩了" + (p-1) + ",赢了" + sumwin + ",平局" + sumdraw + ",输了" + sumlose + "!");

     }//main

     static void HandleResult(int sumPlayer, int sumCpu)

     {

         if(sumPlayer < sumCpu)

         {

              sumlose++;

              System.out.println("你输了!");

              System.out.println("你一共是" + sumPlayer + "");          

         }

         else if(sumPlayer > sumCpu)

         {

              sumwin++;

              System.out.println("你赢了!");

              System.out.println("你一共是" + sumPlayer + "");

         }

         else if(sumPlayer == sumCpu)

         {

              sumdraw++;

              System.out.println("平手!");

              System.out.println("你一共是" + sumPlayer + "");

         }

     }

}//class

 

四.实验结果

Eclipse中运行结果如下:

——1——

玩家:Clubs(ten)

你现在已经有10点了,继续要牌吗?(y/n)y

玩家:Hearts(five)

你现在已经有15点了,继续要牌吗?(y/n)y

玩家:Hearts(Queen)

平手!

你一共是27

电脑 :D iamonds(four)  Clubs(eight)  Hearts(Jack)  一共是23

按任意键准备开始下一局,n结束游戏

 

——2——

玩家:Clubs(five)

你现在已经有5点了,继续要牌吗?(y/n)y

玩家 :D iamonds(King)

你现在已经有18点了,继续要牌吗?(y/n)n

你赢了!

你一共是18

电脑:Clubs(six)  Spades(nine)  Hearts(eight)  一共是23

按任意键准备开始下一局,n结束游戏

 

——3——

玩家:Spades(King)

你现在已经有13点了,继续要牌吗?(y/n)n

你输了!

你一共是13

电脑:Spades(Jack)  Spades(ten)  一共是21

按任意键准备开始下一局,n结束游戏

 

——4——

玩家 :D iamonds(six)

你现在已经有6点了,继续要牌吗?(y/n)y

玩家 :D iamonds(three)

你现在已经有9点了,继续要牌吗?(y/n)y

玩家 :D iamonds(ten)

你现在已经有19点了,继续要牌吗?(y/n)n

你赢了!

你一共是19

电脑:Clubs(Ace)  Spades(five)  Spades(seven)  Diamonds(nine)  一共是22

按任意键准备开始下一局,n结束游戏 n

 

——-游戏结束,结果统计——

您一共玩了4,赢了2,平局1,输了1!

 

五.实验分析

1.在实验中调用了BasicIo.javaCard.java两个类,学会了使用这两个类提供的方法。

2.在实验中学会了使用JAVA结构化程序的编写,用到了if..else,for(),switch等语言来编写程序代码。

3.在实验中用到了函数的概念,学会了在JAVA中编写和调用函数,如private static表示静态的私有变量,static String()表示静态的返回字符串的函数。

 

报告人:李响

学号:034176220

日期:06-03-12

历史很重要。对一个技术的学习也应当从历史出发,通过其在时间形成历史的流变,得以知晓现状,甚至能够预知未来。

那Web 1.0是什么呢?

他们说,记得静态HTML的WWW时代么?

(那个时代的WWW应用、人们的Web体验、对社会的影响如何?)

那么动态HTML和静态HTML下的Web相比,是多少版本?1.5?对了,他们是真这么叫的。

(在效果和影响上,与1.0相比,扩展和加深多少?)

要呈现的数据存储在数据库中,通过Web服务端的程序,应用户的请求,取出数据,加上事先设计的模板,动态的生成Html代码,发送到用户的浏览器那里。

他是1.0系列,应为用户在浏览器中所见和Web 1.0一样,它有0.5的升级,因为数据不是事先制作并发布,而是动态生成,和用户的需要交互生成。

那好,在加0.5,到Web 2.0,变化是在哪里呢?

(看到了正在崛起的和改变的,会继续朝着什么方向改变互联网和社会呢?)

更新:关于各个版本的差别,看看亚马逊的例子

事情没有那么幸运,Web 2.0并不是一个具体的事物,而是一个阶段,是促成这个阶段的各种技术和相关的产品服务的一个称呼。所以,我们无法说,Web 2.0是什么,但是可以说,那些是Web 2.0。

WikiPedia的Web 2.0条目下列出了这些条件:

* CSS 和语义相关的 XHTML 标记
* AJAX 技术
* Syndication of data in RSS/ATOM
* Aggregation of RSS/ATOM data
* 简洁而有意义的 URLs
* 支持发布为 weblog
* RESTian (preferred) 或者 XML Webservice APIs
* 一些社会性网络元素

必须具备的要素有:

* 网站应该能够让用户把数据在网站系统内外倒腾。
* 用户在网站系统内拥有自己的数据
* 完全基于Web,所有的功能都能透过浏览器完成。

(以上内容引用自英文版维基百科

虽然这只是一家之言,不过,对于其中谈到的几个要素,大家还是公认的。

- 基于RSS/ATOM/RDF/FOAF等XML数据的同步、聚合和迁移。

数据不再和页面和网站混粘在一起,它独立了,它跟着用户走。这是Web 2.0的很重要特征。这也是为什么Blog是Web 2.0的代表的原因。在网志上,常主角的是相互独立的一则则的网志。

独立,然后有物理表现。现在,就能让他们活跃起来。透过对XML数据的处理,这些内容能被自由的组合,被各种应用程序,不论是Web程序还是桌面程序等呈现和处理。

(更新:参看商业周刊的All Your Info in One Place

当然,最重要的是背后的人。

- 社会性因素。

内容跟着人走,内容又能够被用户自由的组合,也就是说,用户能够自由的借助内容媒介,创建起一个个的社群,发生各种社会性的(网络)行为。

此外还有标签以及建立在开放标签系统之上的Folksonomy。

- 第三个公认的因素是开放API,这个技术性稍强些,得另花时间研习,可以先看看例子:amazon、flickr、google map等。

(Web 2.0是个大筐,装了好多东西)

从Web应用的产品/服务生产者角度来说,该如何创建Web 2.0的产品呢?

重要的是要抓住这么几点,一个是微内容(这里有定义),一个是用户个体。除了这两个最基本的之外,还可以考虑社群内的分享以及提供API。

微内容:英文是microcontent。用户所生产的任何数据都算是微内容,比如一则网志,评论,图片,收藏的书签,喜好的音乐列表、想要做的事情,想要去的地方、新的朋友等等。这些微内容,充斥着我们的生活、工作和学习,它的数量、重要性,还有我们对它的依赖,并不亚于那些道貌岸然、西装革履的正统文章、论文、书籍。

对微内容的重新发现和利用,是互联网所开创的平等、民主、自由风气的自然衍生,也是互联网相关技术消减信息管理成本之后的一个成果。

我们每天都生产众多的微内容,也消费着同样多的微内容。对于Web 2.0来说,如何帮助用户管理、维护、存储、分享、转移微内容,就成了关键。

用户个体。对于Web 1.0的典型产品/服务来说,用户没有具体的面貌、个性,它只是一个模糊的群体的代名词而已。但是对于Web2.0的产品和服务来说,用户是个实实在在的人。Web 2.0所服务的,是具体的人,而不是一个如同幽灵般的概念。并且,这个人的具体性,会因为服务本身而不断地充实起来。

如何为这个具体的个体服务,是Web 2.0设计的起点。

因此,一类可以被称作Web 2.0的产品/服务将是这样:

服务于用户个体的微内容的收集、创建、发布、管理、分享、合作、维护等的平台。

这是表。

里呢,恐怕就设计到好些人提到的,微内容的XML表现;微内容的聚合;微内容的迁移;社会性关系的维护;界面的易用性等等。

其质,是否就是开源、参与、个人价值、草根、合作等等?

WEB标准不是某一个标准,而是一系列标准的集合。网页主要由三部分组成:结构(Structure)、表现(Presentation)和行为(Behavior)。对应的标准也分三方面:结构化标准语言主要包括XHTML和XML,表现标准语言主要包括CSS,行为标准主要包括对象模型(如W3C DOM)、ECMAScript等。这些标准大部分由W3C起草和发布,也有一些是其他标准组织制订的标准,比如ECMA(European Computer Manufacturers Association)的ECMAScript标准。我们来简单了解一下这些标准:

1.结构标准语言

(1)XML

XML是The Extensible Markup Language(可扩展标识语言)的简写。目前推荐遵循的是W3C于2000年10月6日发布的XML1.0,参考(www.w3.org/TR/2000/REC-XML-20001006)。和HTML一样,XML同样来源于SGML,但XML是一种能定义其他语言的语。XML最初设计的目的是弥补HTML的不足,以强大的扩展性满足网络信息发布的需要,后来逐渐用于网络数据的转换和描述。关于XML的好处和技术规范细节这里就不多说了,网上有很多资料,也有很多书籍可以参考。

(2)XHTML

XHTML是The Extensible HyperText Markup Language可扩展标识语言的缩写。目前推荐遵循的是W3C于2000年1月26日推荐XML1.0(参考http://www.w3.org/TR/xhtml1)。XML虽然数据转换能力强大,完全可以替代HTML,但面对成千上万已有的站点,直接采用XML还为时过早。因此,我们在HTML4.0的基础上,用XML的规则对其进行扩展,得到了XHTML。简单的说,建立XHTML的目的就是实现HTML向XML的过渡。

2. 表现标准语言

CSS是Cascading Style Sheets层叠样式表的缩写。目前推荐遵循的是W3C于1998年5月12日推荐CSS2(参考http://www.w3.org/TR/CSS2/)。W3C创建CSS标准的目的是以CSS取代HTML表格式布局、帧和其他表现的语言。纯CSS布局与结构式XHTML相结合能帮助设计师分离外观与结构,使站点的访问及维护更加容易。

3.行为标准

(1)DOM

DOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM是一种与浏览器,平台,语言的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscaped的Javascript和Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。

(2) ECMAScript

ECMAScript是ECMA(European Computer Manufacturers Association)制定的标准脚本语言(JAVAScript)。目前推荐遵循的是ECMAScript 262(http://www.ecma.ch/ecma1/STAND/ECMA-262.HTM)。

2006年03月30日

其实现在想想很简单~~

1。调用API
Private Declare Function GetPrivateProfileString Lib "Kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFilename As String) As Long
Private Declare Function GetPrivateProfileInt Lib "Kernel32" Alias "GetPrivateProfileIntA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal nDefault As Long, ByVal lpFilename As String) As Long
Private Declare Function GetProfileSection Lib "Kernel32" Alias "GetProfileSectionA" (ByVal lpAppName As String, ByVal lpReturnedString As String, ByVal nSize As Long) As Long
Private Declare Function WritePrivateProfileString Lib "Kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFilename As String) As Long

2。写2个部分的程序
Function ReadIni(Filename$, SectionName$, KeyName$) As String
Dim RetStr As String
RetStr = String(255, Chr(0))
ReadIni = Left(RetStr, GetPrivateProfileString(SectionName$, ByVal KeyName$, "", RetStr, Len(RetStr), Filename$))
End Function

Public Sub WriteIni(Filename$, SectionName$, KeyName$, Str$)
HandleIo = WritePrivateProfileString(SectionName$, KeyName$, Str$, Filename$)
End Sub

实例:我的VB课程表

 Private Declare Function GetPrivateProfileString Lib "Kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFilename As String) As Long
Private Declare Function WritePrivateProfileString Lib "Kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFilename As String) As Long
Dim weekchg!

Private Sub Daychange_Click()
Call Run
End Sub

Private Sub Exit_Click()
Unload Me
End
End Sub

Private Sub Form_Load()
Dim flag!, todayIsWeek!
showTime.Caption = Now    ‘防止出现程序启动的第1秒没有时间显示
flag = (Date – DateValue("06, 02, 19")) \ 7 + 1   ‘计算第几周
weekchg = flag Mod 2         ‘计算单双周,余1为单周,余0为双周
showTerm.Caption = "2005年第2学期第" & flag & "周"      ‘显示第几周
todayIsWeek = Weekday(Now)   ‘从系统中得到今天的星期

‘显示当天的课程(自动选择单双周)——————-
‘当天为单周——————-
If weekchg = 1 Then
Weekchange(1).Value = True
‘当天为双周————-
ElseIf weekchg = 0 Then
Weekchange(0).Value = True
End If
Select Case todayIsWeek
Case 2
   Daychange.Text = "星期一"
Case 3
   Daychange.Text = "星期二"
Case 4
   Daychange.Text = "星期三"
Case 5
   Daychange.Text = "星期四"
Case 6
   Daychange.Text = "星期五"
Case 7
   MsgBox "今天是星期六没课哦,你将会看到星期一的课"
   Daychange.Text = "星期一"
Case 1
   MsgBox "今天是星期日没课哦,你将会看到星期一的课"
   Daychange.Text = "星期一"
End Select
Call Run
End Sub

Private Sub show_Click()
Call Run
End Sub

Private Sub Timer1_Timer()
showTime.Caption = Now
End Sub

Private Sub Weekchange_Click(Index As Integer)
If Index = 1 Then
   weekchg = 1    ‘选择单周
ElseIf Index = 0 Then
   weekchg = 0    ‘选择双周
End If
Call Run
End Sub

Public Sub Run()
Dim strPath$, weekstr$
strPath = App.Path & "\config.ini"
If weekchg = 1 Then
    weekstr = "单周"
ElseIf weekchg = 0 Then
    weekstr = "双周"
End If
For n = 1 To 5
 curricula(n).Text = ReadIni(strPath, weekstr & Daychange.Text, "curricula" & n)
 classroom(n).Text = ReadIni(strPath, weekstr & Daychange.Text, "classroom" & n)
 teacher(n).Text = ReadIni(strPath, weekstr & Daychange.Text, "teacher" & n)
 modality(n).Text = ReadIni(strPath, weekstr & Daychange.Text, "modality" & n)
Next n
End Sub

Function ReadIni(Filename$, SectionName$, KeyName$) As String
Dim RetStr As String
RetStr = String(255, Chr(0))
ReadIni = Left(RetStr, GetPrivateProfileString(SectionName$, ByVal KeyName$, "", RetStr, Len(RetStr), Filename$))
End Function

Public Sub WriteIni(Filename$, SectionName$, KeyName$, Str$)
HandleIo = WritePrivateProfileString(SectionName$, KeyName$, Str$, Filename$)
End Sub

Private Sub write_Click()
Dim strPath$, weekstr$
strPath = App.Path & "\config.ini"
If weekchg = 1 Then
    weekstr = "单周"
ElseIf weekchg = 0 Then
    weekstr = "双周"
End If
For n = 1 To 5
 Call WriteIni(strPath, weekstr & Daychange.Text, "curricula" & n, curricula(n).Text)
 Call WriteIni(strPath, weekstr & Daychange.Text, "classroom" & n, classroom(n).Text)
 Call WriteIni(strPath, weekstr & Daychange.Text, "teacher" & n, teacher(n).Text)
 Call WriteIni(strPath, weekstr & Daychange.Text, "modality" & n, modality(n).Text)
Next n
End Sub