Chụp ảnh màn hình

Liên hệ QC

ilvba

Thành viên mới
Tham gia
24/6/19
Bài viết
32
Được thích
7
các anh chị cho em hỏi, có cách nào để macro chụp ảnh một vùng cố định trên màn hình không ạ.
và làm thế nào để xác định tọa độ 4 điểm trên màn hình ạ.
Em cảm ơn ạ.
 
Chỉ dùng API thôi bạn. Gú gồ VBA screen capture
 
Upvote 0
Chỉ dùng API thôi bạn. Gú gồ VBA screen capture
Vâng, mình cũng google cả tối, được mẩu code này nhưng không hài lòng lắm ạ.
Mã:
Option Explicit

Private Declare PtrSafe Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal _
  bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)

Private Const VK_SNAPSHOT = &H2C

Sub PrintScreen()
    keybd_event VK_SNAPSHOT, 1, 0, 0
    ActiveSheet.Paste
End Sub
 
Upvote 0
Hì hì, cách hay, nhưng copy nguyên màn hình rồi.
Google tiếp đi bạn
 
Upvote 0
Hì hì, cách hay, nhưng copy nguyên màn hình rồi.
Google tiếp đi bạn
Cái tệ nhất là nó chỉ copy cái gì liên quan tới excel ấy.
Nếu copy được nguyên màn hình mà không dính gì tới excel thì tốt ạ.
Em nghĩ khi ấy có thể dán vào excel rồi xử lý tiếp thì tốt quá.
 
Upvote 0
Vậy cho Excel hide hay minimize đi rồi captue, copy
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu copy được nguyên màn hình mà không dính gì tới excel thì tốt ạ.
Nhưng bài 1 viết
có cách nào để macro chụp ảnh một vùng cố định trên màn hình không ạ

Vậy cuối cùng là copy cả màn hình hay chỉ 1 vùng trên màn hình?

Nếu là copy cả màn hình giống như khi không có Excel thì ẩn Excel đi. Đề phòng bạn không nói rõ tôi lưu ý. Nếu là copy Desktop không có Excel, không có cả mọi cửa sổ khác thì không ai lại ẩn (kéo xuống Taskbar) lần lượt mọi cửa sổ có thể có. Lúc này giả nhấn [Win]+[D] thôi. Bạn tự nhấn tổ hợp [Win]+[D] thì sẽ thấy Desktop "trần như nhộng".
 
Upvote 0
Nhưng bài 1 viết


Vậy cuối cùng là copy cả màn hình hay chỉ 1 vùng trên màn hình?

Nếu là copy cả màn hình giống như khi không có Excel thì ẩn Excel đi. Đề phòng bạn không nói rõ tôi lưu ý. Nếu là copy Desktop không có Excel, không có cả mọi cửa sổ khác thì không ai lại ẩn (kéo xuống Taskbar) lần lượt mọi cửa sổ có thể có. Lúc này giả nhấn [Win]+[D] thôi. Bạn tự nhấn tổ hợp [Win]+[D] thì sẽ thấy Desktop "trần như nhộng".
Dạ, mục đích cuối cùng vẫn là chụp một vùng màn hình. Nhưng khả năng là khó, nên em tính chụp cả màn hình paste vô sheet. Rồi em tính toán cái vùng đó tương đương với range nào trên excel. Em chụp ảnh vùng range đó là ok. hơi cách rách nhưng có lẽ phải đi đường vòng ạ.
Về vấn đề chụp cả màn hình dán vào excel thì em vẫn chưa làm dc ạ.
 
