Ghi lại thao tác chuột và tái hiện lại thao tác chuột-dự án tự động hóa can thiệp vào các ứng dụng khác trên máy tính

USA_Covid19

Thành viên tích cực
Mình thấy tool này rất hay ! Liệu chúng ta có thể lưu lại quá trình đã ghi trước đó để lần sau chỉ mở lên là nó thực hiện lại không nhỉ nếu được như vậy thì thật tuyệt!
 

Euler

Mod
Thành viên BQT
Giai đoạn 2: Ghi lại thao tác bàn phím và tái hiện lại thao tác bàn phím
Giai đoạn 2.2: Tái hiện lại thao tác bàn phím bằng nút bấm Play

File demo:
Những điều các bạn có thể học hỏi được:
Bài toán 1:
Mã:
Input: KeyCode= 54 (0x54 -Hexa)

Output: Long = 84

Giải:

=Val("&H" & KeyCode)
Bài toán 2:
Lấy giá trị của Listbox.
Mã:
For i = 0 To List1.ListCount - 1
    
        List1.ListIndex = i
    
        tmp = Split(List1.List(i), vbTab)   'Lay du lieu 1 dong, phan tach boi dau Tab
        EventTime = tmp(0)              'Thoi gian
        EventName = tmp(1)              'Down/Up
        KeyCode = tmp(2)                'KeyCode. Ex: 54
Dòng code số 1: Chạy từ dòng dữ liệu đầu tiên tới dòng dữ liệu cuối cùng trên Listbox.
Chạy tới dòng dữ liệu nào thì select vào dòng dữ liệu đó, cho nên ta có dòng code số 3.
Các dòng code 5~8 : lấy dữ liệu từ listbox. Cách lấy này rất hay, cần cập nhật kiến thức này vào :
Bạn cần đăng nhập để thấy hình ảnh
 

tuhocvba

Administrator
Thành viên BQT
Giai đoạn 3: Hợp code Tool giai đoạn 1 (Tool 1: main) + Tool giai đoạn 2 (Tool 2).
Các thông tin Module của Tool 2 sẽ được chuyển sang Tool 1:
Mã:
========Module2_Play============
keybd_event
EXTENDED_KEY
KEYUP

========Module1_TieuChuan========
Public MoP As POINTAPI             'Vi tri hien tai cua chuot
Giai đoạn 3.1: Hợp code phần Record.
Kỳ vọng: Không chỉ lấy thông tin chuột mà còn lấy cả thông tin bàn phím
Trên Tool 2 thấy rằng thủ tục này được lặp lại:
Mã:
    Call EventsAnlyz(tMsg, True) 'Trang thai khoi tao
    Call EventsAnlyz(tMsg, True) 'Trang thai khoi tao
Có lẽ chỉ cần gọi một lần là đủ, hiện chưa hiểu tại sao lại phải gọi hai lần. Không có thời gian thử nếu bớt đi một lần gọi thì sẽ ra sao.
Do Tool 2 đang hoạt động tốt nên trung thực phản ánh điều này vào Tool 1.

