怎么用程序控制笔记本的电源开关,就是AC ON/OFF,解决了开贴给2000分 笔记本有电源和电池,我现在要在电源没有拔掉的情况下给电池放电,就是如何欺骗WINDOWS让它认为电源已经拔掉了(其实没有拔掉)。有没有直接的API可以调用。这个问题比较有难度,如果能够给出基本解决方案的也行,2000分照给。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 如果用汇编的话几行代码就能搞定,我也已经作出来了,现在要的是WINDOWS下的,我想应该有通用的控制方法,既然WINDOWS可以侦测到有没有电源插上然后使用电池供电,那肯定就有办法欺骗WINDOWS说现在电源没有插上,只是不知道WINDOWS电源控制是哪一块,怎么操作 没有试过控制笔记本电源。不过,去看看msdn上WriteGlobalPwrPolicy函数和SYSTEM_POWER_LEVEL结构的相关部分吧。应该是从这方面下手的 谁让WINDOWS不开源,连许多有用的API都不公司.黑! TO pomelowu(羽战士):msdn上WriteGlobalPwrPolicy函数和SYSTEM_POWER_LEVEL结构那个东西我看过了,牵涉到东西太多了,4个大结构2个枚举,最主要的还是不知道里面的常量是什么意思,MSDN也说的不明不白,搞不好就挂了 API不知有没有,楼主既然能用汇编,也许找找这方面的资料更好,直接跳过windows,估计是某种控制器(管电源的),驱动的话,可能是电源驱动吧 http://www.dmtf.org/standards/cim/cim_schema_v29_prelim/schema_based/Core_PowerMgmt.htm 看看这个也许有help 还有在 system32下的batmeter.dll中有 BatMeterCapabilities ,CreateBatMeter,DestroyBatMeter,PowerCapabilities,UpdateBatMeter 这几个function 但是我在msdn上查询不到具体的解释,我想应该是有帮助的,因为系统的电源管理中的电源量的肚量是更具这个dll来的,还有个batt.dll也许也是关于电源管理的。 /*++ BUILD Version: 0001 // Increment this if a change has global effectsCopyright (c) Microsoft Corporation. All rights reserved.Module Name: batclass.hAbstract: Defines battery class driver interfaces.Author: Ken Reneris (kenr) 02-Feb-1997Revision History: 7-10-98 split this file out of poclass.h (MHills)--*///// Battery device GUID//DEFINE_GUID( GUID_DEVICE_BATTERY, 0x72631e54L, 0x78A4, 0x11d0, 0xbc, 0xf7, 0x00, 0xaa, 0x00, 0xb7, 0xb3, 0x2a );DEFINE_GUID (BATTERY_STATUS_WMI_GUID, 0xfc4670d1, 0xebbf, 0x416e, 0x87, 0xce, 0x37, 0x4a, 0x4e, 0xbc, 0x11, 0x1a);DEFINE_GUID (BATTERY_RUNTIME_WMI_GUID, 0x535a3767, 0x1ac2, 0x49bc, 0xa0, 0x77, 0x3f, 0x7a, 0x02, 0xe4, 0x0a, 0xec);DEFINE_GUID (BATTERY_TEMPERATURE_WMI_GUID, 0x1a52a14d, 0xadce, 0x4a44, 0x9a, 0x3e, 0xc8, 0xd8, 0xf1, 0x5f, 0xf2, 0xc2);DEFINE_GUID (BATTERY_FULL_CHARGED_CAPACITY_WMI_GUID, 0x40b40565, 0x96f7, 0x4435, 0x86, 0x94, 0x97, 0xe0, 0xe4, 0x39, 0x59, 0x05);DEFINE_GUID (BATTERY_CYCLE_COUNT_WMI_GUID, 0xef98db24, 0x0014, 0x4c25, 0xa5, 0x0b, 0xc7, 0x24, 0xae, 0x5c, 0xd3, 0x71);DEFINE_GUID (BATTERY_STATIC_DATA_WMI_GUID, 0x05e1e463, 0xe4e2, 0x4ea9, 0x80, 0xcb, 0x9b, 0xd4, 0xb3, 0xca, 0x06, 0x55);DEFINE_GUID (BATTERY_STATUS_CHANGE_WMI_GUID, 0xcddfa0c3, 0x7c5b, 0x4e43, 0xa0, 0x34, 0x05, 0x9f, 0xa5, 0xb8, 0x43, 0x64);DEFINE_GUID (BATTERY_TAG_CHANGE_WMI_GUID, 0x5e1f6e19, 0x8786, 0x4d23, 0x94, 0xfc, 0x9e, 0x74, 0x6b, 0xd5, 0xd8, 0x88);#ifndef _BATCLASS_#define _BATCLASS_//// Battery driver interface//// IOCTL_BATTERY_QUERY_TAG// IOCTL_BATTERY_QUERY_INFORMATION// IOCTL_BATTERY_SET_INFORMATION// IOCTL_BATTERY_QUERY_STATUS////// IOCTL_BATTERY_QUERY_TAG//#define IOCTL_BATTERY_QUERY_TAG \ CTL_CODE(FILE_DEVICE_BATTERY, 0x10, METHOD_BUFFERED, FILE_READ_ACCESS)#define BATTERY_TAG_INVALID 0//// IOCTL_BATTERY_QUERY_INFORMATION//#define IOCTL_BATTERY_QUERY_INFORMATION \ CTL_CODE(FILE_DEVICE_BATTERY, 0x11, METHOD_BUFFERED, FILE_READ_ACCESS)typedef enum { BatteryInformation, BatteryGranularityInformation, BatteryTemperature, BatteryEstimatedTime, BatteryDeviceName, BatteryManufactureDate, BatteryManufactureName, BatteryUniqueID, BatterySerialNumber} BATTERY_QUERY_INFORMATION_LEVEL;typedef struct _BATTERY_QUERY_INFORMATION { ULONG BatteryTag; BATTERY_QUERY_INFORMATION_LEVEL InformationLevel; LONG AtRate;} BATTERY_QUERY_INFORMATION, *PBATTERY_QUERY_INFORMATION; 电池大小的度量有现成的api: GetSystemPowerStatus(),但它只是侦测电池状态而以,不能控制任何东西 batclass.h 看看这个header 文件他是battery device 对外的接口函数,你可以看看的。 很怀疑到底能不能这么干,因为本来这些东西都是主板上面设计好的,似乎和Windows没有关系(如果要和Windows有关系的话,刚开机的时候怎么办?)这个我认为不太可能用系统的API解决,就算有系统的API,也只能修改系统的能源策略并且激活某些扩展管理功能 汇编大概也是直接读写物理端口,你看一下这篇文章实战DeviceIoControl 之六:访问物理端口 bhw98 [原作] http://dev.csdn.net/develop/article/17/17296.shtm 可能MS的sdk里面的Power Management部分有这个功能,有一个设定是SYSTEM_POWER_STATE ,可以是PowerSystemShutdown,不过没做过。 用deviceiocontrol直接对设备写操作,不过这样和用汇编没什么区别了。 参考Battery Information,通过deviceiocontrol设置IOCTL_BATTERY_SET_INFORMATION;或者通过setup的api函数,移除设备试试看,因为电池也是一个设备。 不是说了用汇编或者说直接读写IO端口想在windows2000可以用就改成驱动如果一定要API,就编一个DLL调用驱动 我认为既然windows可以自己识别有没有插上电源,那就一定有办法不用编任何驱动就做到欺骗windows的目的。沉了好久的帖子,顶上来玩玩,做出做不出是另一码事,讨论讨论也有好处^_^ 这个问题有点深奥,我查了一遍windows的Api还是没发现,帮忙定以下,希望有大牛可以解决!!! 基于对话框的MFC中控件中如何显示时间 VC6通过 sqldmo列举某个服务器上的数据库,很急!!! CButton的派生类如何动态创建? 麻烦达人介绍下com atl wtl及相互间 的关系 MFC 两个简单的问题,各位帮忙看一下! 无法找到入口 谁能告诉我CWND和HWND有什么不一样 SOCKET高手请进:非阻塞套介子问题 怎样学好VC++?(本人经验之谈) 谁能介绍一下关于DLL中共享全局变量的方法 高分请教,如何创建一个如xp中语言工具条一样的窗口? 请大虾指点,SetWindowText(HWND hWnd,LPCTSTR lpString )这个函数怎么给combox控件赋值?
msdn上WriteGlobalPwrPolicy函数和SYSTEM_POWER_LEVEL结构那个东西我看过了,牵涉到东西太多了,4个大结构2个枚举,最主要的还是不知道里面的常量是什么意思,MSDN也说的不明不白,搞不好就挂了
7-10-98 split this file out of poclass.h (MHills)--*/
//
// Battery device GUID
//DEFINE_GUID( GUID_DEVICE_BATTERY, 0x72631e54L, 0x78A4, 0x11d0, 0xbc, 0xf7, 0x00, 0xaa, 0x00, 0xb7, 0xb3, 0x2a );DEFINE_GUID (BATTERY_STATUS_WMI_GUID,
0xfc4670d1, 0xebbf, 0x416e, 0x87, 0xce, 0x37, 0x4a, 0x4e, 0xbc, 0x11, 0x1a);
DEFINE_GUID (BATTERY_RUNTIME_WMI_GUID,
0x535a3767, 0x1ac2, 0x49bc, 0xa0, 0x77, 0x3f, 0x7a, 0x02, 0xe4, 0x0a, 0xec);
DEFINE_GUID (BATTERY_TEMPERATURE_WMI_GUID,
0x1a52a14d, 0xadce, 0x4a44, 0x9a, 0x3e, 0xc8, 0xd8, 0xf1, 0x5f, 0xf2, 0xc2);
DEFINE_GUID (BATTERY_FULL_CHARGED_CAPACITY_WMI_GUID,
0x40b40565, 0x96f7, 0x4435, 0x86, 0x94, 0x97, 0xe0, 0xe4, 0x39, 0x59, 0x05);
DEFINE_GUID (BATTERY_CYCLE_COUNT_WMI_GUID,
0xef98db24, 0x0014, 0x4c25, 0xa5, 0x0b, 0xc7, 0x24, 0xae, 0x5c, 0xd3, 0x71);
DEFINE_GUID (BATTERY_STATIC_DATA_WMI_GUID,
0x05e1e463, 0xe4e2, 0x4ea9, 0x80, 0xcb, 0x9b, 0xd4, 0xb3, 0xca, 0x06, 0x55);
DEFINE_GUID (BATTERY_STATUS_CHANGE_WMI_GUID,
0xcddfa0c3, 0x7c5b, 0x4e43, 0xa0, 0x34, 0x05, 0x9f, 0xa5, 0xb8, 0x43, 0x64);
DEFINE_GUID (BATTERY_TAG_CHANGE_WMI_GUID,
0x5e1f6e19, 0x8786, 0x4d23, 0x94, 0xfc, 0x9e, 0x74, 0x6b, 0xd5, 0xd8, 0x88);#ifndef _BATCLASS_
#define _BATCLASS_
//
// Battery driver interface
//
// IOCTL_BATTERY_QUERY_TAG
// IOCTL_BATTERY_QUERY_INFORMATION
// IOCTL_BATTERY_SET_INFORMATION
// IOCTL_BATTERY_QUERY_STATUS
////
// IOCTL_BATTERY_QUERY_TAG
//#define IOCTL_BATTERY_QUERY_TAG \
CTL_CODE(FILE_DEVICE_BATTERY, 0x10, METHOD_BUFFERED, FILE_READ_ACCESS)#define BATTERY_TAG_INVALID 0//
// IOCTL_BATTERY_QUERY_INFORMATION
//#define IOCTL_BATTERY_QUERY_INFORMATION \
CTL_CODE(FILE_DEVICE_BATTERY, 0x11, METHOD_BUFFERED, FILE_READ_ACCESS)typedef enum {
BatteryInformation,
BatteryGranularityInformation,
BatteryTemperature,
BatteryEstimatedTime,
BatteryDeviceName,
BatteryManufactureDate,
BatteryManufactureName,
BatteryUniqueID,
BatterySerialNumber
} BATTERY_QUERY_INFORMATION_LEVEL;typedef struct _BATTERY_QUERY_INFORMATION {
ULONG BatteryTag;
BATTERY_QUERY_INFORMATION_LEVEL InformationLevel;
LONG AtRate;
} BATTERY_QUERY_INFORMATION, *PBATTERY_QUERY_INFORMATION;
http://dev.csdn.net/develop/article/17/17296.shtm
或者通过setup的api函数,移除设备试试看,因为电池也是一个设备。
想在windows2000可以用就改成驱动
如果一定要API,就编一个DLL调用驱动