Как использовать SendMessage для виртуального нажатия кнопки в другом приложении с помощью C# - PullRequest
0 голосов
/ 11 июля 2020

У меня есть идея программы для управления другой программой, я хочу нажать кнопку в этой программе, но я пробую много способов, но не все работает. Я использую 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#, я думаю, что он сработает в моем случае, может ли кто-нибудь помочь меня. Спасибо заранее!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...