Trên Tool 2:
Mã:
Const KEY_CNT = &H255 ' = 597
Trong khi đó trên Tool 1 là:
Mã:
Const KEY_CNT = &H10        '=16. So lan quet su kien-Scan event
Vì vậy sẽ lấy theo giá trị được khai báo ở Tool 2, tức là:
Mã:
KEY_CNT = &H255
Cần copy đoạn code này của Tool 2 sang Tool 1.
Mã:
KeyList(&H3) = "Break"
    KeyList(&H8) = "Backspace"
    KeyList(&H9) = "Tab"
    KeyList(&HD) = "Enter"
    KeyList(&H10) = "Shift"
    KeyList(&H11) = "Ctrl "
    KeyList(&H12) = "Alt "
    KeyList(&H13) = "Pause"
    KeyList(&H1B) = "Esc"
    KeyList(&H1C) = "変換"
    KeyList(&H1D) = "無変換 "
    KeyList(&H20) = "Space"
    KeyList(&H21) = "PgUp"
    KeyList(&H22) = "PgDn"
    KeyList(&H23) = "End"
    KeyList(&H24) = "Home "
    KeyList(&H25) = "←"
    KeyList(&H26) = "↑ "
    KeyList(&H27) = "→ "
    KeyList(&H28) = "↓ "
    KeyList(&H2D) = "Insert "
    KeyList(&H2E) = "Delete "
    KeyList(&H30) = "0"
    KeyList(&H31) = "1"
    KeyList(&H32) = "2"
    KeyList(&H33) = "3"
    KeyList(&H34) = "4"
    KeyList(&H35) = "5"
    KeyList(&H36) = "6"
    KeyList(&H37) = "7"
    KeyList(&H38) = "8"
    KeyList(&H39) = "9"
    KeyList(&H41) = "A"
    KeyList(&H42) = "B"
    KeyList(&H43) = "C"
    KeyList(&H44) = "D"
    KeyList(&H45) = "E"
    KeyList(&H46) = "F"
    KeyList(&H47) = "G"
    KeyList(&H48) = "H"
    KeyList(&H49) = "I"
    KeyList(&H4A) = "J"
    KeyList(&H4B) = "K"
    KeyList(&H4C) = "L"
    KeyList(&H4D) = "M"
    KeyList(&H4E) = "N"
    KeyList(&H4F) = "O"
    KeyList(&H50) = "P"
    KeyList(&H51) = "Q"
    KeyList(&H52) = "R"
    KeyList(&H53) = "S"
    KeyList(&H54) = "T"
    KeyList(&H55) = "U"
    KeyList(&H56) = "V"
    KeyList(&H57) = "W"
    KeyList(&H58) = "X"
    KeyList(&H59) = "Y"
    KeyList(&H5A) = "Z"
    KeyList(&H5B) = "Cua so trai"
    KeyList(&H5C) = "Cua so phai"
    KeyList(&H5D) = "Application"
    KeyList(&H60) = "テンキー0"
    KeyList(&H61) = "テンキー1"
    KeyList(&H62) = "テンキー2"
    KeyList(&H63) = "テンキー3"
    KeyList(&H64) = "テンキー4"
    KeyList(&H65) = "テンキー5"
    KeyList(&H66) = "テンキー6"
    KeyList(&H67) = "テンキー7"
    KeyList(&H68) = "テンキー8"
    KeyList(&H69) = "テンキー9"
    KeyList(&H6A) = "*"
    KeyList(&H6B) = "+"
    KeyList(&H6C) = ","
    KeyList(&H6D) = "-"
    KeyList(&H6E) = "."
    KeyList(&H6F) = "/"
    KeyList(&H70) = "F1"
    KeyList(&H71) = "F2"
    KeyList(&H72) = "F3"
    KeyList(&H73) = "F4"
    KeyList(&H74) = "F5"
    KeyList(&H75) = "F6"
    KeyList(&H76) = "F7"
    KeyList(&H77) = "F8"
    KeyList(&H78) = "F9"
    KeyList(&H79) = "F10"
    KeyList(&H7A) = "F11"
    KeyList(&H7B) = "F12"
    KeyList(&H7C) = "F13"
    KeyList(&H7D) = "F14"
    KeyList(&H7E) = "F15"
    KeyList(&H7F) = "F16"
    KeyList(&H80) = "F17"
    KeyList(&H81) = "F18"
    KeyList(&H82) = "F19"
    KeyList(&H83) = "F20"
    KeyList(&H84) = "F21"
    KeyList(&H85) = "F22"
    KeyList(&H86) = "F23"
    KeyList(&H87) = "F24"
    KeyList(&H90) = "Num Lock"
    KeyList(&H91) = "Scroll Lock"
    KeyList(&HBA) = ":"
    KeyList(&HBB) = ";"
    KeyList(&HBC) = ","
    KeyList(&HBD) = "-^"
    KeyList(&HBE) = "."
    KeyList(&HBF) = "/"
    KeyList(&HC0) = "@"
    KeyList(&HDB) = "["
    KeyList(&HDC) = "\"
    KeyList(&HDD) = "]"
    KeyList(&HDE) = "^"
    KeyList(&HE2) = "\(バックスラッシュ)"
    KeyList(&HF0) = "Caps Lock"
    KeyList(&HF2) = "カタカナ"
    KeyList(&HF3) = "半角/全角"
    KeyList(&HF4) = "半角/全角"
