Vấn đề dùng code để điều khiển Folder. (2 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

Hoàng Trọng Nghĩa

Chuyên gia GPE
Thành viên BQT
Moderator
Tham gia
17/8/08
Bài viết
8,662
Được thích
16,720
Giới tính
Nam
Kính thưa các Thầy Cô, Anh Chị,
Tôi có một thắc mắc là có thể sử dụng Code của Excel để điều khiển tất cả các Folder đang hiện hành từ Maximize, Normal trở thành Minimize (thu nhỏ nhất) hay không? Nếu có, xin vui lòng tặng mình đoạn code đó nhé!
Cảm ơn rất nhiều ạ.
 
Lần chỉnh sửa cuối:
Kính thưa các Thầy Cô, Anh Chị,
Tôi có một thắc mắc là có thể sử dụng Code của Excel để điều khiển tất cả các Folder đang hiện hành từ Maximize, Normal trở thành Minimize (thu nhỏ nhất) hay không? Nếu có, xin vui lòng tặng mình đoạn code đó nhé!
Cảm ơn rất nhiều ạ.
Sao lại là điều khiển Folder? Nếu tôi đoán không lầm thì ý bạn chắc là điều khiển các cửa sổ đang mở chứ nhỉ?
Nói rõ thêm 1 chút nha
 
Upvote 0
Kính thưa các Thầy Cô, Anh Chị,
Tôi có một thắc mắc là có thể sử dụng Code của Excel để điều khiển tất cả các Folder đang hiện hành từ Maximize, Normal trở thành Minimize (thu nhỏ nhất) hay không? Nếu có, xin vui lòng tặng mình đoạn code đó nhé!
Cảm ơn rất nhiều ạ.

Để làm được như vậy cần phải dùng kỹ thuậtl lập trình Windows API. Bạn hãy copy code của tôi viết dưới đây vào module rồi chạy.
Mã:
Option Explicit

Public Declare Function GetWindow Lib "user32.dll" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
Public Declare Function GetClassName Lib "user32.dll" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Public Declare Function GetDesktopWindow Lib "user32.dll" () As Long
Public Declare Function ShowWindow Lib "user32.dll" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Public Const SW_MINIMIZE As Long = 6
Public Const GW_CHILD As Long = 5
Public Const GW_HWNDNEXT As Long = 2

Sub SetMiniWindows()
    Dim hwnd&, hChild, sClass$, n&
    hwnd = GetDesktopWindow
    hChild = GetWindow(hwnd, GW_CHILD)
    Do While hChild <> 0
        sClass = Space(32)
        n = GetClassName(hChild, sClass, 32) [COLOR="SeaGreen"]'Tìm kiểu Window[/COLOR]
        sClass = Left$(sClass, n)
        If sClass = "CabinetWClass" Then [COLOR="SeaGreen"]'Kiểm tra có phải là cửa sổ Folder không[/COLOR]
            ShowWindow hChild, SW_MINIMIZE
        End If
        hChild = GetWindow(hChild, GW_HWNDNEXT)
    Loop
End Sub
 
Upvote 0
Để làm được như vậy cần phải dùng kỹ thuậtl lập trình Windows API. Bạn hãy copy code của tôi viết dưới đây vào module rồi chạy.
Mã:
Option Explicit

Public Declare Function GetWindow Lib "user32.dll" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
Public Declare Function GetClassName Lib "user32.dll" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Public Declare Function GetDesktopWindow Lib "user32.dll" () As Long
Public Declare Function ShowWindow Lib "user32.dll" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Public Const SW_MINIMIZE As Long = 6
Public Const GW_CHILD As Long = 5
Public Const GW_HWNDNEXT As Long = 2

Sub SetMiniWindows()
    Dim hwnd&, hChild, sClass$, n&
    hwnd = GetDesktopWindow
    hChild = GetWindow(hwnd, GW_CHILD)
    Do While hChild <> 0
        sClass = Space(32)
        n = GetClassName(hChild, sClass, 32) [COLOR=SeaGreen]'Tìm kiểu Window[/COLOR]
        sClass = Left$(sClass, n)
        If sClass = "CabinetWClass" Then [COLOR=SeaGreen]'Kiểm tra có phải là cửa sổ Folder không[/COLOR]
            ShowWindow hChild, SW_MINIMIZE
        End If
        hChild = GetWindow(hChild, GW_HWNDNEXT)
    Loop
End Sub
Cái này hình như không có tác dụng với cửa sổ Windows Explorer
???
 
Upvote 0
Kính thưa các Thầy Cô, Anh Chị,
Tôi có một thắc mắc là có thể sử dụng Code của Excel để điều khiển tất cả các Folder đang hiện hành từ Maximize, Normal trở thành Minimize (thu nhỏ nhất) hay không? Nếu có, xin vui lòng tặng mình đoạn code đó nhé!
Cảm ơn rất nhiều ạ.
Nếu là minimize toàn bộ các ứng dụng thì chỉ cần 1 lệnh thôi
Mã:
      CreateObject("Shell.Application").MinimizeAll
Hoặc dùng API như này
Mã:
Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)