Upvote 0
Dạ, mục đích cuối cùng vẫn là chụp một vùng màn hình. Nhưng khả năng là khó, nên em tính chụp cả màn hình paste vô sheet. Rồi em tính toán cái vùng đó tương đương với range nào trên excel. Em chụp ảnh vùng range đó là ok. hơi cách rách nhưng có lẽ phải đi đường vòng ạ.
Về vấn đề chụp cả màn hình dán vào excel thì em vẫn chưa làm dc ạ.
Nhưng bạn vẫn chưa nói rõ. Bạn hiện thời có Excel chiếm toàn bộ màn hình. Nếu đồng nghiệp của bạn có Normal và Excel chiếm một tí, Notepad chiểm 1 tí, Paint chiếm một tí v...v Lúc này bạn cần chụp toàn bộ màn hình với các icons trên nó + Paint + Notepad, tức chỉ không có Excel hay màn hình nhưng không có Excel, Notepad, Paint?

Thường người ta viết code cho trường hợp tổng quát chứ không ai lại giả sử là Excel chiếm toàn bộ màn hình.
 
Upvote 0
Nhưng bạn vẫn chưa nói rõ. Bạn hiện thời có Excel chiếm toàn bộ màn hình. Nếu đồng nghiệp của bạn có Normal và Excel chiếm một tí, Notepad chiểm 1 tí, Paint chiếm một tí v...v Lúc này bạn cần chụp toàn bộ màn hình với các icons trên nó + Paint + Notepad, tức chỉ không có Excel hay màn hình nhưng không có Excel, Notepad, Paint?

Thường người ta viết code cho trường hợp tổng quát chứ không ai lại giả sử là Excel chiếm toàn bộ màn hình.
Đoạn code này nó chụp được đây anh.
Mã:
'Declare Windows API Functions
Private Declare PtrSafe Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal _
  bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
 
'Declare Virtual Key Codes
Private Const VK_SNAPSHOT = &H2C
Private Const VK_KEYUP = &H2
Private Const VK_MENU = &H12
Public Const VK_TAB = &H9
Public Const VK_ENTER = &HD
 
Sub ScreenPrint() ' <- chay chuong trinh nay
    'Press Alt + TAB Keys -- Step1
    Alt_Tab
 
    'Press Print Screen key using Windows API -- Step2.
    keybd_event VK_SNAPSHOT, 1, 0, 0 'Print Screen key down
    keybd_event VK_SNAPSHOT, 1, VK_KEYUP, 0 'Print key Up - Screenshot to Clipboard
 

    
End Sub
 
Sub Alt_Tab()
    DoEvents
    keybd_event VK_MENU, 1, 0, 0 'Alt key down
    DoEvents
    keybd_event VK_TAB, 0, 0, 0 'Tab key down
    DoEvents
    keybd_event VK_TAB, 1, VK_KEYUP, 0 'Tab key up
    DoEvents
    keybd_event VK_ENTER, 1, 0, 0 'Tab key down
    DoEvents
    keybd_event VK_ENTER, 1, VK_KEYUP, 0 'Tab key up
    DoEvents
    keybd_event VK_MENU, 1, VK_KEYUP, 0 'Alt key up
    DoEvents
End Sub
 
'https://officetricks.com/print-screen-save-as-image-file-attach-to-sheet-automate-in-vba/
Sau khi chạy code xong, anh vào paint và ấn ctr+V.
Em ko lý giải nổi là tại sao khi chạy code xong thì ko thao tác được với sheet excel nữa.
 
Upvote 0
Đoạn code này nó chụp được đây anh.
Mã:
'Declare Windows API Functions
Private Declare PtrSafe Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal _
  bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)

'Declare Virtual Key Codes
Private Const VK_SNAPSHOT = &H2C
Private Const VK_KEYUP = &H2
Private Const VK_MENU = &H12
Public Const VK_TAB = &H9
Public Const VK_ENTER = &HD

Sub ScreenPrint() ' <- chay chuong trinh nay
    'Press Alt + TAB Keys -- Step1
    Alt_Tab

    'Press Print Screen key using Windows API -- Step2.
    keybd_event VK_SNAPSHOT, 1, 0, 0 'Print Screen key down
    keybd_event VK_SNAPSHOT, 1, VK_KEYUP, 0 'Print key Up - Screenshot to Clipboard


  
