Chiphell - 分享与交流用户体验

 找回密码
 加入我们
搜索
      
查看: 7367|回复: 2

发现一段能神奇改变笔记本屏幕PWM频率的东东

[复制链接]
发表于 2014-2-13 15:42 | 显示全部楼层 |阅读模式
本帖最后由 醒目的我 于 2014-2-13 03:04 编辑

可以自行寻找关键字 IntelPWMControl,我顺手复制到下面了。



今天在51nb看到有人转的。刚刚运行的时候一边拿着手机照屏幕,发现确实能提高显示器的PWM频率。

笔记本是烂脑娃W520,其它品牌/型号能不能用要自行尝试。

运行的时候不需要管理员权限。

语法是后面直接跟数字作为PWM频率。比如IntelPWMControl 1000 就是设置PWM频率为1000.




  1. // this file is in the public domain

  2. #include <windows.h>
  3. #include <objbase.h>
  4. #include <stdio.h>

  5. #undef NDEBUG
  6. #include <assert.h>

  7. struct ICUIPower : public IUnknown
  8. {
  9.   virtual HRESULT STDMETHODCALLTYPE IsSupported(LPBOOL pSupported);
  10.   virtual HRESULT STDMETHODCALLTYPE dummy1();
  11.   virtual HRESULT STDMETHODCALLTYPE dummy2();
  12.   virtual HRESULT STDMETHODCALLTYPE dummy3();
  13.   virtual HRESULT STDMETHODCALLTYPE dummy4();
  14.   virtual HRESULT STDMETHODCALLTYPE GetPWMFrequency(LPUINT puiInverterType, LPDWORD pdwPWMFreq, LPDWORD pdwErrorCodes);
  15.   virtual HRESULT STDMETHODCALLTYPE SetPWMFrequency(UINT uiInverterType, DWORD dwPWMFreq, LPDWORD pdwErrorCodes);
  16. };

  17. int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
  18. {
  19.   int targetPWMFreq = 500;
  20.   sscanf_s(lpCmdLine, "%d", &targetPWMFreq);
  21.   targetPWMFreq = max(targetPWMFreq, 50);
  22.   targetPWMFreq = min(targetPWMFreq, 1050);
  23.   assert(SUCCEEDED(CoInitialize(0)));
  24.   CLSID clsid = { 0xC332C124, 0x340D, 0x4430, { 0xAA, 0x0D, 0xC7, 0x56, 0x02, 0x87, 0x6F, 0xCC } };
  25.   IID IID_ICUIPower = { 0x299D88F9, 0x2CBD, 0x4225, { 0xBF, 0x19, 0xFC, 0xD1, 0x64, 0xC5, 0x4C, 0x3F } };
  26.   IUnknown *pUnknown;
  27.   assert(SUCCEEDED(CoCreateInstance(clsid, 0, CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pUnknown)));
  28.   ICUIPower *pCUIPower;
  29.   assert(SUCCEEDED(pUnknown->QueryInterface(IID_ICUIPower, (void**)&pCUIPower)));
  30.   while (1)
  31.   {
  32.     UINT uiInverterType = 0;
  33.     DWORD dwPWMFreq = 0,
  34.           dwErrorCodes = 0;
  35.     assert(SUCCEEDED(pCUIPower->GetPWMFrequency(&uiInverterType, &dwPWMFreq, &dwErrorCodes)));
  36.     if (dwPWMFreq != targetPWMFreq)
  37.     {
  38.       dwPWMFreq = targetPWMFreq;
  39.       assert(SUCCEEDED(pCUIPower->SetPWMFrequency(uiInverterType, dwPWMFreq, &dwErrorCodes)));
  40.     }
  41.     Sleep(1000);
  42.   }
  43.   pCUIPower->Release();
  44.   pUnknown->Release();
  45.   CoUninitialize();
  46.   return 0;
  47. }
复制代码



P.S. 为什么我半天找不到上传附件的地方……
发表于 2014-2-13 19:04 | 显示全部楼层
不需要硬件支持?比如超范围了怎么办?
 楼主| 发表于 2014-2-14 02:35 | 显示全部楼层
Jimny2010 发表于 2014-2-13 06:04
不需要硬件支持?比如超范围了怎么办?

硬件支持肯定是需要的,这个应该就是针对其中某种硬件的代码。

在网上看到有烂脑娃T410测试能用,我自己手上的W520也能用。

烂脑娃ThinkPad系列应该都值得一试。
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

小黑屋|手机版|Archiver|Chiphell ( 沪ICP备12027953号-5 )沪公网备310112100042806 上海市互联网违法与不良信息举报中心

GMT+8, 2020-8-6 00:05 , Processed in 0.007344 second(s), 18 queries , Gzip On, Redis On.

Powered by Discuz! X3.2

© 2007-2019 Chiphell.com All rights reserved.

快速回复 返回顶部 返回列表