代码改变世界

Win32 设备管理(2)

2011-04-02 15:08  Clingingboy  阅读(711)  评论(0编辑  收藏  举报

 

一.如何获得显示属性

使用GetDeviceCaps函数获取分辨率相关信息

 

View Code
void CDemoDlg::OnTest() 
{
    CListBox
* pListBox = (CListBox*)GetDlgItem(IDC_LIST);
    pListBox
->ResetContent();

    
//创建显示设备上下文
    HDC hdc = CreateDC(_T("display"), NULL, NULL, NULL);

    
//颜色深度
    int nBitsPerPixel=GetDeviceCaps(hdc, BITSPIXEL);
    
//水平分辨率
    int nWidth = GetDeviceCaps(hdc, HORZRES);
    
//垂直分辨率
    int nHeight = GetDeviceCaps(hdc, VERTRES);      
    
//刷新率
    int nDisplayFrequency = GetDeviceCaps(hdc, VREFRESH); 

    CString strText 
= _T("");
    strText.Format(_T(
"颜色深度:   %d 位"), nBitsPerPixel);
    pListBox
->AddString(strText);
    strText.Format(_T(
"水平分辨率: %d 像素"), nWidth);
    pListBox
->AddString(strText);
    strText.Format(_T(
"垂直分辨率: %d 像素"), nHeight);
    pListBox
->AddString(strText);
    strText.Format(_T(
"刷新率:     %d 赫兹"), nDisplayFrequency);
    pListBox
->AddString(strText);
}

 

二.如何设置显示属性


填充DEVMODE结构体信息,使用ChangeDisplaySettings函数修改显示设置

View Code
void CDemoDlg::OnTest() 

    DEVMODE DevMode;

    
//颜色深度
    if (m_ctrlBitsPerPixel.GetCurSel() == 0)
    {
        DevMode.dmBitsPerPel 
= 16;
    }
    
else if (m_ctrlBitsPerPixel.GetCurSel() == 1)
    {
        DevMode.dmBitsPerPel 
= 32;
    }
    
//分辨率
    if (m_ctrlPixels.GetCurSel() == 0)
    {
        DevMode.dmPelsWidth 
= 800;
        DevMode.dmPelsHeight 
= 600;
    }
    
else if (m_ctrlPixels.GetCurSel() == 1)
    {
        DevMode.dmPelsWidth 
= 1024;
        DevMode.dmPelsHeight 
= 768;
    }
    
//刷新率
    if (m_ctrlDispalyFrequencry.GetCurSel() == 0)
    {
        DevMode.dmDisplayFrequency 
= 60;
    }
    
else if (m_ctrlDispalyFrequencry.GetCurSel() == 1)
    {
        DevMode.dmDisplayFrequency 
= 75;
    }
    DevMode.dmSize 
= sizeof(DEVMODE);  
    DevMode.dmFields 
= DM_PELSWIDTH | DM_PELSHEIGHT | 
        DM_BITSPERPEL 
| DM_DISPLAYFREQUENCY; 

    
//设置显示属性
    LONG nResult = ChangeDisplaySettings(&DevMode, 0);
    
if (nResult == DISP_CHANGE_SUCCESSFUL)  
    {
        
//用新的设置参数更新注册表
        ChangeDisplaySettings(&DevMode, CDS_UPDATEREGISTRY);

        AfxMessageBox(_T(
"设置显示属性成功。"));
    }
    
else  
    {
        
//恢复默认设置
        ChangeDisplaySettings(NULL, 0);
        
        AfxMessageBox(_T(
"设置显示属性失败。"));
    }
}

 
三.如何设置显示属性

发送SC_MONITORPOWER命令,传递不同参数,即设置显示器显示的模式

View Code
void CDemoDlg::OnTest() 
{
    
//设置显示器为省电模式
    ::SendMessage(m_hWnd, WM_SYSCOMMAND, SC_MONITORPOWER, 1);

     Sleep(
2000);

    
//打开显示器
    ::SendMessage(m_hWnd, WM_SYSCOMMAND, SC_MONITORPOWER, -1);

    Sleep(
1000);

    
//关闭显示器
     ::SendMessage(m_hWnd, WM_SYSCOMMAND, SC_MONITORPOWER, 2);

    Sleep(
2000);

    
//打开显示器
    ::SendMessage(m_hWnd, WM_SYSCOMMAND, SC_MONITORPOWER, -1);
}


