SendMessage và PostMessage không hoạt động c#

Em chào mọi người ạ.
Em có 1 đoạn code sau sử dụng pinvoke c#

[DllImport("user32.dll")]
public static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);
var resultDown = SendMessage(hwnd, WM_LBUTTONDOWN, (IntPtr)0x01, (IntPtr)((424 << 16) | 101));
var resultUp  = SendMessage(hwnd, WM_LBUTTONUP, IntPtr.Zero, (IntPtr)((424 << 16) | 101));

Em kiểm tra event bằng Spy++ thì trả được kết quả như sau

1

Sau đó e kiểm tra lại app thì không thấy button được click.
Mọi người cho e hỏi là e sai ở đâu ạ.
Em có tra 1 loạt google về SendMessage và PostMessage nhưng thử đi thử lại vẫn ko được ạ.
Em cám ơn mọi người ạ.

Tọa độ đúng chưa bạn? Tọa độ nó có trừ hao đi các viền xung quanh nữa đấy.
Cách bạn bạn làm vẫn chưa ổn đối với 1 nút không cố định khi thay đổi kích thước cửa sổ.
Bạn nên thực hiện bằng cách gửi trực tiếp đến nút bấm đó.
Theo các bước sau:

  1. Tìm 1 định danh của nút đó (Name, Text, Id, Class) thông qua Spy++ hoặc các chương trình tương tự.
  2. Dùng các hàm hỗ trợ liệt kê điều khiển (control) như EnumChildWindows để tìm nút bấm và lấy HWND. Bạn có thể tìm nó qua văn bản hiển thị (Text), tên (Name), lớp đăng kí (Class) thông qua hàm GetWindowText hoặc GetClassName,…
  3. Gửi lệnh trực tiếp đến nút bấm đó qua Send/PostMessage.

Danh sách các hàm hỗ trợ trong user32.dll:
https://docs.microsoft.com/en-us/windows/win32/api/winuser/

Mình đã từng làm, nhưng lâu quá nên quên nhiều. Cũng đã tìm cụ thể 1 nút bấm, rồi gửi các sự kiện hoặc thay đổi văn bản, hình dạng, thậm chí vẽ trên nó.

4 Likes

Em sử dụng hàm SendMessage để click trực tiếp vào hwnd của button thì đã chạy.
Nhưng khi e sử dụng Spy++ click thử để lấy tọa độ và sau đó chuyển hwnd thành app chính và click vào tọa độ của button thì ko được ạ.
Em thử Active app lên thì lại hoạt động đc với Visual studio nhưng như Paint lại không hoạt động ạ.
Em cám ơn ạ.

Những nguyên nhân có thể dẫn tới việc không được:

Sai toạ độ.
App chưa active.
App send có quyền thấp hơn app được send.
wParam, lParam không phù hợp.

5 Likes

Tọa độ em lấy từ Spy++ nên em ko biết nó có đúng hay ko.
Em chưa hiểu app send có quyền thấp hơn app đc send là như nào ạ, tại e vẫn thấy spy++ hiện lên event ạ

Ví dụ app send chạy quyền user thông thường nhưng app nhận chạy dưới quyền admin thì app nhận cũng sẽ không nhận được message.

Mình có thể thử chạy app send bằng quyền admin xem sao.

4 Likes

Vâng e cám ơn a, e đã thử lại thì vẫn ko được. Nên e đã chuyển hướng sang sử dụng mouse_event ạ. Em khồn biết liệu còn có lib nào có thể tạo ra các event keyboard và mouse mà ko bị chiếm đụng keyboad và mouse đang sử dụng không.
Em cám ơn a ạ.

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?