Cần sửa lại đoạn code record của Tool 1:
Mã:
if KeyStr = "LeftButton" or KeyStr = "RightButton" or KeyStr = "MiddleButton" then
Vì lúc này chúng ta có hai công việc, ghi lại thao tác chuột + ghi lại thao tác bàn phím.

Ngoài ra, vì listbox của Tool 1 và Tool2 có sự khác biệt: Listbox của Tool1 có 6 cột dữ liệu, Tool2 có 4 cột dữ liệu. Ngoài ra, để phục vụ cho việc tái hiện lại thao tác (Play sau này) cần phân biệt dòng dữ liệu nào là của chuột, dòng dữ liệu nào là của bàn phím, do đó phần ghi dữ liệu bàn phím sẽ thêm thông tin:
Mã:
 With List1
                    .AddItem EventTime & vbTab & _
                            UpDown & vbTab & _
                            KeyCode & vbTab & _
                            KeyStr & vbTab & _
                            "KeyboardX" & vbTab & "KeyboardX"
                    .ListIndex = .ListCount - 1 'select dong cuoi trong listbox
                End With
File demo (chú ý thao tác Play chưa hoạt động nên đừng thử dùng):
Hình ảnh demo:
Bạn cần đăng nhập để thấy hình ảnh
 

giaiphapvba

Administrator
Thành viên BQT
Giai đoạn 3: Hợp code Tool giai đoạn 1 (Tool 1: main) + Tool giai đoạn 2 (Tool 2).
Giai đoạn 3.2: Hợp code phần Play (tái hiện lại thao tác bàn phím và chuột).

File demo:
Có chú ý khi sử dụng: Bạn cần ấn phim từ tốn và chậm rãi, mục đích là một phím khi ấn xuống thì trên Listbox phải hiển thị được hai trạng thái Down/Up.

Hình ảnh dưới đây là quá trình macro Play, tái hiện lại thao tác bằng tay trước đó của tôi.
Bạn cần đăng nhập để thấy hình ảnh
 

BKKBG

Thành viên
Liệu chúng ta có thể lưu lại quá trình đã ghi trước đó để lần sau chỉ mở lên là nó thực hiện lại không nhỉ
Về lý thuyết thì được. Xuất toàn bộ nội dung từ Listbox ra txt rồi Import txt vào Listbox. Như vậy mọi người có thể chỉnh sửa file txt để thêm thao tác.
Về mặt thiết kế thì tôi nghĩ sẽ có nhiều vấn đề. Trường hợp người dùng load file txt khác, có nội dung không phù hợp để tái hiện thao tác thì phải ra thông báo lỗi đúng không?
Vậy nội dung txt như thế nào là sai?

Khi thêm chức năng này như bạn nói, nhất định phải có bước check file load vào, việc định nghĩa như thế nào là đúng, rồi từ đó code chức năng check file txt-là việc mất thời gian.

Nếu chỉ đơn thuần xuất ra và nạp vào y như bạn nói, việc code không mất tới 30p.
 

vbano1

SMod
Thành viên BQT
Giai đoạn 3: Hợp code Tool giai đoạn 1 (Tool 1: main) + Tool giai đoạn 2 (Tool 2).
Giai đoạn 3.2: Hợp code phần Play (tái hiện lại thao tác bàn phím và chuột).

File demo:
Có chú ý khi sử dụng: Bạn cần ấn phim từ tốn và chậm rãi, mục đích là một phím khi ấn xuống thì trên Listbox phải hiển thị được hai trạng thái Down/Up.
Thiết kế lại hiển thị trên UserForm. Hiện nay là hơi hỗn loạn.
Những điều các bạn có thể học hỏi được:
Bài toán 2:
Lấy giá trị của Listbox.
Mã:
For i = 0 To List1.ListCount - 1

        List1.ListIndex = i

        tmp = Split(List1.List(i), vbTab)   'Lay du lieu 1 dong, phan tach boi dau Tab
        EventTime = tmp(0)              'Thoi gian
        EventName = tmp(1)              'Down/Up
        KeyCode = tmp(2)                'KeyCode. Ex: 54
