У меня есть идея программы для управления другой программой, я хочу нажать кнопку в этой программе, но я пробую много способов, но не все работает. Я использую C#, а программа, которую я пытаюсь контролировать, - это 64-битная программа, построенная на MF C C ++. Когда я просматривал Spy ++, я обнаружил что-то, как на картинке: Сообщения, когда я нажимаю кнопку
Что-то, что я пробовал:
const int BM_CLICK = 0X00F5;
[DllImport("user32.dll")]
static extern IntPtr SendMessage(IntPtr hWnd, int msg, int wParam, IntPtr lParam);
IntPrt button = (IntPtr)0x20484;
SendMessage(button, BM_CLICK, 0, IntPtr.Zero);
И я пробую много способов использовать SendMessage, например:
const int WM_COMMAND = 0X0111;
[DllImport("user32.dll")]
static extern IntPtr SendMessage(IntPtr hWnd, int msg, int wParam, IntPtr lParam);
IntPrt window = (IntPtr)0x805E0; //this is the handle of window that contain the button
IntPrt button = (IntPtr)0x20484; //this is button handle
SendMessage(window, WM_COMMAND, 0, button);
Или используя WM_LBUTTONDOWN, затем WM_LBUTTONUP, но это тоже не работает. Когда я просматривал Spy ++ и нашел этот код VB
Public Sub mouseclick2(hwnd As Long, x As Long, y As Long)
Dim hWnd2 As Long
Dim PID As Long
Dim TID As Long
Dim position As Long
Const WM_SETCURSOR = &H20
Const WM_NCHITTEST = &H84
Const WM_MOUSEMOVE = &H200
Const WM_LBUTTONDOWN = &H201
Const WM_LBUTTONUP = &H202
Const WM_MOUSEACTIVATE = &H21
TID = GetWindowThreadProcessId(hwnd, PID)
If PID = 0 Then Stop: Exit Sub
hWnd2 = GetWindow(hwnd, GW_OWNER)
If hWnd2 = 0 Then hWnd2 = MainForm 'this is only in my app, its the highest parent of the child
Call AttachThreadInput(TID, App.threadID, True)
Call SetActiveWindow(hWnd2)
Call SetActiveWindow(hwnd)
position = x * &H10000 + y
Call SendMessage(hwnd, WM_MOUSEACTIVATE, ByVal hWnd2, ByVal CLng(&H2010001))
Call SendMessage(hwnd, WM_SETCURSOR, ByVal CLng(0), ByVal CLng(&H2010001))
Call SendMessage(hwnd, WM_LBUTTONDOWN, ByVal CLng(1), ByVal position)
Call SendMessage(hwnd, WM_LBUTTONUP, ByVal CLng(0), ByVal position)
Call AttachThreadInput(TID, App.threadID, False)
End Sub
, я хочу сделать такой процесс в C#, я думаю, что он сработает в моем случае, может ли кто-нибудь помочь меня. Спасибо заранее!