zoukankan      html  css  js  c++  java
  • VB6之切换桌面

    Desktop的API,用于切换或者系统桌面环境。扩展起来可以做一个锁屏程序或者多桌面程序。

    模块部分:

      1 'desktop.bas
      2 'too much struct and declare unused, shame~
      3 Public Declare Function GetThreadDesktop Lib "user32" (ByVal dwThread As Long) As Long
      4 Public Declare Function CreateDesktop Lib "user32" Alias "CreateDesktopA" (ByVal lpszDesktop As String, _
      5     ByVal lpszDevice As String, _
      6     pDevmode As Long, _
      7     ByVal dwFlags As Long, _
      8     ByVal dwDesiredAccess As Long, _
      9     lpsa As Long) As Long
     10 Public Declare Function SwitchDesktop Lib "user32" (ByVal hDesktop As Long) As Long
     11 Public Declare Function SetThreadDesktop Lib "user32" (ByVal hDesktop As Long) As Long
     12 Public Declare Function CloseDesktop Lib "user32" (ByVal hDesktop As Long) As Long
     13 Public Declare Function OpenDesktop Lib "user32" Alias "OpenDesktopA" (ByVal lpszDesktop As String, _
     14     ByVal dwFlags As Long, _
     15     ByVal fInherit As Boolean, _
     16     ByVal dwDesiredAccess As Long) As Long
     17 Public Declare Function RegisterHotKey Lib "user32" (ByVal hwnd As Long, _
     18     ByVal id As Long, _
     19     ByVal fsModifiers As Long, _
     20     ByVal vk As Long) As Long
     21 Public Declare Function UnregisterHotKey Lib "user32" (ByVal hwnd As Long, _
     22     ByVal id As Long) As Long
     23 Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, _
     24     ByVal nIndex As Long, _
     25     ByVal dwNewLong As Long) As Long
     26 Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, _
     27     ByVal nIndex As Long) As Long
     28 Public Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" (ByVal lpApplicationName As String, _
     29     ByVal lpCommandLine As String, _
     30     lpProcessAttributes As Long, _
     31     lpThreadAttributes As Long, _
     32     ByVal bInheritHandles As Long, _
     33     ByVal dwCreationFlags As Long, _
     34     lpEnvironment As Any, _
     35     ByVal lpCurrentDriectory As String, _
     36     lpStartupInfo As STARTUPINFO, _
     37     lpProcessInformation As PROCESS_INFORMATION) As Long
     38 Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, _
     39     ByVal hwnd As Long, _
     40     ByVal Msg As Long, _
     41     ByVal wparam As Long, _
     42     ByVal lparam As Long) As Long
     43 
     44 Public Const CCHDEVICENAME = 32
     45 Public Const CCHFORMNAME = 32
     46 Public Const MOD_CONTROL = &H2
     47 Public Const WM_HOTKEY = &H312
     48 Public Const GWL_WNDPROC = -4
     49 
     50 Public Type STARTUPINFO
     51        cb As Long
     52       lpReserved As String
     53       lpDesktop As String
     54       lpTitle As String
     55       dwX As Long
     56       dwY As Long
     57       dwXSize As Long
     58       dwYSize As Long
     59       dwXCountChars As Long
     60       dwYCountChars As Long
     61       dwFillAttribute As Long
     62       dwFlags As Long
     63       wShowWindow As Integer
     64       cbReserved2 As Integer
     65       lpReserved2 As Long
     66       hStdInput As Long
     67       hStdOutput As Long
     68       hStdError As Long
     69 End Type
     70 
     71 Public Type PROCESS_INFORMATION
     72        hProcess As Long
     73       hThread As Long
     74       dwProcessId As Long
     75       dwThreadId As Long
     76 End Type
     77 
     78 
     79 Public Type DEVMODE
     80        dmDeviceName As String * CCHDEVICENAME
     81        dmSpecVersion As Integer
     82       dmDriverVersion As Integer
     83       dmSize As Integer
     84       dmDriverExtra As Integer
     85       dmFields As Long
     86       dmOrientation As Integer
     87       dmPaperSize As Integer
     88       dmPaperLength As Integer
     89       dmPaperWidth As Integer
     90       dmScale As Integer
     91       dmCopies As Integer
     92       dmDefaultSource As Integer
     93       dmPrintQuality As Integer
     94       dmColor As Integer
     95       dmDuplex As Integer
     96       dmYResolution As Integer
     97       dmTTOption As Integer
     98       dmCollate As Integer
     99       dmFormName As String * CCHFORMNAME
    100        dmUnusedPadding As Integer
    101       dmBitsPerPel As Long
    102       dmPelsWidth As Long
    103       dmPelsHeight As Long
    104       dmDisplayFlags As Long
    105       dmDisplayFrequency As Long
    106 End Type
    107 
    108 Public Type SECURITY_ATTRIBUTES
    109        nLength As Long
    110       lpSecurityDescriptor As Long
    111       bInheritHandle As Long
    112 End Type
    113 
    114 Public Const GENERIC_ALL = &H10000000
    115 Public Const MAXIMUM_ALLOWED = &H2000000
    116 Public Const DESKTOP_SWITCHDESKTOP = &H100
    117 Public Const DESKTOP_CREATEMENU = &H4&
    118 Public Const DESKTOP_CREATEWINDOW = &H2&
    119 Public Const DESKTOP_ENUMERATE = &H40&
    120 Public Const DESKTOP_HOOKCONTROL = &H8&
    121 Public Const DESKTOP_JOURNALPLAYBACK = &H20&
    122 Public Const DESKTOP_JOURNALRECORD = &H10&
    123 Public Const DESKTOP_READOBJECTS = &H1&
    124 Public Const DESKTOP_WRITEOBJECTS = &H80&
    125 Public Const DESKTOP_ALL = 511
    126 
    127 Public HotKeyID1 As Long
    128 Public HotKeyID2 As Long
    129 Public hwndOldDesktop As Long
    130 Public hwndNewDesktop As Long
    131 Public NEW_DESKTOP_NAME As String
    132 Public OldWndProc As Long
    133 
    134 Public Function CallBackWndProc(ByVal hwnd As Long, _
    135     ByVal wMsg As Long, _
    136     ByVal wparam As Long, _
    137     ByVal lparam As Long) As Long
    138     
    139     If wMsg = WM_HOTKEY Then
    140         If wparam = HotKeyID1 And hwndNewDesktop Then
    141             'Ctrl+W, switch it to new
    142             Call SwitchDesktop(hwndNewDesktop)
    143             Debug.Print "i am new desktop, u c?"
    144         ElseIf wparam = HotKeyID2 Then
    145             'Ctrl+Q, switch it to old
    146             Call SwitchDesktop(hwndOldDesktop)
    147             Debug.Print "i am back to old desktop, yeah!"
    148         End If
    149     End If
    150     
    151     CallBackWndProc = CallWindowProc(OldWndProc, hwnd, wMsg, wparam, lparam)
    152 End Function

    窗体部分:

     1 'code by lichmama from cnblogs.com
     2 Private Sub Form_Load()
     3     HotKeyID1 = 101&
     4     HotKeyID2 = 102&
     5     
     6     hwndOldDesktop = GetThreadDesktop(App.ThreadID)
     7     NEW_DESKTOP_NAME = "myNewDesktop-VB6.0"
     8     Call RegisterHotKey(Me.hwnd, HotKeyID1, MOD_CONTROL, vbKeyW)
     9     Call RegisterHotKey(Me.hwnd, HotKeyID2, MOD_CONTROL, vbKeyQ)
    10     hwndNewDesktop = OpenDesktop(NEW_DESKTOP_NAME, 0&, False, DESKTOP_ALL)
    11     If hwndNewDesktoop = 0 Then
    12         '如果新桌面不存在,则创建一个
    13         hwndNewDesktop = CreateDesktop(NEW_DESKTOP_NAME, vbNullString, ByVal 0&, 0&, MAXIMUM_ALLOWED, ByVal 0&)
    14     End If
    15     If hwndNewDesktop = 0 Then
    16         Debug.Print "new desktop create failed"
    17     End If
    18     OldWndProc = GetWindowLong(Me.hwnd, GWL_WNDPROC)
    19     Call SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf CallBackWndProc)
    20 End Sub
    21 
    22 Private Sub Form_Unload(Cancel As Integer)
    23     Call SetWindowLong(Me.hwnd, GWL_WNDPROC, OldWndProc)
    24     Call UnregisterHotKey(Me.hwnd, HotKeyID1)
    25     Call UnregisterHotKey(Me.hwnd, HotKeyID1)
    26 End Sub
  • 相关阅读:
    自定义行操作事件——DataGrid系列
    分页样式——DataGrid系列
    勾选批量操作——DataGrid系列
    快速排序的基本实现
    2021/06--09学习情况一些总结和反思
    IntegerCache的一些联想
    Hibernate, Jpa, Spring Data Jpa的关系与区别
    Springboot+Hibernate+Transactional中save提交引发的db异常无法捕获
    一个涉及多系统多步骤的业务需求设计与思考
    Use SQL to query dataverse
  • 原文地址:https://www.cnblogs.com/lichmama/p/3834520.html
Copyright © 2011-2022 走看看