请教大牛,有关于WIN32api调用问题(SetMonitorBrightness)

jianan0306 2014-09-29 03:53:04
大家好,我目前在编写Win32应用程序的时候遇到了一些问题,请问大家是否能给我一些帮助。

具体任务是这样的:

我想完成一个功能:当我在窗口上点击鼠标的时候,屏幕会变暗一些。就是这样的一个需求。然后我通过查阅资料,发现了微软在vista及以上版本的windows提供了一个新的开发接口:
SetMonitorBrightness 然后我便考虑使用这个API完成我的需求, 在我调用SetMonitorBrightness函数的时候,他需要让我提供两个参数, 其中一个参数是HMONITOR句柄,第二个是一个亮度的参数。
如下图所示,
SetMonitorBrightness参数格式:

由于hMonitor和GetMonitorBrightness都需要调用GetPhysicalMonitorsFromHMONITOR来获取显示器的句柄,因此我继续使用GetPhysicalMonitorsFromHMONITOR来调用

GetPhysicalMonitorsFromHMONITOR参数格式:

由于hMonitor需要使用MonitorFromWindow来获得, 而且dwPhysicalMonitorArraySize需要GetNumberOfPhysicalMonitorsFromHMONITOR来获得,因此继续调用这两个API

GetNumberOfPhysicalMonitorsFromHMONITOR参数格式:

这里也需要调用MonitorFromWindow,然后我最后再通过调用MonitorFromWindow来获得hMonitor这个句柄。

MonitorFromWindow参数格式:


这时便看到了他需要提供一个window的窗体句柄,然后填入与之关联的显示器标示。我就是按照这个思路去完成的我的程序,但是从实际运行上看,我可以将程序运行起来,但是却无法得到我想要的结果,之后我通过调试的方式去查询,则所有我所声明,需要当做参数传入的变量都无法正确得出结果,如:

所以请大家帮忙看一下, 这个问题能否解决?

编程环境是VS2010
以下是我程序的全部代码,就是建立了一个普通的win32 空的应用程序,然后建立了一个.cpp。


#ifndef UNICODE
#define UNICODE
#endif

#include <windows.h>
#include <PhysicalMonitorEnumerationAPI.h>
#include <HighLevelMonitorConfigurationAPI.h>
#include <WinUser.h>
#pragma comment(lib,"dxva2.lib")

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, PWSTR pCmdLine, int nCmdShow)
{
// Register the window class.
const wchar_t CLASS_NAME[] = L"Sample Window Class";

WNDCLASS wc = { };

wc.lpfnWndProc = WindowProc;
wc.hInstance = hInstance;
wc.lpszClassName = CLASS_NAME;

RegisterClass(&wc);

// Create the window.

HWND hwnd = CreateWindowEx(
0, // Optional window styles.
CLASS_NAME, // Window class
L"Learn to Program Windows", // Window text
WS_OVERLAPPEDWINDOW, // Window style

// Size and position
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,

NULL, // Parent window
NULL, // Menu
hInstance, // Instance handle
NULL // Additional application data
);

if (hwnd == NULL)
{
return 0;
}

ShowWindow(hwnd, nCmdShow);

// Run the message loop.

MSG msg = { };
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

return 0;
}

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;

case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);

FillRect(hdc, &ps.rcPaint, (HBRUSH) (COLOR_WINDOW+1));


EndPaint(hwnd, &ps);
}
return 0;

case WM_LBUTTONDOWN:
{


LPDWORD pdwMonitorCapabilities = NULL;
LPDWORD pdwSupportedColorTemperatures = NULL;
LPDWORD pdwNumberOfPhysicalMonitors = NULL;
LPPHYSICAL_MONITOR pPhysicalMonitorArray = NULL;
DWORD wSize;

HMONITOR hMonitor = MonitorFromWindow(hwnd,MONITOR_DEFAULTTONEAREST);
GetNumberOfPhysicalMonitorsFromHMONITOR(hMonitor,pdwNumberOfPhysicalMonitors);
wSize = sizeof(pdwNumberOfPhysicalMonitors);
GetPhysicalMonitorsFromHMONITOR(hMonitor,wSize,pPhysicalMonitorArray);
GetMonitorCapabilities(pPhysicalMonitorArray,pdwMonitorCapabilities,pdwSupportedColorTemperatures);
if((DWORD)pdwMonitorCapabilities & MC_CAPS_BRIGHTNESS)
{
MessageBox(NULL,TEXT("可以支持Brightness"),TEXT("InitInstance"),MB_OK);
}
else
MessageBox(NULL,TEXT("显示器无法支持该功能"),TEXT("InitInstance"),MB_OK);

}
return 0;

}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
...全文
1243 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
杯中月 2015-11-18
  • 打赏
  • 举报
回复 1
pPhysicalMonitorArray这个变量是一个LPPHYSICAL_MONITOR,LP开头,其实是指针,指向一个PHYSICAL_MONITOR结构,而这个结构包含了一个monitor指针和一个大小描述,所以你写pPhysicalMonitorArray的地方应该改成pPhysicalMonitorArray->hPhysicalMonitor,这个也是我琢磨了很久自己发现的,MSDN上有很多这种问题,给的答案都不对,微软官方的sample也没有说明。
devilhy1986 2014-11-17
  • 打赏
  • 举报
回复
您好 如果是获取显示器的句柄,再设定RGB呢?
赵4老师 2014-09-29
  • 打赏
  • 举报
回复
再不济,戴一些深浅不一的墨镜也行啊!别钻牛角尖了。
赵4老师 2014-09-29
  • 打赏
  • 举报
回复
为什么不直接按键盘上的调整亮度按键或显示器上的按钮或使用现成的视频管理软件呢?

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