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

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,725
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
Đú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
Thì đương nhiên vậy rồi ---> Duyệt qua các cửa sổ và Minimize nó mà
Muốn không khó chịu thì dùng MinimizeAll như bài 13 ấy. Có điều lại phải chấp nhận thêm 1 code để Maximize ActiveWindow (được cái này mất cái kia)
 
Upvote 0
Thì đương nhiên vậy rồi ---> Duyệt qua các cửa sổ và Minimize nó mà
Muốn không khó chịu thì dùng MinimizeAll như bài 13 ấy. Có điều lại phải chấp nhận thêm 1 code để Maximize ActiveWindow (được cái này mất cái kia)

Bài 13 (xui lém), máy em thì chạy không sao, một số khác bị lỗi y chang lỗi của Sư phụ Mỹ! Phải tắt nguồn khởi động lại mới chạy máy được đó! Ẹc ... Ẹc ...
 
Lần chỉnh sửa cuối:
Upvote 0
Bài 13 (xui lém), máy em thì chạy không sao, một số khác bị lỗi y chang lỗi của Sư phụ Mỹ! Phải tắt nguồn khởi động lại mới chạy máy được đó! Ẹc ... Ẹc ...
Vô lý!
Dám bảo đảm với bạn rằng code trong bài 13 tương đương với phím tắt Windows + D ---> Vì vậy sẽ không có chuyện lỗi xuất hiện được!
 
Upvote 0
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ả

Bài trên giống bài này:

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

Chỉ khác khúc đuôi.

Trước đây em đã từng xài code trên, thú thật là trên Win7 không thấy gì, tới khi đem cái File đó qua máy WinXP chẳng hiểu vì sao, một số máy bị lỗi giống hệt kiểu lỗi của Thầy Mỹ!
 
Upvote 0
Tóm lại, đừng lạm dụng lệnh hệ thống đánh toàn bộ chương trình (bao gồm cả chương trình chạy ngầm của hệ thống)
Nếu cần, chĩ minimize cửa sổ excel và maximze form làm việc.
Nếu bị che khuất, thì Activate window
Nếu muốn hay hơn, thì tìm hiểu chức năng always on top. (không biết property hoặc method là gì, nhưng là chức năng always on top mà nhiều phần mềm đã viết.)
 
Upvote 0
Tóm lại, đừng lạm dụng lệnh hệ thống đánh toàn bộ chương trình (bao gồm cả chương trình chạy ngầm của hệ thống)
Nếu cần, chĩ minimize cửa sổ excel và maximze form làm việc.
Nếu bị che khuất, thì Activate window
Nếu muốn hay hơn, thì tìm hiểu chức năng always on top. (không biết property hoặc method là gì, nhưng là chức năng always on top mà nhiều phần mềm đã viết.)
Đây là chủ đề em đang tìm nhưng không tìm thấy em cần. Rất mong các anh, các thầy trên GPE giúp em viết code cho phần em nêu bên dưới:
Em có 3 form: ở form1 khi em click nút commandbutton để gọi form2 thì form1 đươc minimize. Nhưng khi form2 đóng thì form1 được active
Tương tự nếu ở form3 em gọi form2 thì cũng tương tự như trên, nhưng khi form3 đóng thì form1 được active.
 
Upvote 0

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

Back
Top Bottom