Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 12 kết quả

Đề tài: Thực hành API : Viết Auto Tunnel Người chơi trong room Garena Plus

  1. #1
    Ngày gia nhập
    10 2009
    Nơi ở
    gầm cầu
    Bài viết
    156

    Mặc định Thực hành API : Viết Auto Tunnel Người chơi trong room Garena Plus

    Chào các anh hùng bàn phím trong Cộng đồng C Việt
    dạo này thấy Box thủ thuật mãi chả có bài mới nào nên mình ngẫu hứng viết 1 bài cho nó có tí màu sắc
    mình chưa nghĩ dc cách Tự Join vào room nên bài này chỉ đơn giản là auto Tunnel người chơi khi bạn đã ngồi trong room .

    auto Tunnel là 1 chức năng nhỏ trong sản phẩm thương mại của thành viên Hieubm trong diễn đàn này .nhưng tâm lý chung xài cái mình code ra bao giờ cũng thích thú hơn phải ko nào

    đầu tiên khai báo thêm vài thư viện cần thiết
    Visual C# Code:
    1. using System.Runtime.InteropServices;
    2. using System.Threading;
    3. using System.Collections;

    tiếp theo khai báo những hàm API cần sử dụng
    Visual C# Code:
    1.         #region // API Funtion
    2.  
    3.         [DllImport("user32.dll", SetLastError = true)]
    4.         [return: MarshalAs(UnmanagedType.Bool)]
    5.         static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vk);
    6.  
    7.         [DllImport("user32.dll")]
    8.         private static extern bool UnregisterHotKey(IntPtr hWnd, int id);
    9.  
    10.         [DllImport("user32")]
    11.         [return: MarshalAs(UnmanagedType.Bool)]
    12.         private static extern bool EnumChildWindows(IntPtr window, EnumedWindow callback, ArrayList lParam);
    13.  
    14.         [DllImport("user32.dll", SetLastError = true)]
    15.         static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
    16.  
    17.         [return: MarshalAs(UnmanagedType.Bool)]
    18.         [DllImport("user32.dll", SetLastError = true)]
    19.         static extern bool PostMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
    20.  
    21.         [DllImport("user32.dll", CharSet = CharSet.Auto)]
    22.         static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);
    23.  
    24.         [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
    25.         static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount);
    26.  
    27.         #endregion
    và các hằng số thông điệp
    Visual C# Code:
    1.         #region // delegate , constant
    2.         private delegate bool EnumedWindow(IntPtr hlwd, ArrayList l);
    3.  
    4.         const int WM_COMMAND = 0x0111;
    5.         const int WM_KEYDOWN = 0x0100;
    6.         const int WM_KEYUP = 0x0101;
    7.         const int LVM_FIRST = 0x1000;
    8.         const int LVM_GETITEMCOUNT = LVM_FIRST + 4;
    9.         #endregion

    hãy chuẩn bị 1 số thứ lặt vặt đã
    1.tạo Global hotkey cho chương trình (ta chọn nút F6)
    Visual C# Code:
    1.         #region  // set hotkey , destroy hotkey
    2.         private void Form1_Load(object sender, EventArgs e)
    3.         {
    4.             RegisterHotKey(this.Handle, this.GetHashCode(), 0, (int)Keys.F6);
    5.         }
    6.  
    7.         private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    8.         {
    9.             UnregisterHotKey(this.Handle, this.GetHashCode());// hủy hotkey khi đóng chương trình
    10.         }
    11.         protected override void WndProc(ref Message m)
    12.         {
    13.             int WM_HOTKEY = 0x0312;
    14.             if (m.Msg == WM_HOTKEY)
    15.             {
    16.                 AUTOTUNNEL();// hàm này sẽ dc định nghĩa sau
    17.                 return;
    18.             }
    19.             base.WndProc(ref m);
    20.         }
    21.         #endregion

    2.Ẩn chương trình xuống System tray khi cần thiết .cái này đơn giản rồi chắc ko cần ghi thêm
    Bây giờ là việc chính :

    đầu tiên muốn auto tunnel dc thì phải biết dc Handle của cửa sổ ListView chứa danh sách người chơi trong room .Bằng thực nghiệm ta biết rằng nó là cửa sổ con của cửa sổ chính Garena LAN Game , nó có ClassName là WTL_LISTVIEW và xếp thứ 2 trong số các cửa sổ con có ClassName là WTL_LISTVIEW
    vào việc thôi
    Visual C# Code:
    1.         private IntPtr ListViewPlayerHandle()
    2.         {
    3.             IntPtr lv = IntPtr.Zero;
    4.             IntPtr room = FindWindow("SkinDialog", "Garena LAN Game");
    5.             ArrayList l = new ArrayList();
    6.             EnumChildWindows(room, AddHandleToList, l);
    7.             // chạy xong hàm EnumChildWindows thì arraylist l đã dc add tất cả cửa sổ con ,cháu của
    8.             // cửa sổ lớn Garena LAN Game
    9.             StringBuilder sb;
    10.             int indez = 0;
    11.             foreach (object o in l)
    12.             {
    13.                 sb = new StringBuilder(300);
    14.                 GetClassName((IntPtr)o, sb, sb.Capacity);
    15.                 if (sb.ToString() == "WTL_LISTVIEW")
    16.                 {
    17.                     indez++;
    18.                     if (indez ==2)
    19.                     {
    20.                         lv = (IntPtr)o;
    21.                         break;
    22.                     }
    23.                 }
    24.             }
    25.             return lv;
    26.         }
    27.         private static bool AddHandleToList(IntPtr _Handle, ArrayList l)
    28.         {
    29.             l.Add(_Handle);
    30.             return true;
    31.         }
    èo sao gọi đến phương thức AddHandleToList mà ko truyền tham số và cũng chả có dấu () luôn ?
    bạn nào thấy ngạc nhiên thì hãy xem các bài viết về Delegate trong diễn đàn này nhé
    và bây giờ là khúc gay cấn nhất : định nghĩa hàm AUTOTUNNEL()
    khi đã có dc Handle của ListView Player ra đếm số người trong room đó đã
    Visual C# Code:
    1.    IntPtr lvPlayer = ListViewPlayerHandle();
    2.    IntPtr count = SendMessage(lvPlayer, LVM_GETITEMCOUNT, IntPtr.Zero, IntPtr.Zero);
    ta cần Select người chơi đầu tiên trong ListView để tiến hành Tunnel
    vì ko muốn chiếm chuột nên cần sử dụng phím tắt . thật may ListView chấp nhận phím tắt Ctrl +Home để nhảy lên Select người chơi đầu tiên . và ta dùng hàm PostMessage để giả lập bàn phím gửi đến ListView
    Visual C# Code:
    1.           PostMessage(lvPlayer, WM_KEYDOWN, (int)Keys.Control, 0);
    2.           PostMessage(lvPlayer, WM_KEYDOWN, (int)Keys.Home, 0);
    3.           PostMessage(lvPlayer, WM_KEYUP, (int)Keys.Home, 0);
    4.           PostMessage(lvPlayer, WM_KEYUP, (int)Keys.Control, 0);
    khi Tunnel xong người chơi đó thì cần nhảy Select qua người tiếp theo . và ta tiếp tục dùng PostMessage để giả lập phím arrow Down
    Visual C# Code:
    1.           PostMessage(lvPlayer, WM_KEYDOWN, (int)Keys.Down, 0);
    2.           PostMessage(lvPlayer, WM_KEYUP, (int)Keys.Down, 0);
    cuối cùng là câu lệnh gửi thông điệp Tunnel cho Garena
    Visual C# Code:
    1.           PostMessage(lvPlayer, WM_COMMAND, 5009, 0);
    ủa sao có số 5009 vậy ? ah đêm qua mình nằm mơ thấy nó nên hôm nay viết vào ai dè lại là gửi lệnh Tunnel cho Garena . Hên ghê
    Lưu ý : 1 ngày đẹp trời nào đó Nhân viên Garena bất chợt thay đổi mã số ko còn là 5009 nữa thì bạn vào đây để biết cách tìm mã số mới
    http://diendan.congdongcviet.com/showthread.php?t=45272&page=3
    và đây là nguyên hàm AUTOTUNNEL()
    Visual C# Code:
    1.         private void AUTOTUNNEL()
    2.         {
    3.             IntPtr room = FindWindow("SkinDialog", "Garena LAN Game");
    4.             if (room == IntPtr.Zero)
    5.             {
    6.                 MessageBox.Show("chua mo garena");
    7.             }
    8.             else
    9.             {
    10.                 IntPtr lvPlayer = ListViewPlayerHandle();
    11.                 IntPtr count = SendMessage(lvPlayer, LVM_GETITEMCOUNT, IntPtr.Zero, IntPtr.Zero);
    12.                 if ((int)count<2)
    13.                 {
    14.                     MessageBox.Show("co thay ai dau ma tunnel");
    15.                 }
    16.                 else
    17.                 {
    18.                     DateTime begin = DateTime.Now;
    19.                     PostMessage(lvPlayer, WM_KEYDOWN, (int)Keys.Control, 0);
    20.                     PostMessage(lvPlayer, WM_KEYDOWN, (int)Keys.Home, 0);
    21.                     PostMessage(lvPlayer, WM_KEYUP, (int)Keys.Home, 0);
    22.                     PostMessage(lvPlayer, WM_KEYUP, (int)Keys.Control, 0);
    23.                     Thread.Sleep(50);
    24.                     for (int i = 1; i < (int)count; i++)
    25.                     {
    26.                         PostMessage(lvPlayer, WM_KEYDOWN, (int)Keys.Down, 0);
    27.                         PostMessage(lvPlayer, WM_KEYUP, (int)Keys.Down, 0);
    28.                         PostMessage(lvPlayer, WM_COMMAND, 5009, 0);
    29.                         Thread.Sleep(25);
    30.                     }
    31.                     double total = DateTime.Now.Subtract(begin).TotalSeconds;
    32.                     string total2 = total.ToString().Substring(0, 3);
    33.                     string kq = string.Format("Vừa mới Tunnel {0} người trong {1} giây", count, total2);
    34.                     truyenTextIconTray(kq);
    35.                 }
    36.             }
    37.            
    38.         }
    Thêm tí muối
    Visual C# Code:
    1.         private void truyenTextIconTray(string str)
    2.         {
    3.             notifyIcon1.BalloonTipText = str;
    4.             notifyIcon1.ShowBalloonTip(200);
    5.         }
    Hãy nhớ rằng vì chúng ta gọi hàm PostMessage nên chương trình vẫn làm việc khi chúng ta đang Focus cửa sổ khác và Garena LAN Game đang Minimized
    HẾT

  2. #2
    Ngày gia nhập
    03 2009
    Bài viết
    128

    thank nhiều nhé, cái này mình đang bí chứ auto join mình làm được rồi, bạn chỉ cần tải garenamaster về lấy cái dll của nó inject vào process garena_room.exe là sẽ có auto join

  3. #3
    Ngày gia nhập
    08 2011
    Bài viết
    38

    Bạn chủ topic cho mình hởi cái này.

    Mình tạo 1 class là Win32 nội dung như sau :

    Visual C# Code:
    1. using System;
    2. using System.Collections.Generic;
    3. using System.ComponentModel;
    4. using System.Data;
    5. using System.Drawing;
    6. using System.Text;
    7. using System.Windows.Forms;
    8. using System.Runtime.InteropServices;
    9.  
    10. namespace Help_Gamer
    11. {
    12.     class Win32
    13.     {
    14.      
    15.         #region // API Funtion
    16.  
    17.         [DllImport("user32.dll", SetLastError = true)]
    18.         [return: MarshalAs(UnmanagedType.Bool)]
    19.         static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vk);
    20.  
    21.         [DllImport("user32.dll")]
    22.         private static extern bool UnregisterHotKey(IntPtr hWnd, int id);
    23.  
    24.         [DllImport("user32")]
    25.         [return: MarshalAs(UnmanagedType.Bool)]
    26.         private static extern bool EnumChildWindows(IntPtr window, EnumedWindow callback, ArrayList lParam);
    27.  
    28.         [DllImport("user32.dll", SetLastError = true)]
    29.         static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
    30.  
    31.         [return: MarshalAs(UnmanagedType.Bool)]
    32.         [DllImport("user32.dll", SetLastError = true)]
    33.         static extern bool PostMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
    34.  
    35.         [DllImport("user32.dll", CharSet = CharSet.Auto)]
    36.         static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);
    37.  
    38.         [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
    39.         static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount);
    40.  
    41.         #endregion
    42.  
    43.        
    44.  
    45.     }
    46. }

    Khi mình chạy form nó hiện thông báo lỗi như sau:

    Lỗi thứ I:
    Code:
    Error	1	The type or namespace name 'EnumedWindow' could not be found (are you missing a using directive or an assembly reference?)	E:\Source code\C#\Help Gamer\Help Gamer\Help Gamer\Win32.cs	59	68	Help Gamer
    Lỗi thứ II:
    Code:
    Error	2	The type or namespace name 'ArrayList' could not be found (are you missing a using directive or an assembly reference?)	E:\Source code\C#\Help Gamer\Help Gamer\Help Gamer\Win32.cs	59	91	Help Gamer

    Chủ topic cho mình hỏi cách khắc phục và cách sử dụng BBcode visual c# trong text editor

  4. #4
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,750

    Copy thì phải copy cho đầy đủ chứ bạn? Thế bạn đã học lập trình ngày nào chưa?
    Email: admin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667 (Office: 04 6329 2380)
    Yahoo & Skype: dreaminess_world (Vui lòng chỉ rõ mục đích ngay khi liên hệ, cảm ơn!)

    Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó. Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp!

  5. #5
    Ngày gia nhập
    08 2011
    Bài viết
    38

    Trích dẫn Nguyên bản được gửi bởi Kevin Hoang Xem bài viết
    Copy thì phải copy cho đầy đủ chứ bạn? Thế bạn đã học lập trình ngày nào chưa?
    Cám ơn bạn đã quan tâm. Mình cũng được học 1 số ngôn ngữ lập trình như C, C++, PHP (cũng tàm tạm thôi).

    Lúc đọc commnent của bạn mình tưởng mình thiếu mấy cái namespace nhưng mình cũng đã copy mấy cái namespace đó dzo nhưng cũng báo lỗi như trên. Mình nghĩ do mình chưa copy hết nhưng code của chủ topic nên báo lỗi như vậy ( do thói quen lập trình của mình là làm tới đâu test tới đó nên khi tạo được file win32.cs là mình test nó liền nên ko copy hết code của chủ topic).

    Mình chưa học c# bao giờ. Mình đang tìm hiểu nó. Lí do mình học C# là như sau mình rất thích chơi dota. Mình muốn xài hotkey nhưng mình down bản hotkey nào về cũng có virus. Lúc này mình mới tìm hiểu c# để tự viết 1 chương trình hotkey. Mình muốn dựa vào bài viết của bạn doveandrose để viết chương trình này.

    Mà chương trình của mình cũng ko cần cái

    Visual C# Code:
    1. [DllImport("user32")]
    2.         [return: MarshalAs(UnmanagedType.Bool)]
    3.         private static extern bool EnumChildWindows(IntPtr window, EnumedWindow callback, ArrayList lParam);

    Vì mình ko cần lấy các của sổ con. Vì của sổ mình cần lấy là Warcarft III nên mình xóa đoạn code trên rồi

  6. #6
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,750

    Mặc định Thực hành API : Viết Auto Tunnel Người chơi trong room Garena Plus

    Không cần thì xóa đi, nhưng nếu đưa vào thì phải copy đầy đủ. Không quan trọng là bạn có học C# hay chưa, nhưng nếu bạn có căn bản một chút bạn sẽ biết cần phải làm như thế nào. 'Được học gì' và 'học được gì' là 2 vấn đề đối lập với nhau, nếu bạn đã 'học được C/C++' thì C# chỉ là 'vấn đề cơ bản' mà thôi! (Bạn có lẽ cũng không tin điều này đâu nhỉ?)
    Email: admin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667 (Office: 04 6329 2380)
    Yahoo & Skype: dreaminess_world (Vui lòng chỉ rõ mục đích ngay khi liên hệ, cảm ơn!)

    Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó. Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp!

  7. #7
    Ngày gia nhập
    06 2007
    Nơi ở
    C:\WINDOWS\system32\dllcache\
    Bài viết
    3,007

    C# ko hợp với cái này đâu bạn à
    Tư tưởng C# ko phải để dành cho 3 cái này
    3 cái này nên làm trong C/C++ thôi

    Thật tình mà nói thì đối với win32 thì cái này thuộc dạng basic thôi, chả có gì đặc biệt cả
    ^_,^

    Tổng hợp các câu chuyện hài hước vui nhộn, sử dụng Speech Synthesis để đọc : https://www.youtube.com/channel/UCLk...Tjrg/playlists


    Bùi Tấn Quang

  8. #8
    Ngày gia nhập
    03 2013
    Bài viết
    1

    cho mình hỏi biến int WM_HOTKEY

    Visual C# Code:
    1. int WM_HOTKEY = 0x0312;
    2.  if (m.Msg == WM_HOTKEY)

    có phải biến WM_HOTKEY để bắt sự kiên khi nhấn F6 ko và 0x0312 là mã của F6 ko

    Nếu mai môt mình muốn làm phím A chẳng hạn thì làm cách nào để biết mã của phím A, có hàm nào covert ko ?

  9. #9
    Ngày gia nhập
    07 2009
    Bài viết
    22

    Trích dẫn Nguyên bản được gửi bởi lapvuabai Xem bài viết
    cho mình hỏi biến int WM_HOTKEY

    Visual C# Code:
    1. int WM_HOTKEY = 0x0312;
    2.  if (m.Msg == WM_HOTKEY)

    có phải biến WM_HOTKEY để bắt sự kiên khi nhấn F6 ko và 0x0312 là mã của F6 ko

    Nếu mai môt mình muốn làm phím A chẳng hạn thì làm cách nào để biết mã của phím A, có hàm nào covert ko ?
    WM_HOTKEY là định danh để trong hàm callback biết HotKey đc sử dụng thôi bạn

  10. #10
    Ngày gia nhập
    04 2013
    Bài viết
    1

    hàng ăn cắp mà cũng bày đặt viết TUT
    nực cười

    Bố decomlie cái tool GS = vb.net ra, xong chuyển qua C #
    Cần mình ném luôn cái auto joint không thớt

    Diễn đàn C lớn như vậy ở đâu chui ra thể loại gì thế này

Các đề tài tương tự

  1. Garena Support - Tự động vào room , tunnel trên garena , tự động cảnh báo trong war , hot key war3 ....
    Gửi bởi hotrogarenavn trong diễn đàn Sản phẩm phần mềm của bạn
    Trả lời: 4
    Bài viết cuối: 25-03-2015, 07:34 PM
  2. Auto Join Garena (Auto Joiner) - Tự động vào Room, không cần cắm chuột
    Gửi bởi hieubm trong diễn đàn Sản phẩm phần mềm của bạn
    Trả lời: 120
    Bài viết cuối: 13-03-2014, 11:01 PM
  3. auto gg | auto join Garena - topic đầu tiên đạt 1 triệu view
    Gửi bởi hieubm trong diễn đàn Giải trí - Thư giãn
    Trả lời: 18
    Bài viết cuối: 10-09-2011, 06:08 PM
  4. Auto Join Room Garena Pro. Version 27 May 2011
    Gửi bởi yenvananh trong diễn đàn Sản phẩm phần mềm của bạn
    Trả lời: 0
    Bài viết cuối: 27-05-2011, 03:05 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn