windows开机音乐编程可以检测到开机消息吗?

Windows游戏编程 第八章_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
喜欢此文档的还喜欢
Windows游戏编程 第八章
W​i​n​d​o​w​s​游​戏​编​程​ ​第​八​章​
​
​光​盘​:​h​t​t​p​:​/​/​w​w​w​.​k​u​a​i​p​a​n​.​c​n​/​i​n​d​e​x​.​p​h​p​?​a​c​=​f​i​l​e​&​a​m​p​;​o​i​d​=12089434​7
阅读已结束,如果下载本文需要使用
想免费下载本文?
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
你可能喜欢你的位置: &&
基于visual c++之windows核心编程代码分析(25)检测U盘控制开关机
基于visual c++之windows核心编程代码分析(25)检测U盘控制开关机
U盘,全称“USB闪存盘”,英文名“USB flash disk”。它是一个USB接口的无需物理驱动器的微型高容量移动存储产品,可以通过USB接口与电脑连接,实现即插即用。U盘的称呼最早来源于朗科公司生产的一种新型存储设备,名曰“优盘”,使用USB接口进行连接。USB接口就连到电脑的主机后,U盘的资料可与电脑交换。而之后生产的类似技术的设备由于朗科已进行专利注册,而不能再称之为“优盘”,而改称谐音的“U盘”。后来U盘这个称呼因其简单易记而广为人知,而直到现在这两者也已经通用,并对它们不再作区分,是移动存储设备之一.我们经常用到U盘,我们来亲自实践一下,检测U盘状态检测实现控制开机关机。具体代码如下,请见代码详细分析#include &windows.h&
#include &winioctl.h&
#include &stdio.h&
#include &initguid.h&
#include &setupapi.h&
#include &string.h&
#define MAX_DEVICE 256
wchar_t USBSerial[5][100] = {TEXT("")};
int gTag = 0;
DEFINE_GUID(UsbClassGuid, 0xa5dcbf10L, 0xd2, 0x90, 0x1f, 0x00, 0xc0, 0x4f, 0xb9, 0x51, 0xed);
// SetupDiGetInterfaceDeviceDetail所需要的输出长度,定义足够大
#define INTERFACE_DETAIL_SIZE
// IOCTL控制码
#define IOCTL_STORAGE_QUERY_PROPERTY
CTL_CODE(IOCTL_STORAGE_BASE, 0x0500, METHOD_BUFFERED, FILE_ANY_ACCESS)
#pragma comment(lib,"setupapi.lib")
//自动关机函数
void ExitWindowsCode()
OSVERSIONINFO
ZeroMemory(&stOSVI
OSVERSIONINFO
stOSVI.dwOSVersionInfoSize
OSVERSIONINFO
if (!GetVersionEx
if ( ( VER_PLATFORM_WIN32_NT == stOSVI.dwPlatformId ) && (
&= stOSVI.dwMajorVersion ) )
TOKEN_PRIVILEGES
(!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES
TOKEN_QUERY,
// Get the LUID for the shutdown privilege.
LookupPrivilegeValue(NULL,
SE_SHUTDOWN_NAME,
&tkp.Privileges[0].Luid);
tkp.PrivilegeCount
tkp.Privileges[0].Attributes
SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken,
0,(PTOKEN_PRIVILEGES)NULL,
(GetLastError()
ERROR_SUCCESS)
(!ExitWindowsEx(EWX_SHUTDOWN
EWX_FORCE|EWX_POWEROFF,
else//WIN9X
ExitWindowsEx(EWX_SHUTDOWN
EWX_POWEROFF,
// 根据GUID获得设备路径,用来判断U盘设备
// lpGuid: GUID指针
// pszDevicePath: 设备路径指针的指针
// 返回: 成功得到的设备路径个数,可能不止1个
int GetDevicePath(LPGUID lpGuid, LPTSTR* pszDevicePath)
HDEVINFO hDevInfoS
//设备信息集句柄;
SP_DEVICE_INTERFACE_DATA
PSP_DEVICE_INTERFACE_DETAIL_DATA pD
// 取得一个该GUID相关的设备信息集句柄
hDevInfoSet = ::SetupDiGetClassDevs((LPGUID)&UsbClassGuid,
// class GUID
// 无关键字
// 不指定父窗口句柄
DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
// 目前存在的设备
// 失败...
if (hDevInfoSet == INVALID_HANDLE_VALUE)
// 申请设备接口数据空间
pDetail = (PSP_DEVICE_INTERFACE_DETAIL_DATA)::GlobalAlloc(LMEM_ZEROINIT, INTERFACE_DETAIL_SIZE);
pDetail-&cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
nCount = 0;
bResult = TRUE;
// 设备序号=0,1,2... 逐一测试设备接口,到失败为止
while (bResult)
ifdata.cbSize = sizeof(ifdata);
// 枚举符合该GUID的设备接口
bResult = ::SetupDiEnumDeviceInterfaces(
hDevInfoSet,
// 设备信息集句柄
// 不需额外的设备描述
(ULONG)nCount,
// 设备信息集里的设备序号
// 设备接口信息
if (bResult)
// 取得该设备接口的细节(设备路径)
bResult = SetupDiGetInterfaceDeviceDetail(
hDevInfoSet,
// 设备信息集句柄
// 设备接口信息
// 设备接口细节(设备路径)
INTERFACE_DETAIL_SIZE,
// 输出缓冲区大小
// 不需计算输出缓冲区大小(直接用设定值)
// 不需额外的设备描述
if (bResult)
// 复制设备路径到输出缓冲区
wcscpy_s(pszDevicePath[nCount],wcslen(pDetail-&DevicePath)+1, pDetail-&DevicePath);
// 调整计数值
// 释放设备接口数据空间
::GlobalFree(pDetail);
// 关闭设备信息集句柄
::SetupDiDestroyDeviceInfoList(hDevInfoSet);
// 返回U盘设备句柄 hDevice
HANDLE OpenDevice(wchar_t* DevicePath)
hDevice = CreateFileW(DevicePath,
GENERIC_READ && GENERIC_WRITE,
FILE_SHARE_READ && FILE_SHARE_WRITE,
OPEN_EXISTING,
int _stdcall WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
int i, nD // nDevice 表示有多少个USB设备
int ndevice = 0; // 表示多少个U盘设备(可进行读写的设备)
wchar_t* szDevicePath[MAX_DEVICE];
// 设备路径
// DWORD dwOutB // IOCTL输出数据长度
// 定义一个 PSTORAGE_DEVICE_DESCRIPTOR 变量,存放设备属性
PSTORAGE_DEVICE_DESCRIPTOR DeviceD
// 变量初始化
DeviceDesc=(PSTORAGE_DEVICE_DESCRIPTOR)new BYTE[sizeof(STORAGE_DEVICE_DESCRIPTOR) + 512 - 1];
DeviceDesc-&Size = sizeof(STORAGE_DEVICE_DESCRIPTOR) + 512 - 1;
// 分配需要的空间
for (i = 0; i & MAX_DEVICE; i++)
szDevicePath[i] = new wchar_t[256];
// 取设备路径
nDevice = ::GetDevicePath((LPGUID)&UsbClassGuid, szDevicePath);
// 逐一获取设备信息
for (i = 0; i & nD i++)
// 打开设备
hDevice = OpenDevice(szDevicePath[i]);
if (hDevice != INVALID_HANDLE_VALUE)
for(int j = 0; j & 4; j++)
USBSerial[ndevice][j] = szDevicePath[i][j+12];
for(int j = 4; j & 28; j++)
USBSerial[ndevice][j] = szDevicePath[i][j+22];
//printf("U盘序列号为:");
//wprintf(L"%wsn", USBSerial[ndevice]);
ndevice ++;
::CloseHandle(hDevice);
// 释放空间
for (i = 0; i & MAX_DEVICE; i++)
delete []szDevicePath[i];
////////////////// 文件操作 ////////////////////////////////////////
DWORD nBytesRead = 0, dwBytesWritten = 0;
// 打开文件
hFile = CreateFile(TEXT("C:Windowssystem32USBID.ID"),
// file to open
GENERIC_READ | GENERIC_WRITE,
// open for reading
FILE_SHARE_READ | FILE_SHARE_WRITE,
// share for reading
// default security
OPEN_EXISTING ,
// existing file only
FILE_ATTRIBUTE_NORMAL, // normal file
// no attr. template
if (hFile != INVALID_HANDLE_VALUE)
long nFileSize = GetFileSize(hFile, NULL);
if (nFileSize == 0)
bool flag2 = CloseHandle(hFile);
if(::SetFileAttributes(TEXT("C:Windowssystem32USBID.ID"),FILE_ATTRIBUTE_NORMAL))
if (DeleteFile(TEXT("C:Windowssystem32USBID.ID")))
//MessageBox(NULL,TEXT("oo"),TEXT("oo"),MB_OK);
// 打开文件
hFile = CreateFile(TEXT("C:Windowssystem32USBID.ID"),
// file to open
GENERIC_READ | GENERIC_WRITE,
// open for reading
FILE_SHARE_READ | FILE_SHARE_WRITE,
// share for reading
// default security
OPEN_EXISTING ,
// existing file only
FILE_ATTRIBUTE_NORMAL, // normal file
// no attr. template
if (hFile == INVALID_HANDLE_VALUE)
hFile = CreateFile(TEXT("C:Windowssystem32USBID.ID"),
// file to create
GENERIC_READ | GENERIC_WRITE,
// open for writing
FILE_SHARE_READ | FILE_SHARE_WRITE,
// do not share
// default security
CREATE_ALWAYS,
// overwrite existing
FILE_ATTRIBUTE_NORMAL | // normal file
FILE_ATTRIBUTE_NORMAL,
// asynchronous I/O
if (ndevice & 1)
ExitWindowsCode();
long nFileSize = GetFileSize(hFile, NULL);
*tempbuf =
wchar_t[nFileSize]
// 读文件内容
if (nFileSize == 0)
// 创建文件,并把序列号写入文件中
hFile = CreateFile(TEXT("C:Windowssystem32USBID.ID"),
// file to create
GENERIC_READ | GENERIC_WRITE,
// open for writing
FILE_SHARE_READ | FILE_SHARE_WRITE,
// do not share
// default security
CREATE_ALWAYS,
// overwrite existing
FILE_ATTRIBUTE_NORMAL | // normal file
FILE_ATTRIBUTE_NORMAL,
// asynchronous I/O
// no attr. template
if (hFile == INVALID_HANDLE_VALUE)
// 把序列号写入文件中
WriteFile(hFile,
USBSerial,
2*wcslen(* USBSerial),
&dwBytesWritten,
nFileSize = GetFileSize(hFile, NULL);
if (nFileSize == 0)
bool flag1 = CloseHandle(hFile);
if (ndevice & 1)
ExitWindowsCode();
//进入比较序列号
ReadFile(hFile,
nFileSize,
&nBytesRead,
// 比较已经有的序列号与新读的是否相等
for(int i = 0; i& i ++)
for(int j = 0; j & nFileSize/2; j++)
if(tempbuf[j] == USBSerial[i][j])
ExitWindowsCode();
if(gTag == 1)
&&作者:黑暗伯爵 &&
最新热门tag您的位置: >
声卡无声的全面解决
  这是一个多媒体的信息时代,没有声音的电脑世界注定是苍白的 。但是,您可能会发现,即使在Windows 95/98上安装好了声卡,计 算机也不能发出美妙无比的乐音,有时甚至是声卡原来可以发声,但 是,在重新安装Windows 95/98或者安装某些应用软件后,声卡就成 了“哑巴”,于是,您只得重新设置或者重新安装Windows 95/98…… 但是,当你一切的办法都想尽了,声卡仍然沉默,此时,您可能只有 面对计算机感叹自己的命苦了!   以上这些问题,即使是即插即用声卡仍然存在,因为Windows 95/98 有时竟然不认这些即插即用声卡,为了使您的声卡能正常工作,本文 提供了声卡无声的全面解决方案。下面将分七个方面进行讨论。
  解决方案一   这是最简单的一种情况,只要正确安装声卡驱动程序,就能使声 卡发声。在进行下面的操作之前,首先您要准备好声卡驱动程序盘和 Windows 95/98的安装光盘。其操作步骤如下:   1.右击“我的电脑”,然后选择“属性”命令,再单击“设备管 理”选项卡,选择“按类型查看设备”。   2.将“设备管理器”中“声音、视频和游戏控制器”中那个被打 了叉号或者感叹号的项目删除,然后重新启动计算机。   3.重新启动后,Windows 95/98一般会发现新硬件,并出现一个 新硬件对话框要求您为它安装驱动程序。在询问驱动程序路径的时候 请插入相应的驱动程序盘,然后单击“从磁盘安装”按钮。在弹出的 对话框中输入或者选择驱动程序盘的盘符(当然,也可单击“浏览” 按钮,然后在出现的对话框中选择驱动程序所在盘符与路径,然后单 击“确定”按钮)。   4.最后单击“确定”按钮,打开驱动程序盘符,并安装此驱动程 序。 如果安装成功,则Windows 95/98将会出现一个对话框,要求您 重新启动计算机。 如果重启计算机后,并未没有出现上面所述的情况,此时,Windows 95/98将自己寻找声卡,然后自动安装其认为最匹配的驱动程序。如 果声卡仍不能发声,可在“设备管理器”中再一次删除“声音、视频 和游戏控制器”下面的项目,然后使用下面的方法安装驱动程序。   1.)单击“开始/设置/控制面板”,双击“控制面板”窗口中的 “添加新硬件”项。   2.)在添加硬件向导中,Windows 95/98会询问您是否自动检测与 配置新硬件,请选择“否”按钮,然后单击“下一步”按钮,则出现 图1所示的对话框。   3.)在“硬件类型”框中选择“声音、视频和游戏控制器”选项, 单击“下一步”按钮,进入图2界面。   4.)单击“从磁盘安装”按钮,然后选择驱动程序所在的路径,即 开始安装声卡的驱动程序。   如果上述方法还不能使您的声卡发声,请再删除被打了叉子或者感叹号的项目进入解决方案二。
  解决方案二   在“设备管理器”选项页中找找是否存在“检测到的其他设备” 或者是“未知设备”的选项?如果没找到,则您的声卡可能没有插好? 如果是这样,您可以参照解决方案五进行解决。   在找到了上述的这些选项后(Windows 95/98将没有认出的设备都 放在这里),用鼠标双击它们,删除带有Sound、midi、wave等字样的 选项,然后重新启动电脑,再按照解决方案一中相应的步骤进行操作 。   如果上述方法不行,则请进入解决方案三。
  解决方案三   如果在“设备管理器”选项页的“声音、视频和游戏控制器”下 面的选项前面都有感叹号,并且前面两种解决方案无效,那么,您可 以试试下面的操作(主要目的是将System.ini文件、注册表中的.386 声卡驱动程序删除或屏蔽),或许能够解决声卡无声的问题。   1.单击“声音、视频和游戏控制器”下面那些有感叹号的选项。   2.双击这些选项或单击“属性”按钮,弹出图3所示的对话框。 该对话框的“设备状态”框内显示了这些不正常的选项的有关信息与 运行状态。   3.单击“驱动程序”选项页,在随后弹出的对话框中显示了这些 不正常的选项的驱动程序信息,如供应商、日期、版本等。   4.单击“驱动程序的详细资料”按钮,在随后的对话框的“驱动 程序文件”列表框中列出了声卡的驱动程序,在列出的驱动程序中, 如果有.386文件(该文件是一个386保护模式的驱动程序),请记下 这些文件的名称。   5.用文本编辑器(如记事本)打开C:\Windows文件夹中的System.ini 文件,在System.ini文件查找刚才记下的那些.386文件,找到后,在 这些.386文件名的命令行前加上一个分号或Rem命令,以屏蔽这些命令行。   6.运行注册表编辑器(RegEdit.exe),然后在 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\C lass\MEDIA分支(此分支记录了Windows 95/98的多媒体数据)下找 到包含有刚才记下的.386文件的键值数据并将这些键值数据从注册表 中删除。   7.重新启动计算机,如果在启动Windows 95/98时能够听到声音就 表明上述的操作成功了。如果还不行,则不妨用解决方案五来解决声 卡的无声问题。 注意:上面这些操作可能会导致电脑重启后死机,遇到这种情况 时,您可以使用下面的方法进行解决:   1.)重启电脑,在出现“Starting Windows 95....”或者“Starting Windows 98....”时按F8键,然后在多启动菜单中选“3.Safe Mode” 选项,进入安全模式的Windows 95/98操作系统。   2.)右击“我的电脑”,选择菜单中的“属性”命令,进入“系统 属性”对话框,选择“设备管理”选项卡,然后在“声音、视频和游 戏控制器”栏目下将声卡选项删除,然后启动计算机。
  解决方案四   如果使用前面三种解决方案还不能解决声卡无声的问题,说明您 的声卡确实在发声方面存在问题。其中最常见且最头痛的问题就是 Windows 95/98无法认出此声卡的类型,即使您已经在系统中安装了正 确的驱动程序。此时“设备管理器”中的“检测到的其他设备”或 “未知设备”等项目下所列的选项通常是声卡或者其他设备。为了让 Windows 95/98认出此声卡,我们可以强行执行下面的操作步骤,如 果您运气好的话,该操作将使声卡发声!   1.断开电脑电源,打开机箱,从主板的声卡插槽中拔下您的声卡。   2.重新开机,用DOS启动盘启动系统,然后对硬盘进行低级格式化、 分区和高级格式化,完成后重新安装Windows 95/98,安装结束后, 再关机,然后在ISA插槽上插上声卡。   3.重新开机,然后插入驱动程序盘,在Windows 95/98检测到新 硬件时,使用解决方案一中提供的方法安装声卡驱动程序。   使用[解决方案四],可以让Windows 95/98解决硬件资源之间 的冲突,从而让此声卡发声。   如果上面的方法还不行,您可进入解决方案五、解决方案六和解 决方案七。
  解决方案五   有的声卡(如老的ALS007、TM-858等声卡),由于只提供了Windows 3.x的驱动程序或提供了Windows 95/98的驱动程序,但此程序可能 有问题或Windows 95/98将这些声卡误认为是Creative Sound Blaster Pro 16声卡,从而使这些声卡不能正常使用。经过分析,我们列出 了下面三种方法供用户参考。
  方法一:此方法适用于原Windows 3.x系统下有大量应用程序,并想安全过渡到Windows95/98的用户。   先在Windows 3.x下正确安装该卡的驱动程序。然后在Windows 3.x 下升级安装Windows 95/98(在安装过程中,必须将Windows95/98安 装在原Windows 3.x目录下),这样,一般都能解决问题。
  方法二:此方法适用于新装机的用户及硬盘较小者(该方法比方法 一节省空间)。 对于在DOS下直接安装Windows 95/98的用户,可下如下操作步骤进行:   1.先安装Windows 95/98至指定的目录下,重新启动进入Windows 95/98,然后双击“控制面板”窗口中的“添加新硬件”选项。   2.单击“下一步”按钮,直到出现硬件列表。选择列表中的 “系统设备”选项,弹出图4所示对话框。   3.单击“下一步”按钮,在“生产厂商”列表框中选择“(标 准系统设备)”,在“型号”列表框中选择“ISA Plug and Play bus”, 此时系统将自动检查ISA总线的即插即用硬件,并自动安装相应的驱 动程序。您只需按提示将随卡所配磁盘插入软盘驱动器即可。   安装结束后,启动计算机便可以使用该声卡了。
  方法三:此方法适用于一般用户,具有普遍性。   1.打开“控制面板”,双击“系统”图标进入“系统属性”对 话框。单击“设备管理”选项卡,然后再选中“按类型查看设备”, 双击“声音、视频和游戏控制器”(如果没有此栏目,请双击“其他 设备”),然后选择它下面的组件。   2.单击“属性”按钮,再选择“驱动程序”,单击“更改驱动 程序”,选择“从磁盘安装”按钮,插入声卡驱动程序磁盘,按提示 完成后面的操作。 在安装结束后,系统会提示您重新启动计算机。在启动后,即可 听见启动Windows 95/98的声音了。 如果以上方法还不行,对于ALS007芯片的声卡可以试试下面的操作步骤。   1.)首先将Almpu401.386、Alopl.386、Alsndsys.386(此三个文 件可在将驱动程序往Windows 3.x安装时拷下备用)文件拷入Windows 95/98目录下System子目录中。   2.)然后打开“控制面板”窗口,然后双击“添加/删除程序”图 标,然后按安装一般应用程序的方法安装ALS007的驱动程序Setup.exe 。   3.)在System.ini文件的[386Enh]节中加入如下行:      device=almpu401.386device=alopl.386device=alsndsys.386      在[drivers]小节中加入如下命令行:      wave=alsndsys.drvaux=alsndsys.drvmixer=alsndsys.      drvmidi=alopl.drvmidi1=almpu401.drv  保存System.ini文件,退出Windows 95/98系统再重新开机即可。   但是,在Windows 95/98上安装ALS007声卡的设备驱动程序后可 能会使系统变得不稳定。例如,在启动Windows 95/98时将出现如下错误信息:   “从alopl(07)+到设备‘3652’的非法VXD动态链接调 用,Windows配置非法。必须重新运行Windows安装程序解决这一问题 。要继续运行Wind ows,请按‘Y’或ENTER。要退出当前程序,请按 ‘N’,如果继续运行Windows,系统将变得不稳定。继续吗? Press Y for Yes or N for NO”   按“Y”键,则在Windows 95/98系统中运行应用程序时,还可能 出现如下错误信息:   “从alopl(05)+0000003EA到设备‘alsndsys’的非法VXD动态 链接调用”。或“alsndsys非法VXD(虚拟设备驱动程序)动态链接调 用”。 后来发现这是ALS007声卡的设备驱动程序的问题。您可以使用前 面的方法替换声卡驱动程序。
  解决方案六   有的声卡在Windows 95中能够发声,但是升级到Windows 98中就 无声了,如老的Yamaha 719声卡。这种声卡的安装需要有点技巧,首 先在Windows 95中安装此类声卡的驱动程序,然后升级到Windows 98 中,在Windows 98中将此卡的驱动程序删除,然后重新启动计算机, 并按照【解决方案一】中所介绍的方法安装驱动程序。   注意:新的Yamaha 719声卡进行了结构上的改进,在安装Windows 9X时就能正确地安装好驱动程序并正常工作。
  解决方案七   此方法应该不是什么方法,这说明您的声卡确实无法发声,这有 可能是网友稿件精品,或者Windows 95/98确实无法辨识它,可谓“水火 不相容”,此时您只得多攒得钱购买新的声卡(当然应注意此声卡的 兼容性与可安装性了)。这除了硬件的问题,系统也要负一定的责任! 看来完全依靠微软是不行的。   怎么样,通过以上我们提供的七种解决方案,您的声卡是不是已经发声了!
非常好我支持^.^
不好我反对
相关阅读:
( 发表人:admin )
评价:好评中评差评
技术交流、我要发言
发表评论,获取积分! 请遵守相关规定!提 交
Copyright &
.All Rights Reserved

我要回帖

更多关于 开机到windows就重启 的文章

 

随机推荐