Dòng code số 1: Chạy từ dòng dữ liệu đầu tiên tới dòng dữ liệu cuối cùng trên Listbox.
Chạy tới dòng dữ liệu nào thì select vào dòng dữ liệu đó, cho nên ta có dòng code số 3.
Các dòng code 5~8 : lấy dữ liệu từ listbox. Cách lấy này rất hay
Hiện tại Listbox chỉ để 1 cột dữ liệu. Bằng cách thể hiện bằng các dấu Tab, nên nhin vào tưởng như Listbox đang dùng nhiều cột mà thực ra không phải.
Mình thấy tool này rất hay ! Liệu chúng ta có thể lưu lại quá trình đã ghi trước đó để lần sau chỉ mở lên là nó thực hiện lại không nhỉ nếu được như vậy thì thật tuyệt!
Cần phải thiết kế tỉ mỉ từng bước, sẽ bàn sau.
=====================
Thiết kế lại hiển thị (Lấy Tool1 tái hiện chuột làm nền tảng).
Thêm cột số thứ tự để trực quan hơn.
Bạn cần đăng nhập để thấy hình ảnh

Kết quả:
Bạn cần đăng nhập để thấy hình ảnh


Cụ thể sửa code:
1. Tạo ra 7 Label làm nhãn cho các cột dữ liệu, tên của chúng lần lượt là Lb1, Lb2,...,Lb7.
2. Sửa code:
Thủ tục UserForm_Initialize:
-Thêm code:
Mã:
    List1.ColumnCount = 7
    List1.ColumnWidths = Lb1.Width & ";" & Lb2.Width & ";" & Lb3.Width & ";" & Lb4.Width & ";" & Lb5.Width _
                            & ";" & Lb6.Width & ";" & Lb7.Width
Thủ tục cmdRecord_Click:
-Sửa code:
Phần code ghi thao tác bàn phím:
Mã:
                With List1
                    .AddItem
                    .List(cnt - 1, 0) = cnt
                    .List(cnt - 1, 1) = EventTime
                    .List(cnt - 1, 2) = "KeyboardX"
                    .List(cnt - 1, 3) = "KeyboardX"
                    .List(cnt - 1, 4) = UpDown 'KeyStr
                    .List(cnt - 1, 5) = KeyCode
                    .List(cnt - 1, 6) = KeyStr '"KeyboardX"
                    .ListIndex = .ListCount - 1 'select dong cuoi trong listbox
                End With
Phần code ghi thao tác chuột:
Mã:
With List1
                .AddItem
                .List(cnt - 1, 0) = cnt
                .List(cnt - 1, 1) = EventTime
                .List(cnt - 1, 2) = MousePos
                .List(cnt - 1, 3) = EventName
                .List(cnt - 1, 4) = UpDown
                .List(cnt - 1, 5) = KeyCode
                .List(cnt - 1, 6) = KeyStr
                .ListIndex = .ListCount - 1 'Select dong cuoi cung
            End With
cnt là biến đếm, mỗi lần phát hiện ra một sự kiện thì tăng cnt.
 

Yukino Ichikawa

Thành viên
Vâng, em xin tiếp nối của vbano1.
Liệu chúng ta có thể lưu lại quá trình đã ghi trước đó để lần sau chỉ mở lên là nó thực hiện lại không nhỉ nếu được như vậy thì thật tuyệt!
Vâng: đây ạ. Chỉ xuất ra và nạp lại thì không khó lắm. Nhưng thiết kế tỉ mỉ như BKKBG nêu thì cần thời gian ạ.
Bạn cần đăng nhập để thấy hình ảnh
 

tuhocvba

Administrator
Thành viên BQT
Thật là hết chịu nổi.
Do đó tôi xúc tiến dự án này, cung cấp ngay bản demo cho anh chị em.

Ở bản này, anh chị em có thể nhập vào số phút để chạy nút Play lặp lại trong bao nhiêu phút.
Bạn cần đăng nhập để thấy hình ảnh

Anh chị em cũng có thể dùng các phím Export để xuất nội dung từ Listbox ra file txt.
Đồng thời sử dụng phím Import để nạp lại nội dung này vào Listbox.
 

Euler

Mod
Thành viên BQT
Bản Tool final:
Link download:
Mật khẩu các loại nếu có sẽ là:
Mã:
tuhocvba.net
 

PTHhn

Thành viên
Tool này hay quá, nhưng khi đang Play ở chế độ đặt giờ (ví dụ 1 tiếng), trong thời gian ấy có người chat với mình. Mình muốn dừng thì thao tác hơi khó khăn. Nên có phím nóng để dừng chương trình ngay lập tức.
 
Top