End Sub

Sub Alt_Tab()
    DoEvents
    keybd_event VK_MENU, 1, 0, 0 'Alt key down
    DoEvents
    keybd_event VK_TAB, 0, 0, 0 'Tab key down
    DoEvents
    keybd_event VK_TAB, 1, VK_KEYUP, 0 'Tab key up
    DoEvents
    keybd_event VK_ENTER, 1, 0, 0 'Tab key down
    DoEvents
    keybd_event VK_ENTER, 1, VK_KEYUP, 0 'Tab key up
    DoEvents
    keybd_event VK_MENU, 1, VK_KEYUP, 0 'Alt key up
    DoEvents
End Sub

'https://officetricks.com/print-screen-save-as-image-file-attach-to-sheet-automate-in-vba/
Sau khi chạy code xong, anh vào paint và ấn ctr+V.
Em ko lý giải nổi là tại sao khi chạy code xong thì ko thao tác được với sheet excel nữa.
không thao tác được với sheet là sao bạn mình thấy bình thường mà
 
Upvote 0
Đoạn code này nó chụp được đây anh.
Tôi có nói là việc của bạn không làm được đâu?

Hãy đọc kỹ bài của tôi.

Tôi chỉ muốn biết thật kỹ là bạn muốn làm gì. Lúc thì lấy 1 vùng của màn hình, lúc thì cả màn hình cũng chơi, lúc thì bỏ cửa sổ Excel. Tôi muốn hỏi kỹ là ngoài bỏ Excel có bỏ cả các cửa sổ khác hay không. Nhưng bạn không nói ra. Bạn chỉ khoe là làm được. Mà tôi có nói là không làm được đâu?

Thôi tôi làm chơi với yêu cầu tôi tự đặt do bạn không muốn nói ra.

Yêu cầu: cho dù ở thời điểm chạy code có nhiều cửa sổ đang mở thì chỉ lấy desktop, tức trạng thái như sau khi nhấn tổ hợp [Win] (trái) + [D], chỉ 1 vùng có chiều dài width, cao height, bắt đầu từ tọa độ (left, top) - tất cả tính bằng pixel - vào sheet hiện hành, vào cell hiện hành.

Code chỉ viết cho 32 bit.

Tôi không chơi trò "thông tin nhỏ giọt", "van xin thông tin" nên tôi kết thúc ở đây.

Mã:
Option Explicit

Private Const VK_LWIN = 91
Private Const VK_D = 68
Private Const KEYEVENTF_KEYUP = 2
Private Const SRCCOPY As Long = &HCC0020
Private Const CF_BITMAP = 2

Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal _
  bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
  
