笔记本有电源和电池,我现在要在电源没有拔掉的情况下给电池放电,就是如何欺骗WINDOWS让它认为电源已经拔掉了(其实没有拔掉)。有没有直接的API可以调用。这个问题比较有难度,如果能够给出基本解决方案的也行,2000分照给。

解决方案 »

  1.   

    如果用汇编的话几行代码就能搞定,我也已经作出来了,现在要的是WINDOWS下的,我想应该有通用的控制方法,既然WINDOWS可以侦测到有没有电源插上然后使用电池供电,那肯定就有办法欺骗WINDOWS说现在电源没有插上,只是不知道WINDOWS电源控制是哪一块,怎么操作
      

  2.   

    没有试过控制笔记本电源。不过,去看看msdn上WriteGlobalPwrPolicy函数和SYSTEM_POWER_LEVEL结构的相关部分吧。应该是从这方面下手的
      

  3.   

    谁让WINDOWS不开源,连许多有用的API都不公司.黑!
      

  4.   

    TO pomelowu(羽战士):
    msdn上WriteGlobalPwrPolicy函数和SYSTEM_POWER_LEVEL结构那个东西我看过了,牵涉到东西太多了,4个大结构2个枚举,最主要的还是不知道里面的常量是什么意思,MSDN也说的不明不白,搞不好就挂了
      

  5.   

    API不知有没有,楼主既然能用汇编,也许找找这方面的资料更好,直接跳过windows,估计是某种控制器(管电源的),驱动的话,可能是电源驱动吧
      

  6.   

    http://www.dmtf.org/standards/cim/cim_schema_v29_prelim/schema_based/Core_PowerMgmt.htm   看看这个也许有help
      

  7.   

    还有在 system32下的batmeter.dll中有 BatMeterCapabilities ,CreateBatMeter,DestroyBatMeter,PowerCapabilities,UpdateBatMeter 这几个function 但是我在msdn上查询不到具体的解释,我想应该是有帮助的,因为系统的电源管理中的电源量的肚量是更具这个dll来的,还有个batt.dll也许也是关于电源管理的。
      

  8.   

    /*++ 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;
      

  9.   

    电池大小的度量有现成的api: GetSystemPowerStatus(),但它只是侦测电池状态而以,不能控制任何东西
      

  10.   

    batclass.h 看看这个header 文件他是battery device 对外的接口函数,你可以看看的。
      

  11.   

    很怀疑到底能不能这么干,因为本来这些东西都是主板上面设计好的,似乎和Windows没有关系(如果要和Windows有关系的话,刚开机的时候怎么办?)这个我认为不太可能用系统的API解决,就算有系统的API,也只能修改系统的能源策略并且激活某些扩展管理功能
      

  12.   

    汇编大概也是直接读写物理端口,你看一下这篇文章实战DeviceIoControl 之六:访问物理端口     bhw98 [原作] 
    http://dev.csdn.net/develop/article/17/17296.shtm
      

  13.   

    可能MS的sdk里面的Power Management部分有这个功能,有一个设定是SYSTEM_POWER_STATE ,可以是PowerSystemShutdown,不过没做过。
      

  14.   

    用deviceiocontrol直接对设备写操作,不过这样和用汇编没什么区别了。
      

  15.   

    参考Battery Information,通过deviceiocontrol设置IOCTL_BATTERY_SET_INFORMATION;
    或者通过setup的api函数,移除设备试试看,因为电池也是一个设备。
      

  16.   

    不是说了用汇编或者说直接读写IO端口
    想在windows2000可以用就改成驱动
    如果一定要API,就编一个DLL调用驱动
      

  17.   

    我认为既然windows可以自己识别有没有插上电源,那就一定有办法不用编任何驱动就做到欺骗windows的目的。沉了好久的帖子,顶上来玩玩,做出做不出是另一码事,讨论讨论也有好处^_^
      

  18.   

    这个问题有点深奥,我查了一遍windows的Api还是没发现,帮忙定以下,希望有大牛可以解决!!!