四.如何获得和设置鼠标的双击时间

GetDoubleClickTime和SetDoubleClickTime,一般没必要去修改

 

void CDemoDlg::OnTest1() 
{
    
//获得鼠标的双击时间
    UINT nInterval = GetDoubleClickTime();

    SetDlgItemInt(IDC_TEXT, nInterval);
}

void CDemoDlg::OnTest2() 
{
    UINT nInterval 
= GetDlgItemInt(IDC_TEXT, NULL, FALSE);

    
//设置鼠标的双击时间
    SetDoubleClickTime(nInterval);
}

 

五.如何获得鼠标的按键数

使用GetSystemMetrics函数的SM_CMOUSEBUTTONS参数

 

void CDemoDlg::OnTest() 
{
    
//获得鼠标的按键数
    int nCount = GetSystemMetrics(SM_CMOUSEBUTTONS);

    CString strText 
= _T("");
    strText.Format(_T(
"鼠标按键数:%d"), nCount);
    AfxMessageBox(strText);
}

 

六.如何切换鼠标的左键和右键

SwapMouseButton函数,传递TRUE,FALSE

void CDemoDlg::OnTest() 
{
    m_bSwap 
= !m_bSwap;

    
//切换鼠标左右键
    ::SwapMouseButton(m_bSwap);
}

 

七.如何获得键盘虚拟键的状态

使用GetKeyboardState获取,The GetKeyboardState function copies the status of the 256 virtual keys to the specified buffer

void CDemoDlg::OnTest1() 
{
    BYTE KeyboardState[
256];

    
//获得SHIFT键状态
    ::GetKeyboardState(KeyboardState);

    CString strText 
= _T("");

    
if (KeyboardState[VK_SHIFT] & 0x80)
    {
        strText 
= _T("SHIFT键被按下。");
    }
    
else
    {
        strText 
= _T("SHIFT键被释放。");
    }

    AfxMessageBox(strText);
}

 

八.如何获得键盘的类型

使用GetKeyboardType函数,均有规定

 

View Code
void CDemoDlg::OnTest() 
{
    CString strText 
= _T("");

    
//获得键盘类型
    int nType = ::GetKeyboardType(0);

    
if (nType == 1)
    {
        strText 
= _T("IBM PC/XT or compatible (83-key) keyboard");
    }
    
else if (nType == 2)
    {
        strText 
= _T("Olivetti ICO (102-key) keyboard");
    }
    
else if (nType == 3)
    {
        strText 
= _T("IBM PC/AT (84-key) or similar keyboard");
    }
    
else if (nType == 4)
    {
        strText 
= _T("IBM enhanced (101- or 102-key) keyboard");
    }
    
else if (nType == 5)
    {
        strText 
= _T("Nokia 1050 and similar keyboards");
    }
    
else if (nType == 6)
    {
        strText 
= _T("Nokia 9140 and similar keyboards");
    }
    
else if (nType == 7)
    {
        strText 
= _T("Japanese keyboard");
    }

    AfxMessageBox(strText);    
}

 

九.如何获得键盘按键的名称

使用GetKeyNameText函数,这个应该最实用

 

BOOL CDemoDlg::PreTranslateMessage(MSG* pMsg) 
{
    
if (pMsg->message == WM_KEYDOWN)
    {
        TCHAR szKeyName[
32];

        
//获得键盘按键的名称
        ::GetKeyNameText(pMsg->lParam, szKeyName, 32);

        SetDlgItemText(IDC_TEXT, szKeyName);
    }

    
return CDialog::PreTranslateMessage(pMsg);
}

 

十.如何将键盘的扫描码转换成虚拟键值

使用MapVirtualKey函数进行转换

 

BOOL CDemoDlg::PreTranslateMessage(MSG* pMsg) 
{
    
if (pMsg->message == WM_KEYDOWN)
    {
        
//获得键盘扫描码
        UINT nScanCode = HIWORD(pMsg->lParam);

        SetDlgItemInt(IDC_TEXT1, nScanCode, FALSE);

        
//获得虚拟键值
        UINT nVKCode = ::MapVirtualKey(nScanCode, 3);

        SetDlgItemInt(IDC_TEXT2, nVKCode, FALSE);    
    }
    
    
return CDialog::PreTranslateMessage(pMsg);
}