Private Declare Function GetDC Lib "user32.dll" (ByVal hwnd As Long) As Long
Private Declare Function ReleaseDC Lib "user32.dll" (ByVal hwnd As Long, ByVal hdc As Long) As Long
Private Declare Function CreateCompatibleDC Lib "gdi32.dll" (ByVal hdc As Long) As Long
Private Declare Function DeleteDC Lib "gdi32.dll" (ByVal hdc As Long) As Long
Private Declare Function CreateCompatibleBitmap Lib "gdi32.dll" (ByVal hdc As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
Private Declare Function BitBlt Lib "gdi32.dll" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
Private Declare Function SelectObject Lib "gdi32.dll" (ByVal hdc As Long, ByVal hObject As Long) As Long
Private Declare Function DeleteObject Lib "gdi32.dll" (ByVal hObject As Long) As Long
Private Declare Function OpenClipboard Lib "user32.dll" (ByVal hwnd As Long) As Long
Private Declare Function CloseClipboard Lib "user32.dll" () As Long
Private Declare Function EmptyClipboard Lib "user32.dll" () As Long
Private Declare Function SetClipboardData Lib "user32.dll" (ByVal wFormat As Long, ByVal hMem As Long) As Long

Sub PrintScreen()
Const left = 200
Const top = 200
Const width = 500
Const height = 200
Dim DC As Long, destDC As Long, hbmp As Long, oldbmp As Long
    keybd_event VK_LWIN, 0, 0, 0
    keybd_event VK_D, 0, 0, 0
    keybd_event VK_LWIN, 0, KEYEVENTF_KEYUP, 0
    
    Application.Wait Now + TimeValue("0:00:05")
    
    DC = GetDC(0)
    destDC = CreateCompatibleDC(DC)
    hbmp = CreateCompatibleBitmap(DC, width, height)
    oldbmp = SelectObject(destDC, hbmp)
    BitBlt destDC, 0, 0, width, height, DC, left, top, SRCCOPY
    SelectObject destDC, oldbmp
    
    DeleteDC destDC
    ReleaseDC 0, DC
    
    OpenClipboard 0
    EmptyClipboard
    SetClipboardData CF_BITMAP, hbmp
    CloseClipboard
    
    DeleteObject hbmp
    
    ActiveSheet.Paste
End Sub
 
Upvote 0
Dạ, mục đích cuối cùng vẫn là chụp một vùng màn hình. Nhưng khả năng là khó, nên em tính chụp cả màn hình paste vô sheet. Rồi em tính toán cái vùng đó tương đương với range nào trên excel. Em chụp ảnh vùng range đó là ok. hơi cách rách nhưng có lẽ phải đi đường vòng ạ.
Về vấn đề chụp cả màn hình dán vào excel thì em vẫn chưa làm dc ạ.

Thắc mắc chút nên nhảy vô hỏi :)
"Chụp màn hình xong rồi tính thuộc range nào" --> vậy tại sao không dùng tính năng dùng chuột quét các ô trong Excel rồi lấy ra địa chỉ vùng vừa quét nhỉ?
 
Upvote 0
Nhưng bài 1 viết


Vậy cuối cùng là copy cả màn hình hay chỉ 1 vùng trên màn hình?

Nếu là copy cả màn hình giống như khi không có Excel thì ẩn Excel đi. Đề phòng bạn không nói rõ tôi lưu ý. Nếu là copy Desktop không có Excel, không có cả mọi cửa sổ khác thì không ai lại ẩn (kéo xuống Taskbar) lần lượt mọi cửa sổ có thể có. Lúc này giả nhấn [Win]+[D] thôi. Bạn tự nhấn tổ hợp [Win]+[D] thì sẽ thấy Desktop "trần như nhộng".

Thật ko ngờ VBA có thể chụp được màn hình
1.Nhờ bác làm giúp mình đoạn code mà khi mình gõ vùng chụp vào B1 (hoặc quét chổi vùng chụp) và độ cao của hình thì tự nó chụp rồi xuất ảnh vào định dạng theo chiều cao trong sheet 1 đó luôn.
Mình gửi file đính kèm như là ví dụ.

2. Sẵn tiện cho mình hỏi sao code của bác mình bị báo lỗi? mình có để ảnh trong sheet 2 để bác xem sao có đoạn code báo đỏ. Vì mình tính dùng code của bác để xuất ảnh của pdf (vd như hình chụp ở sheet 3 là đoạn mình dùng snipping tool để cắt ảnh trên file pdf đính kèm, nhưng pdf không cho quét vùng thì không biết làm sao). Bác xem giúp code của bác có làm được không nha.
Cám ơn bác trước
 

File đính kèm

  • VBA_CoBan.pdf
    236.7 KB · Đọc: 8
  • Chup man hinh VBA.xlsm
    269.5 KB · Đọc: 22
Upvote 0
Thật ko ngờ VBA có thể chụp được màn hình
1.Nhờ bác làm giúp mình đoạn code mà khi mình gõ vùng chụp vào B1 (hoặc quét chổi vùng chụp) và độ cao của hình thì tự nó chụp rồi xuất ảnh vào định dạng theo chiều cao trong sheet 1 đó luôn.
Mình gửi file đính kèm như là ví dụ.
Tôi không hiểu ý. Đã cho vùng thì copy vùng đó thôi, Height để làm gì?

