Я новичок в WINAPI и выяснил, как отправить сообщение в другую программу.Однако программа, которую я использую, я бы хотела, чтобы она нажимала на конкретную кнопку.Из того, что я узнал из просмотра Spy ++, дескрипторы окон меняются для программ каждый раз, когда они перезагружаются, как и дескрипторы для их элементов управления.Идентификатор элемента управления остается прежним.После двух дней попыток выяснить это я здесь.
в SendMesssageA, если я укажу текущий дескриптор как видимый для Spy ++, использую его и запускаю код, он работает нормально и нажимает кнопку на моем внешнем приложении.Я пытаюсь использовать GetDlgItem, поскольку я прочитал, что я могу получить дескриптор для элемента управления (дочернее окно), используя его.Однако я делаю что-то не так, поскольку независимо от того, что я делаю, он возвращает 0 или «ноль».
Как я могу заставить GetDlgItem вернуть дескриптор дочернего элемента управления, чтобы я мог использовать его для отправки сообщения, чтобы щелкнуть этот элемент управления ввнешнее приложение?
Спасибо за вашу помощь, ввод заранее.
[DllImport("User32.dll")]
static extern bool SetForegroundWindow(IntPtr hWnd);
Process[] myProcess = Process.GetProcessesByName("program name here");
[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern int SendMessageA(IntPtr hwnd, int wMsg, int wParam, uint lParam);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr GetDlgItem(int hwnd, int childID);
public const int WM_LBUTTONDOWN = 0x0201;
public const int WM_LBUTTONUP = 0x0202;
public void SendClick()
{
IntPtr hwnd = myProcess[0].MainWindowHandle;
SetForegroundWindow(hwnd);
int intCID = 1389;
IntPtr ptrTest = GetDlgItem(hwnd, intCID);
SendKeys.SendWait(" ");
Thread.Sleep(1000);
SendKeys.SendWait("various text to be sent here");
Thread.Sleep(1000);
SendKeys.SendWait("{ENTER}");
Thread.Sleep(1000);
SendMessageA(ptrTest, WM_LBUTTONDOWN, WM_LBUTTONDOWN, 0);
}