文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>Win32 设备管理(2)

Win32 设备管理(2)

时间:2011-04-02  来源:Clingingboy

 

一.如何获得显示属性

使用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);
}

 

 

相关阅读 更多 +
排行榜 更多 +
泡龙大闯关安卓版

泡龙大闯关安卓版

冒险解谜 下载
割草派对安卓版

割草派对安卓版

飞行射击 下载
堡垒攻防战安卓版

堡垒攻防战安卓版

飞行射击 下载