Range (vùng) có phương thức CopyPicture, còn WorkSheet có phương thức Paste. Vậy thì
Mã:
Sub test()
    With ThisWorkbook.Worksheets("Sheet1")
        .Range(.Range("B1").Value).CopyPicture
'        .Range("Q7").Select
        .Paste
    End With
End Sub

Cũng có thể: chọn vùng -> Ctrl + C -> chọn ô đích -> thẻ Home -> Paste -> Linked Picture

Sau đó cứ mỗi lần thay đổi nội dung ở vùng nguồn thì vùng đích cũng thay đổi.

2. Sẵn tiện cho mình hỏi sao code của bác mình bị báo lỗi? mình có để ảnh trong sheet 2 để bác xem sao có đoạn code báo đỏ.
Tôi viết rõ mà
Code chỉ viết cho 32 bit.
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi không hiểu ý. Đã cho vùng thì copy vùng đó thôi, Height để làm gì?
để tự nó co giãn, mình copy hình đó bỏ vào power point luôn mà không cần căn chỉnh lại nữa. Nhưng code bác cho mình dùng cũng ổn. Cơ mà sao nó format khác cách dùng của snipping nhỉ? nó bị đậm lên 2 đường này nè bác. Mình muốn nó y như format gốc đó ạ219939

32 bit cho cái gì nhỉ? ===\. thế cấu hình của mình đang ko tương thích hở bác? vậy có cách nào cắt ảnh của pdf được bác nhỉ?
 
Upvote 0
Nếu bây giờ có một ứng dụng đang chạy chiếm một phần của màn hình. Và ta muốn chụp hình ứng dụng này thì bài toán là chụp một phần của màn hình chua noi dung ung dung ay và tất nhiên excel ẩn đi. Chỉ excel hạ xuống thôi, mọi cái gì khác để nguyên.
Tôi chả hiểu nếu cho hạ tất ứng dụng xuống, thì chụp ảnh nền destop để làm cái gì.
Nhưng vì chụp một phần của màn hình, xác định tọa độ vùng cần chụp trên màn hình là khó. Cho nên cái ảnh chụp toàn màn hình (chứa hình ảnh các ứng dụng khác đang chạy) ấy sẽ được paste vào excel.
Tại đây người code sẽ được ảnh toàn màn hình dán vào excel. Tuy nhiên do mục đích chỉ lấy một phần màn hình, cho nên họ sẽ tính toán được phần cần lấy đó nằm
trong khoảng range nào trên excel. Cuối cùng họp xuất vùng range này ra thành file ảnh, như vậy ta có ảnh của một phần của màn hình.
Bây giờ nếu không chụp màn hình dán vào excel thì trên excel làm gì có cái gì ngoài bảng tính excel, vậy xuất ra ảnh vùng Range thì nó là ảnh mang nội dung gì?
Bài toán như vậy tôi thấy rất dễ hiểu.
 
Upvote 0
Đọc của bạn xong mình lùng bùng luôn, khi thì excel, khi thì màn hình, lộn tùng phèo
 
Upvote 0
Ngan gon la lam the nao xuat ra file anh phan mau vang tren man hinh nay. day la hinh anh mot ung dung khac dang hien thi tren man hinh. Chi muon lay phan mau vang thoi. ngoai ra ko lay cai gi khac. Hinh bao quanh nen mau trang la man hinh may tinh co the chua cac ung dung khac dang chay.
ông nào xác định được tọa độ 4 đỉnh của hình chữ nhật màu vàng trên máy tính hộ tôi cái.
219964
và tôi chỉ muốn chụp hình phần chữ nhật màu vàng trên màn hình máy tính thôi.
 
Upvote 0
Web KT
Back
Top Bottom