Trả lời mọi thắc mắc của bạn


Liệt kê những bài viết mới nhất

Bài viết mớiNgười viếtVào lúc
paltalk code
Sun Mar 06, 2016 1:28 am
vb ListView
Sun Mar 06, 2016 1:00 am
Find occurent of character in string nth
Sat Jan 16, 2016 10:48 pm
Send listbox items to textbox
Wed Jan 13, 2016 9:55 pm
[VB] Find word in listbox items
Wed Jan 13, 2016 7:55 pm
code cho hint2
Wed Jan 13, 2016 3:22 pm
[vb] Font RTB
Tue Dec 29, 2015 10:29 am
[vb] selected text RTB
Tue Dec 29, 2015 9:06 am
[vb] send unicode text
Tue Dec 29, 2015 9:03 am
[vb] format multi richtextbox
Tue Dec 29, 2015 9:01 am
Trang web tai cac bang sang che
Mon Dec 28, 2015 1:28 pm
[VB] Sử dụng resource của chính chương trình
Sat Dec 26, 2015 8:56 pm
[vb] Phân biệt class và Module
Thu Dec 24, 2015 2:39 pm
[VB] MY API and Functions declaration
Mon Dec 21, 2015 1:45 pm
[vb] Khai báo và sử dụng hàm Setforeground
Mon Dec 21, 2015 1:29 pm
[VB] Sử dụng hàm Sendmessage để gửi tiếng việt, và format richtextbox
Mon Dec 21, 2015 1:26 pm
[VB] Find menu context handle/ID by SPY++
Fri Dec 18, 2015 1:20 pm
[VB] Find menu context handle/ID - Vu Hai Ninh
Fri Dec 18, 2015 1:00 pm
[VB] Find menu context handle/ID
Fri Dec 18, 2015 12:54 pm
[VB] Sleep in VB program
Thu Dec 17, 2015 7:48 pm
[VB] CLose window if found
Wed Dec 16, 2015 7:07 pm
[VB] Không cho thay đổi kích cỡ form khi chạy
Wed Dec 16, 2015 3:28 pm
[VB] Không cho thay đổi text box khi chạy
Wed Dec 16, 2015 3:22 pm
[VB] Tìm cửa sổ và Button bằng FindWindow & FindWindowsEx
Wed Dec 16, 2015 3:16 pm
[VB] Xóa text mặc định của text box khi click
Wed Dec 16, 2015 3:12 pm


You are not connected. Please login or register

[VB] Find menu context handle/ID - Vu Hai Ninh

Go down  Message [Page 1 of 1]

HdAd

HdAd
Admin

Trong bài báo này tôi muốn giới thiệu tới các bạn cách sử dụng method SendMessage để gửi lệnh click đến một button nằm trên application khác. Kĩ thuật này cũng rất có khả năng edit và thao tác với những control khác như là label, textfield v.v... Để minh họa cho kĩ thuật trên, chúng ta sẽ viết một ví dụ nho nhỏ cho việc send message click button "=" trên application Calculator của Windown.
1. Xác định button và chức năng của button cần thực hiện.
Trên application Calculator, khi chúng ta ấn "2+2=", ta sẽ nhận được kết qủa hiện thị là 4. Sau đó mỗi khi click "=", kết qủa sẽ được tăng lên 2. Chúng ta sẽ tạo application để tự động click button "=". Chúng ta có thể xác định việc send message thành công hay không thông qua kết qủa hiện thị trên màn hình.
2. Xác định mã id của button "=".
Run windows Calculator, chạy Visual studio. Trong tool menu, click "Spy++".

[VB] Find menu context handle/ID - Vu Hai Ninh 827047a306463f92e97c555da26a8ca28e2b8409

Click vào icon "Find Window"

[VB] Find menu context handle/ID - Vu Hai Ninh A207b7675935c6a9bd9fe7b1ef47169dfe83c303

"Find Window" dialog sẽ được bật lên. Sau đó click vào "Finder Tool" icon.

[VB] Find menu context handle/ID - Vu Hai Ninh C9586f87536fc148288b7648fbadebb22f38cd19

Kéo con trỏ từ "Finder Tool" icon đến button "=" và thả chuột. "Find Window" dialog sẽ cung cấp thông tin về window handle và một vài thông tin khác của button "=". Click "OK", "Window Properties" window sẽ hiện ra gồm các tab: General, Styles, Windows, Class và Process.

[VB] Find menu context handle/ID - Vu Hai Ninh 784f0196681a77bb0e324a3ca5013e8125573a6b

Xác định gía trị của "Control Id" ở đây gía trị của nó là "00000079". Gía trị này là kiểu hexadecimal value. Khi sử dụng các function của Windows API, controls thường được xác định bởi control id.
3. write the application
Chúng ta cần sử dụng thư viện trong namespaces "System.Diagnostics" và "System.Runtime.InteropServices" .
Code:
const int WM_COMMAND = 0x0111;
// Command id của action Click
const int BN_CLICKED = 0;
// Control Id của button "="
const int ButtonId = 0x79;
//Path run exe của window Calculator
const string fn = @"C:\Windows\system32\calc.exe";
//Import method Get Dialog Item handle.
[DllImport("user32.dll")]
static extern IntPtr GetDlgItem(IntPtr hWnd, int nIDDlgItem);
//Import method SendMessage của window Api.
[DllImport("user32.dll")]
static extern IntPtr SendMessage(IntPtr hWnd, int Msg, int wParam, IntPtr lParam);
Xác định process module chạy application Calculator và Window Handle Id của nó.
Code:
IntPtr handle = IntPtr.Zero;
Process[] localAll = Process.GetProcesses();
foreach (Process p in localAll)
{
if (p.MainWindowHandle != IntPtr.Zero)
{
ProcessModule pm = GetModule(p);
if (pm != null && p.MainModule.FileName == fn)
handle = p.MainWindowHandle;
}
}
if (handle == IntPtr.Zero)
{
Console.WriteLine("Not found");
return;
}
Để click button "=", chúng ta sử dụng lệnh send message BN_CLICKED notification message đến Calculator window. Chúng ta cần sử dụng cả button id và window handle Id của button. Xác định Handle của button qua method GetDlgItem:
Code:
IntPtr hWndButton = GetDlgItem(handle, ButtonId);
Chúng ta sẽ send WM_COMMAND message. Hai parameter khác chúng ta cần xác định là wParam và lParam. Gía trị của chúng phụ thuộc vào việc chúng ta sử dụng loại message id nào. Trong trường hợp của WM_COMMAND message, wParam có nửa đầu chứa control id của button và nửa sau chứa command id ở đây là BN_CLICKED và lParam chính là Handle của button "=".
Code:
int wParam = (BN_CLICKED << 16) | (ButtonId & 0xffff);
SendMessage(handle, WM_COMMAND, wParam, hWndButton);
Để test app, run Calculator và click "2+2=". Sau đó chạy appplication. Mỗi khi chạy, kết qủa hiện thị trên Calculator sẽ tăng thêm 2.
Ví dụ trên đây hữu dụng khi các bạn có nhu cầu viết một application auto test hoặc chạy gầm application của một bên thứ 3.
Các bạn có thể download source code tại đây

https://hoidap.forumotion.com

Back to top  Message [Page 1 of 1]

Permissions in this forum:
You cannot reply to topics in this forum