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 Hướng dẫn tạo một autoBOT cho game bất kỳ

Thảo luận trong 'AutoHotkey' bắt đầu bởi ledachai, 29/5/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
    Một auto-click thì đơn giản rồi. Cứ lặp đi lặp lại theo chu kỳ. Các bạn có thể tìm hiểu thêm ở đây.
    http://autoitvn.com/threads/huong-dan-cach-tao-mot-auto-click-khong-chiem-chuot-don-gian.1577/

    Các autoBOT hiện hay đa số đọc dữ liệu game, can thiệp vào game, đọc các gói dữ liệu đến và đi để thực hiện thao tác. BOT sẽ chạy mượt và chuẩn hơn, nhưng để chọc ngoáy vào game có vẻ như cánh rừng bạt ngàn cây lá (Có thể ae mình sẽ tìm hiểu sau).

    Vì vậy, trong bài viết này mình đề cập đến việc trực quan hơn: chụp màn hình để nắm bắt tình huống, và xử lý tình huống (giống như là mình nhìn vào màn hình, thấy sự kiện này thì chúng ta làm thế này, nhìn thấy cái khác thì chúng ta lại làm cái khác). Và quan trọng là phải hoạt động ngay cả khi ẩn cửa sổ để còn làm việc khác

    Sử dụng các công cụ đơn giản:
    - Tìm kiếm hình ảnh (gdip_imagesearch)
    - Click chuột (ControlClick)
    - Nếu…. Thì…. (If…. Else…)
    - Lặp lại …. Cho đến khi….. (Loop…. Until…..)

    Rồi bắt tay vào làm.
    1. Đầu tiên làm cái Gui cho dễ nhìn
    [​IMG]
    Mã (Text):

    #NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
    SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
    SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.
            ; mấy cái trên tạo mới nó tự có chả biết để làm gì :D
    DetectHiddenWindows, on     ; để bot có thể hoạt động cả khi cửa sổ thu nhỏ dưới taskbar
    SetControlDelay -1             ; mặc định 1 lần click được hiểu là nhấn xuống - giữ khoảng 20 (ms) - nhả chuột. Nhưng nếu trong 20ms giữ kia bạn di chuột trên cửa sổ, nó sẽ trở thành việc kéo rê chuột đi. Cái này hạn chế điều đó.

    ; Tao Gui
    Gui,+Alwaysontop
    Gui Add, Text,, Cửa sổ đích
    Gui Add, Text,, (Active cửa sổ đích, sau đó ấn F2 để chọn)
    Gui Add, Text,, Chú ý: Auto chạy trên cửa sổ NOX có độ phân giải 800x450
    Gui Add, Text,, Log event
    Gui, Add, ListView,r15 w300 vlistview2, event
    Gui Add, Button, x152 y400 w80 h23 vRunAuto , Chạy (F3)
    Gui Add, Button, x240 y400 w80 h23 vStopAuto , Dừng (F4)
    Gui,Add,StatusBar
    SB_SetText("Kiếm gì cho tui làm đê :(",1)
    SB_SetIcon("Shell32.dll", 44,1)
    Gui Show, , Full nhiệm vụ cá nhân
    Return
     
    Thêm mấy cái này để khi ấn Esc là thoát tất
    Mã (Text):

    esc::
    EXIT_LABEL:
    Gdip_Shutdown(pToken)
    GuiEscape:
    GuiClose:
    EXITAPP
     
    2. Chọn cửa sổ đích để chạy (ấn F2)
    Mã (Text):

    F2::
    if playing   ; chả biết
      return   ; nó có tác dụng gì :(
    WinGetActiveTitle , wTitle      ;lấy tên cửa sổ đang active, gán tên cho nó là wtitle
    MouseGetPos,px,py,vHWND        ; lấy toạ độ và địa chỉ vật lý của cửa sổ
    Gui Add, Text,x85 y5, %wTitle%
    LV_Add("","đã chọn " wTitle)      
    LV_ModifyCol()    ; tự chỉnh độ rộng cột
    Return
     
    3. Phần chính: chạy chương trình (ấn F3)
    F3::
    ............ lát nữa viết tiếp :D
    P/S: Auto dùng hàm phát triển gdip_imagesearch nên phải copy thư viện gdip và gdip_imagesearch vào Thư mục cài đặt AutoHotKey\lib nhé
    Gdip.ahk có sẵn trong file cài đặt của kakanet hoặc tải bản mới nhất ở đây
    https://github.com/tariqporter/Gdip/blob/master/Gdip.ahk
    Gdip_imagesearch.ahk dow ở đây

    https://github.com/MasterFocus/AutoHotkey/tree/master/Functions/Gdip_ImageSearch
     
    Chỉnh sửa cuối: 16/6/20
  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
    Phần chạy, chúng ta có 3 trường hợp cơ bản. Từ cơ bản có thể tuỳ biến để xử lý những trường hợp phức tạp hơn
    - TH1 (Cơ bản): Nhìn trên màn hình, thấy icon A thì thực hiện hành động 1, nếu không thấy thì thực hiện hành động 2.
    - TH2: Tình huống giống TH1, nhưng không biết khi nào thì icon A xuất hiện. Đợi đến khi A xuất hiện, thì thực hiện hành động 1
    - TH3: Nếu có icon A thì thực hiện hành động 1, nếu không thấy icon A thì tìm icon B, nếu thấy icon B thì thực hiện hành động 2, nếu cả 2 đều không thấy thì thực hiện hành động 3
    - TH4: giống TH3, nhưng khi thấy B và thực hiện hành động 2 lại có khả năng làm xuất hiện A và chúng ta phải xử lý cả 2 cho đến khi không còn cả A và B thì thực hiện hành động 3
    1. TH1 (Cơ bản): Cứ bê nguyên gdip_imagesearch vào thôi
    Trước khi làm, tải 2 file thư viện copy vào thư mục lib của autoHOtKey nhé (tải ơ đâu mình cũng chả nhớ, bạn lên gg search nhé)
    Mã (Text):
    F3::
    if playing    ; nếu đang chạy
        return    ; thì không làm gì cả
    ; còn thì:
    playing:=1
    SB_SetText("Trạng thái: Đang chạy auto",1)

    OnExit, EXIT_LABEL
            If !pToken := Gdip_Startup()
            {
                    MsgBox, 48, gdiplus error!, Không load được Gdiplus. Kiểm tra lại thư viện đã được cài!
                    ExitApp
            }
            needle=%a_scriptdir%\anhmau.png          ; duong dan den file anh muon tìm, you need testimage needle.png
            bmpNeedle := Gdip_CreateBitmapFromFile(needle)
            LV_Add("","Tải ảnh mẫu")
            pToken:=Gdip_Startup()
            bmpHaystack := Gdip_BitmapFromHWND(vhwnd)
            LV_Add("","Quét cửa sổ đích")
            RET := Gdip_ImageSearch(bmpHaystack,bmpNeedle,Toado,0,0,0,0,100)
            ; toado là kết quả trả về, 0,0,0,0 để quét toàn cửa sổ đích, 100 là độ nhạy mà
            ; 5 tham số này mình có nhắc đến trong 1 bài khác đề cập đến hàm gdip_imagesearch
            if (Toado <>"")    ; nếu kết quả trả về khác rỗng
            {
                ; đặt:
                pos:=StrSplit(Toado,",")
                xp:=pos.1+36 ,yp:=pos.2+12                        ;điểm cần click cách icon tìm thấy 1 đoạn dx=36, dy=12
                ControlClick, x%xp% y%yp% , %wtitle%,,,, NA
                tooltip , x%xp% y%yp%
                LV_Add("","Đã thấy icon tại " pos.1 "," pos.2)
                LV_Add("","Click vào " xp "," yp)
            }
            else
            {
                LV_Add("","Không tìm thấy ảnh mẫu")
                ControlClick, x100 y100 , %wtitle%,,,, NA    
            }
            ; xoá bỏ khay nhớ tạm, đóng phiên tìm kiếm
            Gdip_DisposeImage(bmpHaystack)
            Gdip_DisposeImage(bmpNeedle)
            Gdip_Shutdown(pToken)
            LV_Add("","Dừng auto")
            SB_SetText("Đã dừng",1)
            return
     
    minhtam143 thích bài này.
  3. ledachai

    ledachai Thành viên
    • 18/23

    Tham gia ngày:
    17/5/20
    Bài viết:
    41
    Đã được thích:
    27
    - TH2: Tình huống giống TH1, nhưng không biết khi nào thì icon A xuất hiện. Đợi đến khi A xuất hiện thì thực hiện hành động 1
    Kịch bản cho TH này sẽ là:
    ; Tìm iconA trên màn hình
    ; Nếu không thấy thì tìm lại
    ; Cho đến khi thấy
    ; Thì Click vào nó
    Có kịch bản rồi thì cứ thế diễn thôi
    Mã (Text):
    F3::
    OnExit, EXIT_LABEL
            If !pToken := Gdip_Startup()
            {
                    MsgBox, 48, gdiplus error!, Không load được Gdiplus. Kiểm tra lại thư viện đã được cài!
                    ExitApp
            }
            needle=%a_scriptdir%\iconA.png
            pToken:=Gdip_Startup()
            bmpNeedle := Gdip_CreateBitmapFromFile(needle)
            LV_Add("","Tải ảnh mẫu")      
    Loop
        {
            bmpHaystack := Gdip_BitmapFromHWND(vhwnd)
            LV_Add("","Quét cửa sổ đích")
            RET := Gdip_ImageSearch(bmpHaystack,bmpNeedle,Toado,20,20,800,400,100)
            LV_Add("","Đang tìm iconA...")
            sleep 2000 ;khoảng chờ giữa mỗi lần quét, tránh lag
        } until (Toado <>"") ;cho tới khi có kết quả trả về
            Gdip_DisposeImage(bmpHaystack)
            Gdip_DisposeImage(bmpNeedle)
            Gdip_Shutdown(pToken)
            pos:=StrSplit(Toado,",")
            LV_Add("","Đã tìm thấy iconA tại: " pos.1 "," pos.2)
            xp:=pos.1+5 ,yp:=pos.2+5
            ControlClick, x%xp% y%yp% , %wTitle%,,,, NA ;click vào đó
            LV_Add("","Click vào  " xp "," yp)
            LV_Add("","Dừng Auto")
        return
     
  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
    - TH3: Nếu có icon A thì thực hiện hành động 1, nếu không thấy icon A thì tìm icon B, nếu thấy icon B thì thực hiện hành động 2, nếu cả 2 đều không thấy thì thực hiện hành động 3.
    Mã (Text):
    F3::
    OnExit, EXIT_LABEL

    If !pToken := Gdip_Startup()
    {
       MsgBox, 48, gdiplus error!, Gdiplus failed to start. Please ensure you have gdiplus on your system
       ExitApp
    }
    needle=%a_scriptdir%\iconA.png          ; duong dan den file anh muon tìm, you need testimage needle.png
    LV_Add("","Tim A")            ; thêm "" de add text thay vi` add bien'
    pToken:=Gdip_Startup()
    bmpHaystack := Gdip_BitmapFromHWND(vhwnd)
    bmpNeedle := Gdip_CreateBitmapFromFile(needle)
    RET := Gdip_ImageSearch(bmpHaystack,bmpNeedle,Toado,0,0,0,0,150)

    if (Toado <>"")                ; nho' () truoc' tham so'
    {
        pos:=StrSplit(Toado,",")
        xp:=pos.1+5 ,yp:=pos.2+5
        LV_Add("","Da tim thay A tại: " xp "," yp)
        ControlClick, x%xp% y%yp% , %wTitle%,,,, NA         ;click vào dó
        LV_Add("","Click vào: " xp "," yp)
        return            ;neu' k co return no' tu chay tiep'
    }

    else    
    {
            LV_Add("","Khong tim thay A")
            LV_Add("","Tim B")
            needle=%a_scriptdir%\iconB.png          ; duong dan den file anh muon tìm, you need testimage needle.png
            bmpNeedle := Gdip_CreateBitmapFromFile(needle)
            RET := Gdip_ImageSearch(bmpHaystack,bmpNeedle,Toado,0,0,0,0,150)
            Gdip_DisposeImage(bmpHaystack)
            Gdip_DisposeImage(bmpNeedle)
            Gdip_Shutdown(pToken)
        if (Toado <>"")                ; nho' () truoc' tham so'
            {
                    pos:=StrSplit(Toado,",")
                    xp:=pos.1+1 ,yp:=pos.2+1
                    LV_Add("","Da tim thay B tại: " xp "," yp)
                    ControlClick, x%xp% y%yp% , %wTitle%,,,, NA         ;click vào dó
                    LV_Add("","Click vào: " xp "," yp)
                    return
            }
        else
        LV_Add("","Khong thay cả A lẫn B")
        return
    }
    - Chú ý là ở trên mình khong quét lại màn hình mà chỉ thay ảnh mẫu
    - TH3 này có thể tuỳ biến thành:
    + Nếu thấy A hoặc B thì thực hiện 1, nếu không thấy thì thực hiện 2
    + Nếu thấy cả A và B thì thực hiện 1, không thấy thì thôi
    + hoặc TH3 kết hợp với TH2 thành TH4 đã nêu ở trên. Hoặc có thể là If vài lần lồng nhau kết hợp với lặp... cho tới khi....
    * NHỮNG THAM SỐ TÌM KIẾM CẦN CHÚ Ý
    1. Về ảnh mẫu (Needle)
    - Nếu tìm kiếm ảnh mẫu gặp khó khăn, rõ ràng có xuất hiện trên màn hình nhưng auto không nhìn thấy:
    + Game thường có đồ hoạ và sắc thái biến đổi. Nhìn có thể như nó vẫn y nguyên, nhưng hãy thử giảm độ nhạy màu (bằng cách tăng chỉ số nhạy màu, 0 là tìm kiếm chính xác 100%, đến 255 là màu nào cũng như màu nào, đỏ cũng như xanh đều đúng). Trong game mình thường để nhạy màu = 50 đến 100
    + Hoặc chia nhỏ icon ra và tìm vào phần mà chúng ta chắc chắn nó không thay đổi
    + Nếu yếu tố thay đổi nằm giữa icon, hãy dùng phần mềm chỉnh sửa xoá yếu tố đó đi thành trong suốt (trong suốt chứ không phải màu trắng). Mặc dù trong gdip_imagesearch có hỗ trợ chọn màu để làm cho trong suốt nhưng mình thấy cách trên vẫn hay hơn
    - Nếu giảm độ nhạy màu việc tìm kiếm sẽ dễ dàng hơn, nhưng có thể auto sẽ nhận nhầm một icon na ná khác:
    + Hãy giới hạn vị trí tìm kiếm nếu bạn chắc rằng nó xuất hiện ở đây, chứ không phải ở chỗ khác.
    - Nếu icon có thể xuất hiện nhiều vị trí, nhưng bạn chỉ muốn xét đến vị trí x, còn ở vị trí y thì kệ nó: làm giống trên
    2. Thao tác chuột (lệnh ControlClick)
    - Sử dụng con lăn:
    Mã (Text):
    ControlClick,,%wTitle%,, WheelUp,5, x543 y300 na
    Thao tác này hoạt động trên các soft đơn giản, nhưng trên game yêu cầu đồ hoạ cao thì lúc được lúc không
    - Thao tác nhấn giữ và kéo chuột:
    Nếu bạn cứ để cửa sổ ontop trên màn hình thì có sẵn lệnh MouseMoveCraft gì đó của Autohotkey. Nhưng với cửa sổ ẩn thì mình chưa tìm thấy chức năng tương tự, mà phải thực hiện nhiều lần ClickDown liên tục và kết thúc bằng 1 ClickUp.
    Mã (Text):
    ControlClick, x543 y340 ,%wTitle%,,,, d NA
    Sleep 100
    ControlClick, x543 y300 ,%wTitle%,,,, d NA
    Sleep 100
    ControlClick, x543 y250 ,%wTitle%,,,, u NA
    return
    Tuy nhiên độ tin cậy chỉ đạt 80% vì:
    + Nếu ở soft đơn giản thì cứ click down ở A rồi click down ở B nó tự hiểu là rê chuột tức thời từ A sang B. Nhưng trong game thì nó đòi hỏi 1 khoảng delay 100ms chẳng hạn. Nếu trong 100ms này bạn rê chuột trên cửa sổ thì
    Mã (Text):
    SetControlDelay -1
    đặt ban đầu cũng không đỡ được
    + Việc click liên tục gần nhau, delay càng dài thì độ chính xác lần kéo rê càng cao, nhưng hãy xem lại + ở trên
    /---------
    Lát nữa mình sẽ làm 1 cái video demo. Auto nó chạy chỉ 3s là xong nhưng có khi mình phải ngồi code cả buổi sáng vì cứ việc này việc khác. Đến lúc quay lại thì lại phải đọc lại xem code đang ở phần nào và sẽ phải viết gì tiếp theo ^^!
     
    Chỉnh sửa cuối: 30/5/20
    MinhHai87 thích bài này.
  5. ledachai

    ledachai Thành viên
    • 18/23

    Tham gia ngày:
    17/5/20
    Bài viết:
    41
    Đã được thích:
    27
    Demo. Mình mới làm nên cái Gui còn sơ sài, các bước vẫn chưa đc mượt lắm. Tạm thời thế này đã...
     
  6. MinhHai87

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

    Tham gia ngày:
    2/6/20
    Bài viết:
    1
    Đã được thích:
    1
    Nếu mình muốn dùng cho giả lập khác và có độ phân giải khác thì làm thế nào vậy bạn?
     
    Tu1998 thích bài này.
  7. congbtv

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

    Tham gia ngày:
    1/5/20
    Bài viết:
    1
    Đã được thích:
    1
    bác ơi bác share cái tool dc ko :V e ko biết gì về autohotkey nhưng e thấy bọn philippin hay lào có cái tool này
    seach click theo hình ảnh delay với if and hoăc loop ngon mà mỗi tội ko có key của nó bác share của bác thì tốt quá
     
    Phạm Vũ Trụ thích bài này.
  8. ledachai

    ledachai Thành viên
    • 18/23

    Tham gia ngày:
    17/5/20
    Bài viết:
    41
    Đã được thích:
    27
    Được bạn nhé. Chỉ cần bạn chụp lại ảnh mẫu là được.
    Vì ở độ phân giải 800x450 icon có kích thướng 80x45 chẳng hạn, thì khi để độ pg 400x220 icon đó sẽ có kích thước 40x22. Nếu bê nguyên cái icon to ở trên vào thì sẽ không tìm thấy.
    Mình cũng chưa tìm đc chức năng nào tự scale icon theo độ phân giải cửa sổ. bên imagesearch có, mà bên gdip_imagesearch mình chưa thấy.
     
  9. Phạm Vũ Trụ

    Phạm Vũ Trụ Thành viên mới
    • 3/6

    Tham gia ngày:
    8/10/19
    Bài viết:
    6
    Đã được thích:
    3
    Bạn share source cho mình đc k?
     
    Chỉnh sửa cuối: 9/6/20
    Tu1998 thích bài này.
  10. ledachai

    ledachai Thành viên
    • 18/23

    Tham gia ngày:
    17/5/20
    Bài viết:
    41
    Đã được thích:
    27
    Ok. Share source. Mình đang viết phần khung chạy. Định hướng Auto sau khi hoàn thành sẽ giống như thế này
    [​IMG]
    Mình mới hoàn thành phần Nhiệm vụ cá nhân và Phó bản tổ đội. (và có lẽ mình cũng chỉ share đc phần nhiệm vụ cá nhân)
    Mỗi dòng lệnh mình đều giải thích rõ cú pháp và tác dụng của lệnh, bạn có thể tuỳ chỉnh
    Nhiều hoàn cảnh cố định mình làm kịch bản mouse click luôn chứ không qua check màn hình nên nhiều khi với nhân vật khác, map 70 nên có thể có những sai khác nếu bạn map 190.
    Phần auto training định hướng dùng các lệnh lấy toạ độ chuột để lấy toạ độ train hoặc áp dụng luôn imagesearch chấm xanh để xác định vị trí nhân vật trên bản đồ, sau đó lập kịch bản để chạy đánh train nhiều bãi, tự trở lại bãi nếu bị pk.....
    Phần hoạt động hạn giờ sẽ dùng các biến thời gian a_hour, a_min, a_sec để hẹn giờ tham gia hoạt động. Có thể thêm settimer, a_now, a_tickcount nếu cần....
    Cái nút "Chạy" với "Dừng" mình chưa học đến phần Gui, add, button nên chưa biết làm thế nào để bấm vào nó chạy, mà phải bấm hotkey F2 chọn cửa sổ đích, F3 để chạy...
    Có thể chạy nhiều bản để chạy nhiều cửa sổ
     

    Các file đính kèm:

    Chỉnh sửa cuối: 10/6/20
  11. Phạm Vũ Trụ

    Phạm Vũ Trụ Thành viên mới
    • 3/6

    Tham gia ngày:
    8/10/19
    Bài viết:
    6
    Đã được thích:
    3
    Thanks bạn rất nhiều.
     
    Tu1998 thích bài này.
  12. Người Đã Khuất

    Người Đã Khuất Thành viên mới
    • 1/6

    Tham gia ngày:
    25/12/18
    Bài viết:
    3
    Đã được thích:
    1
  13. ledachai

    ledachai Thành viên
    • 18/23

    Tham gia ngày:
    17/5/20
    Bài viết:
    41
    Đã được thích:
    27
    Lên google dịch thì nó báo dòng 113 sai cú pháp biến pos.1, pos.1 là kết quả tìm kiếm của gdip_imagesearch. Nếu bạn vừa sửa và bị lỗi thì sửa lại, còn nếu down nguyên bản của mình mà lỗi này thì thử cài lại thư viện gdip xem
     
  14. 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
    Sau mình Test thử thì thấy phần chạy Phó Bản nó chỉ là ControlClick còn phần tìm hình ảnh hk có tác dụng......vì cho dù ảnh mẫu có suất hiện cũng hk hoạt động mà phải chờ Loop xong mới ControlClick típ..
    mình hk biết tý gì hết chỉ hỏi bác phải vậy hk để mình hiểu hơn....Tks bác nhìu
     
  15. ledachai

    ledachai Thành viên
    • 18/23

    Tham gia ngày:
    17/5/20
    Bài viết:
    41
    Đã được thích:
    27
    Mình cũng là tay ngang thôi mà. Có gì hay thì share AE cùng tìm hiểu và phát triển
    ImageSearch k0 hoạt động theo kinh nghiệm cảu mình thì có thể là:
    - mình dùng Gdip_ImageSearch, nó hoạt động trên cửa sổ bị che khuất (bởi cửa sổ khác), nhưng không hoạt động nếu cửa sổ bị thu nhỏ dưới tasbar
    - tìm hình ảnh nó phụ thuộc vào sắc thái hình ảnh của máy (driver), phần mềm giả lập khác cũng có thể sắc thái cũng khác...mặc dù mình để sẵn thay đổi màu n=50-150 nhưng khó có thể cao hơn nữa (cao quá sẽ dễ bị nhận diện nhầm),nếu dùng icon của mình k0 đc bạn phải làm lại thư viện icon mới của riêng bạn
    - Mình chia sẻ 2 cái tool đơn giản mình tự làm để test icon cho gdip_imagesearch, thay đổi độ nhạy màu để tìm số phù hợp nhất
    1. Lấy toạ độ chuột trên cửa sổ (phục vụ việc giới hạn khu vực tìm kiếm)
    Mã (Text):
    #NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
    SendMode Input  ; Đề xuất cho các kịch bản mới do tốc độ và độ tin cậy vượt trội của nó.
    SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.

    ; Tao Gui
    Gui,+Alwaysontop
    Gui Add, Text,, Active cửa sổ, sau dó an F5 để lấy toạ độ chuột
    Gui Add, Text,, Toạ độ
    Gui, Add, ListView,r5 w300 vlistview2, Target Window|x|y
    Gui Show, , Lấy toạ độ cửa sổ
    Return

    F5::
    WinGetActiveTitle , wTitle
    MouseGetPos,px,py,vHWND        ; lấy hwnd của cửa sổ
    LV_Delete()
    LV_Add("",wTitle,px,py)
    LV_ModifyCol()
    Return

    EXIT_LABEL:
    Gdip_Shutdown(pToken)
    GuiEscape:
    GuiClose:
    EXITAPP
    2. dùng Test gdip_imagesearch, trả về toạ độ tất cả icon trùng khớp đồng thời hiện tooltip trên cửa sổ tại vị trí của icon. Trong mã có rất nhiều đoạn giải thích, mỗi khi test gặp vấn đề gì mới mình đều chú thích trong đó
    Mã (Text):
    #NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
    SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
    SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.  
    CoordMode,ToolTip, Window

    ; Tao Gui
    Gui,+Alwaysontop
    Gui Add, Text,, Cửa sổ đích
    Gui, Add, ListView, -Hdr r1 w150 x92 y3 vlistview1, tên cửa sổ
    Gui Add, Text,x10, - Active cửa sổ đích, sau đó ấn F2 để chọn
    Gui Add, Text,, - Ấn F3 để bắt đầu tìm kiếm
    Gui Add, Text,, Chú ý: Auto chạy trên cửa sổ NOX có độ phân giải 800x450
    Gui Add, Text,, Log event
    Gui, Add, ListView, -Hdr r15 w300 vlistview2, event
    Gui Show, , Test tìm 1 lần
    Return

    F2::
    if playing   ; chả biết
      return   ; nó có tác dụng gì :(
    WinGetActiveTitle , wTitle      ;lấy tên cửa sổ đang active, gán tên cho nó là wtitle
    MouseGetPos,px,py,vHWND        ; lấy toạ độ và địa chỉ vật lý của cửa sổ
    Gui, ListView, listview1
    LV_Delete()
    LV_Add("",wTitle)
    Gui, ListView, listview2
    LV_Delete()
    LV_Add("","đã chọn " wTitle)        
    LV_ModifyCol()    ; tự chỉnh độ rộng cột
    Return

    F3::
    if playing    ; nếu đang chạy
        return    ; thì không làm gì cả
    ; OnExit, EXIT_LABEL                ; có thể bỏ dòng này
            If !pToken := Gdip_Startup()
            {
                MsgBox, 48, gdiplus error!, Không load được Gdiplus.
                ExitApp
            }
            ;------------------------------------------------------------------------------------------------------
            needle=%a_scriptdir%\khuantoan.png          ; duong dan den file anh muon tìm
            ;LV_Add("","Tìm " needle)
            ;LV_ModifyCol()
            ; pToken:=Gdip_Startup()            ; có thể bỏ dòng này
            bmpNeedle := Gdip_CreateBitmapFromFile(needle)            ;k0 đc bỏ dòng này
            ;LV_Add("","Tải ảnh mẫu")
            bmpHaystack := Gdip_BitmapFromHWND(vhwnd)                ;k0 đc bỏ dòng này
             ;Gdip_SaveBitmapToFile(bmpHaystack,"Haystack.png") ; hiện thị ảnh quét cửa sổ để nắm lỗi nếu có
            ;LV_Add("","Quét cửa sổ đích")
            ;Foundx:= 100
            ;Foundy:= 100
            RET := Gdip_ImageSearch(bmpHaystack,bmpNeedle,ByRef,0,0,0,0,100,,1,0)
            ;RET := Gdip_ImageSearch(bmpHaystack,bmpNeedle,ByRef,0,0,foundx+540,foundy+330,150,,1,0) ; tìm tất thứ tự mặc định
            ; RET := Gdip_ImageSearch(bmpHaystack,bmpNeedle,ByRef,0,0,0,0,150,,2,0) ;để tìm tất, từ dưới lên trên
            ; ByRef là kết quả trả về, 0,0,0,0 để quét toàn cửa sổ đích, 100 là độ nhạy màu
            if (ByRef <>"")    ; nếu kết quả trả về khác rỗng
            {
                ; đặt:
                pos:=StrSplit(ByRef, "`n") ;pos1,pos2,pos3... có dạng 518,202
                Loop % pos.MaxIndex()    ; có cái này thì không cần until
                {
                    list:=StrSplit(pos[A_Index], ",") ; list.1,list.2 là 518 và 202
                    xp:=list.1
                    yp:=list.2                    ;điểm cần click cách icon tìm thấy 1 đoạn dx=36, dy=12
                    ;ControlClick, x%xp% y%yp% , %wtitle%,,,, NA
                    LV_Add("","Đã thấy icon tại " xp "," yp)
                    ToolTip,đây, xp, yp  
                    ; ToolTip,đây, xp+100, yp     thế này được
                    ;ToolTip,đây, % xp+100, %yp%    hoặc phải gán ở trên          
                    Sleep 1000
                    ; #Include add.ahk
                    ;} until (xp="")
                    ;} until pos[A_Index]=""
                }
            }
            else
            {
                LV_Add("","Không tìm thấy ảnh mẫu")  
            }
            ; xoá bỏ khay nhớ tạm, đóng phiên tìm kiếm
            Gdip_DisposeImage(bmpHaystack)
            Gdip_DisposeImage(bmpNeedle)
            Gdip_Shutdown(pToken)
            ;LV_Add("","Dừng auto")
            LV_ModifyCol()
            return
    esc::
    EXIT_LABEL:
    Gdip_Shutdown(pToken)
    GuiEscape:
    GuiClose:
    EXITAPP
     
  16. 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



    Bác cho mình hỏi cái này
    Mình làm thế này
    F4::
    if not playing
    Return
    StopAuto:=1
    Playing:=0
    Nhưng sau khi nhấn F4 vẫn hk đừng đc
    và hk biet có phải do mình tạo ảnh mẫu sai cách hay hk mà mình làm rất nhiều ảnh kể cả ảnh mẫu có rất nhìu điểm trùng cũng hk thể nào tìm đc
     
    Chỉnh sửa cuối: 14/6/20
  17. ledachai

    ledachai Thành viên
    • 18/23

    Tham gia ngày:
    17/5/20
    Bài viết:
    41
    Đã được thích:
    27
    Phần dừng mình chuyển sang dùng PAUSE rồi
    Mã (Text):
    F4::
    StopAuto:
    Pause
    Phần ảnh mẫu rất quan trọng quyết định việc Auto chạy có chuẩn hay không. Cho nên bạn cứ test nhiều vào. Về nguyên tắc, ảnh mẫu phải trùng khớp 100% đến từng pixel thì nó mới ra kết quả (mặc dù mình có thể thay đổi điều đó). Bạn đọc thêm phần Lưu ý ảnh mẫu needle của mình ở trên để nắm rõ hơn.
     
    Tu1998 and Theendsd like this.
  18. 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
    Bác cho mình xin fb đc hk ??
    mình đã thử để độ nhạy màu 255 như bác hướng đẫn vẫn hk tìm đc.....
    và cho hỏi cách chụp ảnh mẫu của mình có đúng hk
    mình đã chụp ảnh màn hình của trình giả lập NOX [​IMG]
    sau đó cắt phần cần tìm ra làm ảnh mẫu
    như vậy có đúng hk??
     
  19. ledachai

    ledachai Thành viên
    • 18/23

    Tham gia ngày:
    17/5/20
    Bài viết:
    41
    Đã được thích:
    27
    Để 255 là tất cả màu đều đúng, toạ độ trả về phải là 0,0 mới đúng. Bạn gửi code m xem thử
     
    Chỉnh sửa cuối: 14/9/20
  20. Người Đã Khuất

    Người Đã Khuất Thành viên mới
    • 1/6

    Tham gia ngày:
    25/12/18
    Bài viết:
    3
    Đã được thích:
    1
    C:\Program Files (x86)\AutoHotkey\Lib\Gdip_ImageSearch.ahk (89) : ==> Call to nonexistent function.
    Specifically: Gdip_GetImageDimensions(pBitmapHaystack,hWidth,hHeight)
    Mình đang gặp lỗi trên là như thế nào mong bác hỗ trợ!
    Thanks bác!
     
    Tu1998 thích bài này.

Chia sẻ trang này

Đang tải...