天天看點

另類屏蔽系統鍵(Ctrl+Alt+Del)兼談www.vbaccelerator.com網站

學習技術最好的方式就是拜讀優秀的源碼,不僅讓你學習到先進的技術,更教會你如何編碼:編碼的風格、注釋、思路等等。這段時間我給我自己定了一個目标,就是研究優秀的源碼:MenuHook、Skins、Form++等等。

在www.vbaccelerator.com上看到了一篇關于建立桌面的代碼,代碼很簡短,用了幾個API函數,就實作了新桌面的建立,這個新桌面與我們的預設的桌面沒有任何關系,在我們新的桌面上你可以打開相應的應用程式。其實本質上它不是“屏蔽”了系統鍵(Ctrl+Alt+Del),這三個鍵系統照樣相應,隻不過windows任務管理器出現在預設桌面,在新建立的桌面沒有顯示罷了,不過效果卻達到了(此外、windows其它的系統鍵也一概是這樣被屏蔽了)。這種方法對工控開發很有好處,因為工業監控程式都是全屏,并且獨占系統的資源(一般不允許打開非監控程式的軟體),是以新開一個桌面給工控程式用是完全可能和有必要的,并且效果絕佳(并不需要用各種技術來屏蔽系統鍵了),此外在程式中我們還可以檢測自己運作在哪一個桌面的,如果不是預定的桌面,我們的程式可以拒絕運作,這樣可以避免一些非獨立的元件單獨被加載。

這是建立桌面的關鍵源碼,具體請上www.vbaccelerator.com網站檢視。

 '*************************************************************************
'**函 數 名:Create
'**輸    入:ByVal sDesktopName(String) -
'**輸    出:無
'**功能描述:建立一個指定名稱的左面
'**全局變量:
'**調用子產品:
'**作    者:葉帆
'**日    期:2005-12-27 12:01:48
'**修 改 人:
'**日    期:
'**版    本:V1.0.3
'*************************************************************************
Public Sub Create(ByVal sDesktopName As String)
    Dim lR As Long
    
    '傳回目前線程所在的桌面句柄
    m_hDesktopThreadOld = GetThreadDesktop(GetCurrentThreadId())
    
    '判斷DLL調用是否有誤
    ApiErrorHandler Err.LastDllError, (m_hDesktopThreadOld = 0)
    
    '目前選擇的桌面
    m_hDesktopInputOld = OpenInputDesktop(0, False, DESKTOP_SWITCHDESKTOP)
    ApiErrorHandler Err.LastDllError, (m_hDesktopInputOld = 0)
    
    '建立桌面
    m_hDesktop = CreateDesktop(StrPtr(sDesktopName), ByVal 0&, ByVal 0&, 0, GENERIC_ALL, ByVal 0&)
    ApiErrorHandler Err.LastDllError, (m_hDesktop = 0)
    
    If Not (m_hDesktop = 0) Then
        lR = SetThreadDesktop(m_hDesktop)
        lR = SwitchDesktop(m_hDesktop)
        m_sDesktop = sDesktopName
    End If

End Sub

'*************************************************************************
'**函 數 名:ClearUp
'**輸    入:無
'**輸    出:無
'**功能描述:
'**全局變量:
'**調用子產品:
'**作    者:葉帆
'**日    期:2005-12-27 13:00:27
'**修 改 人:
'**日    期:
'**版    本:V1.0.3
'*************************************************************************
Public Sub ClearUp()
    If Not (m_hDesktopInputOld = 0) Then
        SwitchDesktop m_hDesktopInputOld           '設定為預設的桌面
        m_hDesktopInputOld = 0
    End If
    If Not (m_hDesktopThreadOld = 0) Then
        SetThreadDesktop m_hDesktopThreadOld       '預設原桌面線程
        m_hDesktopThreadOld = 0
    End If
    If Not (m_hDesktop = 0) Then
        CloseDesktop m_hDesktop                    '關閉新建立的桌面
        m_hDesktop = 0
    End If
End Sub

==========================================           

www.vbaccelerator.com網站真是一個國外較為優秀的VB開源網站,雖然在2005年之前就停止更新了,不過上面的技術還是值得我們深入研究的。

仔細研究網站上面的源碼,你發現幾乎所有的源碼都會引用一個SSubTmr6.dll元件,其實這個元件是VB開發的一個COM(程序内元件),實作的就是視窗的子類功能(此外包含一個API 建立的定時器)。

此外用的最多的就是GUI庫的API,大都是建立一個記憶體DC,在此基礎上用API進行記憶體DC操作。由于我MFC大部分做的都是背景驅動,是以GUI的知識掌握不太多,是以看這部分就比較吃力,是以我覺的要想學習好windows程式設計,VC必須要學,因為它從底層向你展現程式實作的細節,你能了解并且可以設計出更進階的應用。

談點自己的感觸:如果把VB僅僅當成一個工具,那是非常好的事,如果把它作為全部,那是最可悲的事。觀摩高手的編碼,無一不顯示這個高手對底層精湛的了解。讀讀梁肇新的《程式設計高手箴言》也許你感悟更多。

繼續閱讀