zoukankan      html  css  js  c++  java
  • Win32 设备管理(2)

    一.如何获得显示属性

    使用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);
    }
  • 相关阅读:
    Java并发辅助类的使用
    使用List需要注意的点
    构造函数、静态变量、代码块执行顺序
    TreeMap源码分析
    大战红黑树
    关于HashMap多线程下环形链表的总结
    LinkedHashMap源码分析
    「HDU 3292」 No more tricks, Mr Nanguo
    「BZOJ 3122」「SDOI2013」 随机数生成器
    「BZOJ3884」 上帝与集合的正确用法
  • 原文地址:https://www.cnblogs.com/Clingingboy/p/2003384.html
Copyright © 2011-2022 走看看