Sub MinimumAllWindow()
    Call keybd_event(&H5B, 0, 0, 0)
    Call keybd_event(&H4D, 0, 0, 0)
    Call keybd_event(&H5B, 0, &H2, 0)
End Sub
 
Upvote 0
Cái này hình như không có tác dụng với cửa sổ Windows Explorer
???

Được chứ bác, vì các cửa sổ đó Windows đều dùng một loại Class là "CabinetWClass".

Nhân việc này, tôi đưa thêm ví dụ về thay thế chữ tiêu đề của các của sổ Folder.

Mã:
Option Explicit

Public Declare Function GetWindow Lib "user32.dll" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
Public Declare Function GetClassName Lib "user32.dll" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Public Declare Function GetDesktopWindow Lib "user32.dll" () As Long
Public Declare Function ShowWindow Lib "user32.dll" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Public Declare Function SetWindowText Lib "user32.dll" Alias "SetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String) As Long

Public Const SW_MINIMIZE As Long = 6
Public Const GW_CHILD As Long = 5
Public Const GW_HWNDNEXT As Long = 2

Sub SetMiniWindows()
    Dim hwnd&, hChild, sClass$, n&
    hwnd = GetDesktopWindow
    hChild = GetWindow(hwnd, GW_CHILD)
    Do While hChild <> 0
        sClass = Space(32)
        n = GetClassName(hChild, sClass, 32)
        sClass = Left$(sClass, n)
        If sClass = "CabinetWClass" Then
            SetWindowText hChild, "Nguyen Duy Tuan"
            ShowWindow hChild, SW_MINIMIZE
        End If
        hChild = GetWindow(hChild, GW_HWNDNEXT)
    Loop
End Sub
 
Upvote 0
Wow, thật tuyệt vời!
Đây là Topic tập trung các Professors, em cám ơn các Quý Thầy rất rất nhiều ạ!
 
Upvote 0
Được chứ bác, vì các cửa sổ đó Windows đều dùng một loại Class là "CabinetWClass".
Khi tôi click phải chuột vào My Computer, chọn Open ---> Thử code thấy có tác dụng
Khi tôi click phải chuột vào My Computer, chọn Explorer ---> Thử code chẳng tác dụng gì
Tuân test lại xem!
 
Upvote 0
Khi tôi click phải chuột vào My Computer, chọn Open ---> Thử code thấy có tác dụng
Khi tôi click phải chuột vào My Computer, chọn Explorer ---> Thử code chẳng tác dụng gì
Tuân test lại xem!

Ah, khi test em chỉ làm trên Win Vista nên nó chạy đúng. Trên WinXP thì cửa sổ Explorer lại dùng class "ExploreWClass".
Vậy để fix lỗi không tương thích trên thì làm như sau:
code cũ:
Mã:
If sClass = "CabinetWClass" Then

thay bằng
Mã:
If sClass = "CabinetWClass" Or sClass = "ExploreWClass" Then
 
Upvote 0
Nếu là minimize toàn bộ các ứng dụng thì chỉ cần 1 lệnh thôi

Hoặc dùng API như này
Mã:
Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)

Sub MinimumAllWindow()
    Call keybd_event(&H5B, 0, 0, 0)
    Call keybd_event(&H4D, 0, 0, 0)
    Call keybd_event(&H5B, 0, &H2, 0)
End Sub

Dùng thủ tục này để thu nhỏ tất cả cửa sổ của các chương trình cũng như thư mục, nhưng làm sao để sau khi chạy thì Workbook hiện hành vẫn active và không bị thu nhỏ?

Xin cám ơn.
 
Lần chỉnh sửa cuối:
Upvote 0
Dùng thủ tục này để thu nhỏ tất cả cửa sổ của các chương trình cũng như thư mục, nhưng làm sao để sau khi chạy thì Workbook hiện hành vẫn active và không bị thu nhỏ?

Xin cám ơn.
Thu nhỏ tất cả các cửa sổ thì khó chứ Workbook thì dễ quá mà, "bung" nó lên trở lại, chẳng lẽ minhthien không làm được
 
Upvote 0
Thu nhỏ tất cả các cửa sổ thì khó chứ Workbook thì dễ quá mà, "bung" nó lên trở lại, chẳng lẽ minhthien không làm được

Thầy cứ làm trên cái thủ tục đó đi thì sẽ hiểu ạ! Không dễ đâu!

Em đã làm thử như vầy rồi, bó chân!

