1. Tải bản cài đặt AutoIT mới nhất

    Chào Khách. Nếu bạn mới tham gia và chưa cài đặt AutoIT.
    Vui lòng vào topic trên để tải bản AutoIT mới nhất nhé
    Dismiss Notice
  2. Quy định và nội quy

    Chào Khách. Vui lòng đọc kỹ nội quy và quy định của diễn đàn
    Để tránh bị ban một cách đáng tiếc nhé!
    Dismiss Notice
  3. Hướng dẫn chèn mã AutoIT trong diễn đàn

    Chào Khách. Vui lòng xem qua bài viết này
    Để biết cách chèn mã AutoIT trong diễn đàn bạn nhé :)
    Dismiss Notice

AutoHotKey Hiểu hơn về PostMessage / SendMessage

Thảo luận trong 'AutoHotkey' bắt đầu bởi ledachai, 16/8/20.

  1. ledachai

    ledachai Thành viên
    • 18/23

    Tham gia ngày:
    17/5/20
    Bài viết:
    41
    Đã được thích:
    27
    Bắt nguồn từ một sự cố khi chạy nhiều cửa sổ. Mình chạy 3 phiên bản khác nhau của 1 Script, mỗi phiên bản là 1 Gui sẽ điều khiển 1 cửa sổ đích. Và để tiện thao tác, thay vì tìm đến gui đích để ấn nút "Tạm dừng" mình đặt hotkey F3 để tạm dừng script. Khi active 1 Client, ấn F3 sẽ Pause Gui tương ứng. Việc đối sánh Client và Gui đã xong, nhưng mình quên mất là khi đặt hotkey, sẽ vô hiệu chức năng của hotkey đó trên những cửa sổ khác. Nó chỉ pause được Gui mở cuối cùng!
    Vậy là, từ gui này, mình phải gửi lệnh dừng đến các gui khác.
    Để gửi lệnh pause đến script khác, trong 1 ví dụ về lệnh Pause có đoạn:
    Mã (Text):
    DetectHiddenWindows, On
    WM_COMMAND := 0x111
    ID_FILE_PAUSE := 65403
    PostMessage, WM_COMMAND, ID_FILE_PAUSE,,, C:\YourScript.ahk ahk_class AutoHotkey
    Nó pause script. Nhưng mình k0 muốn nó thô thiển như thế. nút "Tạm dừng" của mình nó thực hiện 1 số lệnh trước khi nó thực sự pause.
    Tìm hiểu thêm về PostMessage. Giống như việc mình thao tác trên cửa sổ, sẽ gửi đi các tin nhắn đến cửa sổ đó, khi nhận đc tn, cửa sổ sẽ phản hồi lại: mở tab, đổi công cụ, mở 1 cửa sổ con... Thao tác bằng tay là các tin nhắn công khai, còn postmsg sẽ là tin nhắn mật gửi đi ngay cả khi cửa sổ bị ẩn.
    Cú pháp:
    Mã (Text):
    PostMessage, Msg , wParam, lParam, Control, WinTitle, WinText, ExcludeTitle, ExcludeText
    SendMessage, Msg , wParam, lParam, Control, WinTitle, WinText, ExcludeTitle, ExcludeText, Timeout
    Trong 1 hướng dẫn về PostMessage / SendMessage Tutorial by Rajat
    Mã (Text):
    PostMessage, 0x111, 40239, 0, , New Message
    0x111: là wm_command message

    40239: là code wParam
    New Message: là wintitle
    Để mò code mình cũng tải về Winspector Spy và làm theo hướng dẫn. Mình dùng win10 và hình như Winspector Spy k0 spy được các công cụ hệ thống sẵn có. Mình sẽ tạo 1 cái gui để test, trên gui có 1 botton, và kích button sẽ chạy 1 lệnh gì đó. Chạy Winspector Spy và mò theo hướng dẫn mình thu được 3 dòng này:
    Mã (Text):
    WM_COMMAND
    Code: BN_Clicked
    Control ID: 3
    Control HWND: 0x00530472
    Và thay cái control ID vào ví dụ theo như hướng dẫn. Kết quả là không có gì xảy ra ! Có vẻ cách tìm code của mình chưa đúng.
    Quanh quẩn rồi mình nghĩ đến 2 phương án:
    - gửi controlclick đến gui đích để click vào nút tạm dừng
    - định nghĩa OnMessage() để gửi mã theo ý mình. Chương trình của mình thì mình định nghĩa đc, thế còn chương trình khác, mình không code lại để định nghĩa đc thì chịu sao?
    Và với chức năng hay ho của postmessage, mình sẽ tiếp tục gửi 1 tin nhắn để kích hoạt nút trên cửa sổ đích...
     
  2. ledachai

    ledachai Thành viên
    • 18/23

    Tham gia ngày:
    17/5/20
    Bài viết:
    41
    Đã được thích:
    27
    Quay lại kết quả thu được từ Winspector Spy. Mình lên GG search về loại "Code: BN_Clicked". Kết quả từ Microsoft:
    Theo cấu trúc mã BN_Clicked đối chiếu với kết quả thu được từ Winspector Spy thì wParam=3 , lParam = 0x00530472 thay vào lệnh ví dụ sẽ là:
    Mã (Text):
    PostMessage, 0x111,3,0x00530472,,Gui ;     Nút 1
    Nó đã hoạt động!
    Tức là,
    wParam=Control ID= mã kích hoạt nút. lParam =Control HWND= ID của nút
    Để biết hiệu quả của PostMessage, sau đó mình disabled đồng thời hidden 1 nút thứ 2
    Mã (Text):
    Gui Add, Button, w80 Disabled Hidden grun2, Nút 2
    PostMessage vẫn có thể kích hoạt Nút 2 ngay cả khi nó bị vô hiệu hoá và ẩn.
    Mã (Text):
    ControlGet, OutputVar, Hwnd,, Nút 2, Gui
    PostMessage, 0x111,4,OutputVar,,Gui ;      nut 2
    Nó bỏ qua giao diện người dùng. Thay vì phải gọi qua các bước File/Setting/Picture gì đó, nó gọi trực tiếp chức năng cần gọi lên.
    Đối chiếu cú pháp mình thu được với cú pháp của Rajat có vẻ khác nhau: Kích hoạt nút cần mã kích hoạt nút và ID của nút trên cửa sổ đích, còn gọi 1 chức năng hay cửa sổ con thì chỉ cần mã kích hoạt chức năng trên cửa sổ đích.
    Mình chưa thực sự hiểu về WM_COMMAND (0x111)
    Và ngoài WM_COMMAND còn rất nhiều các WM_* khác nữa... :-j
     
  3. #Rainy# Hoàng Vũ IT

    #Rainy# Hoàng Vũ IT Hoàng Vũ IT Moderator
    • 43/45

    Tham gia ngày:
    21/11/16
    Bài viết:
    404
    Đã được thích:
    122
    1. Để hiểu về Post,SendMesage bác có thể ghé qua Autoit sẽ có nhiều vd hơn.
    2. Về vấn đề Pause của bác thì bác nên sử dụng _isPressed sẽ tốt hơn.
     
  4. ledachai

    ledachai Thành viên
    • 18/23

    Tham gia ngày:
    17/5/20
    Bài viết:
    41
    Đã được thích:
    27
    Hi, cảm ơn bạn đã cmt. Hồi đầu mình cũng có lăn tăn chọn học AutoIT hay AutoHK. Mình nghĩ cái nào tốt hơn, nhiều chức năng hơn thì sẽ rộng hơn và khó học hơn. Mình chọn AHK vì nó cơ bản và dễ học.
    P/S: Hoá ra gửi msg đến Gui để gui kích hoạt nút là đi đường vòng. Mình có thể gửi thẳng lệnh click đến nút bằng WM_LBUTTONDOWN hoặc BM_CLICK :-??
     
  5. Theendsd

    Theendsd Thành viên mới
    • 1/6

    Tham gia ngày:
    7/6/20
    Bài viết:
    10
    Đã được thích:
    0
    Hiện tại mình đang viết auto trên cho web game.....chỉ dùng controlclick và gdip_imagesearch .... Nhưng sau khi chạy auto thì web cứ bật lên mãi minium thì hk hoạt động....trans đi thì auto chạy nhưng mỗi khi tới lệnh controlclick thì cũng vậy...bác có cách nào hk
     
  6. Em_Cu

    Em_Cu Thành viên mới
    • 3/6

    Tham gia ngày:
    2/10/20
    Bài viết:
    17
    Đã được thích:
    4
    Gdip_ không hoạt động ở chế độ mini và trans hay hidden. Hoạt động tốt ở chế độ ko che hoặc bị che bởi cửa sổ khác. Nếu ko muốn cửa sổ xuất hiện trên màn hình thì dùng lệnh :
    Mã (Text):
    Winmove,title,,x,y,w,h
    X,y là tọa độ mới của góc trên bên trái cửa sổ.
    Vd: x:=0 , y:= A_ScreenHeight
    Move cửa sổ ra ngoài màn hình góc dưới bên trái.
    Có thể check ảnh chụp bằng hàm :
    Mã (Text):
    Gdip_SaveBitmapToFile(pBitmap,“Save.bmp”)
     
    Kiểm tra hình có chụp được ko. Đen sì là error. Một chú ý nữa là controlclick lấy tọa độ theo window. Muốn click ở chế độ bị che hay hidden cần dòng DetectHiddenWindows, on.
     
    Chỉnh sửa cuối: 7/2/21
    Theendsd thích bài này.

Chia sẻ trang này

Đang tải...