Send a button click on another program C#
thật sự thì em không biết đặt tiêu đề tiếng Việt như thế nào cho nó phù hợp nên em mới đặt như vậy.
Chuyện là em đnag viết một cái tool nhỏ, ứng dụng của nó là khi click vào một cái button bên đây thì nó sẽ mở một cái app khác (ở đây là em mở OpenVPN) và rồi sau đó sẽ ấn một button bên app OpenVPN.
và em đang bị kẹt ở chỗ là không tài nào send được cái sự kiện click chuột qua cái app bên kia. Tức là đã bật openVPN client lên rồi, nhưng lại không có chuyện gì xảy ra sau đó .
control ID của button Disconnect trong spy++:
và đây là đoạn code của em
private const int VM_COMMAND = 0x0111;
private const int BN_CLICKED = 0;
private const int ButtonId = 0xA3;
private const string fn = @"C:Program FilesOpenVPNinopenvpn-gui.exe";
[DllImport("user32.dll")]
static extern IntPtr GetDlgItem(IntPtr hWnd, int nIDDlgItem);
[DllImport("user32.dll")]
static extern IntPtr SendMessage(IntPtr hWnd, int Msg, int wParam, IntPtr lParam);
private static ProcessModule GetModule(Process p)
{
ProcessModule pm = null;
try
{
pm = p.MainModule;
}
catch
{
return null;
}
return pm;
}
public static void openApp()
{
IntPtr handle = IntPtr.Zero;
Process[] localAll = Process.GetProcesses();
IntPtr hWndButton = GetDlgItem(handle, ButtonId);
foreach(Process p in localAll)
{
if(p.MainWindowHandle != IntPtr.Zero)
{
ProcessModule pm = GetModule(p);
if(pm != null && p.MainModule.FileName == fn)
{
handle = p.MainWindowHandle;
break;
}
}
}
if(handle == IntPtr.Zero)
{
MessageBox.Show("Not Found.");
return;
}
int wParam = (BN_CLICKED << 16) | (ButtonId & 0xffff);
SendMessage(handle, VM_COMMAND, wParam, hWndButton);
}
Không biết code em sai chỗ nào và có cách nào khác ngoài dùng SendMessage
k ạ ? mong cách thánh chỉ giáo.
Đây là 1 đoạn chương trình mình dung để click vào nút “Thông tin” của Unikey 4.0 RC2. Bạn có thể tham khảo
Kết quả :
Cho mình hỏi cái
0x00F5
là giá trị gì vậy ? tại lúc đầu cứ tưởng nó là control ID cho nên cứ đi mò trong control ID0x00F5 là giá trị của tin nhắn BM_CLICK. Gửi tin nhắn (Message) này đến button nào thì sự kiện click xảy ra nếu button đó khả dụng.
Hi. Cho mình hỏi chút. Mình có dùng lại ví dụ trên Unikey thì click được nhưng trên một số chương trình khác có tên class như WindowsForms10.BUTTON.app. …
Thì khi SendMessage lại không có hiện tượng gì xảy ra cả :((
Có ai gặp issue này không?
Cái này là vì WinForm, WPF và UWP dùng event riêng, không dùng chung Window Message với các app viết bằng Win32 Controls nhé.
Bạn có thể dùng thử Spy++ của visual studio xem thử event logging
(Mình cũng không chắc nó hoạt động trên mấy app C#)
Vậy làm thế nào bạn?
Mình có dùng Spy++ mò mãi mà chưa được
1 cách làm mới hiện nay là dùng WinAppDriver cho Selenium, giống như dùng Selenium để làm automation testing.
GitHub
Microsoft/WinAppDriver
WinAppDriver - Windows Application Driver