Mã:
Sub MinimumAllWindow()
    Call keybd_event(&H5B, 0, 0, 0)
    Call keybd_event(&H4D, 0, 0, 0)
    Call keybd_event(&H5B, 0, &H2, 0)
    [COLOR=#0000cd][B]Application.WindowState = xlMaximized[/B][/COLOR]
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Thầy cứ làm trên cái thủ tục đó đi thì sẽ hiểu ạ! Không dễ đâu!

Em đã làm thử như vầy rồi, bó chân!

Mã:
Sub MinimumAllWindow()
    Call keybd_event(&H5B, 0, 0, 0)
    Call keybd_event(&H4D, 0, 0, 0)
    Call keybd_event(&H5B, 0, &H2, 0)
    [COLOR=#0000cd][B]Application.WindowState = xlMaximized[/B][/COLOR]
End Sub
Tôi thì làm vầy:
PHP:
Sub Test()
  CreateObject("Shell.Application").MinimizeAll
  Application.Wait Now + TimeValue("00:00:01")
  Application.WindowState = xlMaximized
End Sub
Không có vấn đề gì cả
 
Upvote 0
Nếu nhớ không lầm thì tôi đã bị 1 phát với câu lệnh MinimizeAll rồi:

attachment.php
 
Upvote 0
Nếu nhớ không lầm thì tôi đã bị 1 phát với câu lệnh MinimizeAll rồi:
Khi ta duyệt qua toàn bộ các của sổ thì code sẽ tính luôn các của sổ ẩn (chẳng hạn Start Menu, Systray cũng được xem là cửa sổ nhưng ở dạng ẩn) ---> Khi ấy nếu không có phương pháp loại trừ thích hợp sẽ gây ra tình trạng giống như sư phụ đề cập
Vậy, để chắc ăn, khi duyệt các cửa số, ta dùng IF để bỏ qua các cửa số đang ẩn là được rồi
Ví dụ code thế này:
PHP:
Private Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Boolean
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Private Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hWnd As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function ShowWindow Lib "user32" (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long
Private Declare Function IsWindowVisible Lib "user32" (ByVal hWnd As Long) As Long

Public Const SW_MINIMIZE = 6
PHP:
Public Function EnumWindowsProc(ByVal hWnd As Long, ByVal lParam As Long) As String
  Dim sCap As String, Ret As Long, cHwnd As Long
  On Error Resume Next
  Ret = GetWindowTextLength(hWnd)
  sCap = Space(Ret)
  GetWindowText hWnd, sCap, Ret + 1
  If Trim(sCap) <> "" And IsWindowVisible(hWnd) Then
    cHwnd = FindWindow(vbNullString, sCap)
    If cHwnd <> Application.hWnd Then ShowWindow cHwnd, SW_MINIMIZE
  End If
  EnumWindowsProc = True
End Function
PHP:
Sub MinimizeOtherWindows()
  EnumWindows AddressOf EnumWindowsProc, 0&
End Sub
Sư phụ thử xem
 
Upvote 0
Khi ta duyệt qua toàn bộ các của sổ thì code sẽ tính luôn các của sổ ẩn (chẳng hạn Start Menu, Systray cũng được xem là cửa sổ nhưng ở dạng ẩn) ---> Khi ấy nếu không có phương pháp loại trừ thích hợp sẽ gây ra tình trạng giống như sư phụ đề cập
Vậy, để chắc ăn, khi duyệt các cửa số, ta dùng IF để bỏ qua các cửa số đang ẩn là được rồi
Ví dụ code thế này:

Mã:
Sub MinimizeOtherWindows()
  [COLOR=#ff0000][B]EnumWindows [/B][/COLOR]AddressOf EnumWindowsProc, 0&
End Sub
Sư phụ thử xem

Chạy thủ tục này báo lỗi thầy ơi (tại dòng tô đỏ), nếu thay bằng EnumWindowsProc thì chẳng thấy cửa sổ nào thu nhỏ cả?
 
Upvote 0

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Có lẽ khi chép code bằng khung
PHP:
 [/B]nó có hiện tượng mất ký tự! bởi vậy em thường để code trong khung [B][code][/B][/QUOTE]
Vậy cuối cùng Nghĩa thử thế nào rồi?
Tôi vừa thử trên máy cài WinXP, kết quả còn ngon hơn
Có điều với mấy cửa sổ có tab (chẳng hạn Firefox) lại chẳng tác dụng gì
 
Upvote 0
Vậy cuối cùng Nghĩa thử thế nào rồi?
Tôi vừa thử trên máy cài WinXP, kết quả còn ngon hơn
Có điều với mấy cửa sổ có tab (chẳng hạn Firefox) lại chẳng tác dụng gì

Đúng là có hiệu nghiệm, tuy nhiên, các cửa sổ lần lượt "khép từ từ" làm mình cảm giác khó chịu! hihihihi
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom