Найти окно, используя c ++ и модифицируя элементы управления - PullRequest
2 голосов
/ 16 февраля 2010

Я хотел бы использовать c ++ без mfc (и не clr), чтобы изменить текстовые поля и активировать кнопку на форме вне моего проекта. Я не знаю с чего начать. Я много искал, но могу найти информацию только для VB. Начальная точка поможет. Спасибо.

Я попробовал это, и это, похоже, не работает.

HWND fWindow = FindWindow(NULL ,(LPCWSTR)"title");

и я тоже попробовал это

HWND fWindow = FindWindow(NULL ,LPCWSTR("title"));

Я также пытался использовать LPTSTR вместо LPCWSTR, если это была сделка с Unicode.

Может быть, я не понимаю этого дерьма Microsoft LPCWSTR и LPTSTR.

Я тоже пытался

HWND fWindow = FindWindow(NULL,TEXT("title"));

и это не сработало. Я думаю, что Windows API просто сломан.

Я попробовал эту функцию в других программах ... Я использую xp, и я попытался перехватить калькулятор, окно проводника и что-то еще. Но я ничего не получил.

Вот какой-то точный код, который я использую, чтобы попытаться понять это.

HWND face = NULL;
face = FindWindow(NULL,TEXT("My Computer"));
LPSTR title = TEXT("");
GetWindowText(face,title,250);
if(face != NULL)
{
    MessageBox(NULL,title,TEXT("WOOP"),1);
}

лицо = ничего. title = ""

Имейте в виду, я не пытаюсь подключить проводник, я просто хочу выяснить, как заставить его работать.

Ответы [ 4 ]

2 голосов
/ 16 февраля 2010

Используйте spy ++ или winspector, чтобы увидеть фактический «текст» окна.

(Строго говоря, заголовок окна не обязательно должен соответствовать тексту окна. Особенно это касается "причудливых" окон, которые рисуют свой заголовок.)

Следующее работает нормально для меня (используя Calc.exe для проверки).

HWND hwnd = NULL;
hwnd = FindWindow(NULL,_T("Calculator"));
TCHAR title[251];
if(hwnd != NULL)
{
    GetWindowText(hwnd,title,250);
    MessageBox(NULL,title,_T("WOOP"),MB_OK);
}
else
    MessageBox(NULL,_T("No such window."),_T("OOPS"),MB_OK);

Редактировать: Вы должны были использовать _TEXT вместо TEXT.

1 голос
/ 16 февраля 2010

Один из способов сделать это - использовать FindWindow , чтобы получить дескриптор формы. Затем, если вы знаете кнопку и измените идентификаторы окна, вы можете использовать GetDlgItem , чтобы получить их дескрипторы окна. Если вы не знаете идентификаторы, вы можете использовать EnumChildWindows для проверки всех элементов управления в форме.

Если у вас есть дескрипторы окна для элементов управления, вы можете использовать SetWindowText для установки текста в элементе управления редактирования и отправить сообщение WM_COMMAND в окно формы с идентификатором кнопки в качестве значения команды, чтобы заставить форму думать что кнопка была нажата.

Есть много способов сделать это, если у вас есть правильные дескрипторы окна. Существуют проблемы безопасности, когда вы используете дескрипторы окна другого процесса, но если процесс не защищен, тогда межпроцессное использование дескрипторов окна просто работает. Для безопасного процесса вы не сможете узнать дескрипторы окна.

0 голосов
/ 16 февраля 2010

Если вы пытаетесь добиться больших успехов (и еще немного автоматизировать пользовательский интерфейс), вам стоит взглянуть на них подробнее:

0 голосов
/ 16 февраля 2010

Windows API предоставляет методы для этого. Они должны быть независимыми от MFC и CLR, так как они являются обычными win32. У меня был проект, который однажды получил доступ к полям формы аппликации из загруженной библиотеки DLL (не спрашивайте, почему).

Вы можете посмотреть здесь (Codeproject)

или здесь (мсдн)

Сначала вам нужно получить дескриптор процесса, к которому вы хотите получить доступ. Если у вас есть это, вы можете использовать GetDlgItem () (ищите в msdn), чтобы получить дескриптор нужного текстового поля.

С помощью этого дескриптора вы сможете изменить соответствующий элемент управления.

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