• 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);
    }
  • 相关阅读:
    warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
    Windows10+CLion+OpenCV4.5.2开发环境搭建
    Android解决部分机型WebView播放视频全屏按钮灰色无法点击、点击全屏白屏无法播放等问题
    MediaCodec.configure Picture Width(1080) or Height(2163) invalid, should N*2
    tesseract
    Caer -- a friendly API wrapper for OpenCV
    Integrating OpenCV python tool into one SKlearn MNIST example for supporting prediction
    Integrating Hub with one sklearn mnist example
    What is WSGI (Web Server Gateway Interface)?
    Hub --- 机器学习燃料(数据)的仓库
  • 原文地址:https://www.cnblogs.com/Clingingboy/p/2003384.html
Copyright © 2020-2023  润新知