Josh_0101 Ответов: 1

Невозможно получить hwnd кнопки внутри диалогового окна вкладки - MFC C++


Я работаю над тем, чтобы получить hwnd с помощью курсора мыши, указывающего на кнопку. Проблема в том, что я не могу дотянуться до кнопки, которая находится внутри диалогового окна вкладки.

Я использовал Spy++, чтобы получить иерархию, есть 3 слоя, чтобы добраться до нужной кнопки. Главное окно (#32770) - Таб1 (#32770) - Btn1 (Кнопка) Это показывает, что Вкладке tab1 не воспитан, чтобы Это systabcontrol32 и иметь одно и то же родительское окно с Это systabcontrol32.

Вместо того чтобы получить Btn1, Я всегда получаю Это systabcontrol32, который имеет тот же уровень иерархии, что и Вкладке tab1, означает, что я могу достичь только Это systabcontrol32 но не тот Вкладке tab1.

Если бы я использовал WindowFromPoint и наведи на меня мышку Btn1, Я получу Это systabcontrol32; с помощью ChildWindowFromPoint, Я получу 0 в качестве возвращаемого значения; используя RealChildWindowFromPoint, Я получу Это systabcontrol32.

Шпион++ только может обнаружить Главное окно, Это systabcontrol32 и Вкладке tab1 но он не может обнаружить Btn1. Я могу получить все дочерние окна с помощью EnumChildWindow но ...WindowFromPoint функция все еще не может найти Вкладке tab1 и эти детские окна. Кроме того, Spy++ способен выделить Btn1 после того, как я "выделю" его, но если я использую функцию "Найти окно" в Spy++, Btn1 не может быть обнаружен.

Это ли причина в том, что перекрытие родственных окон? Похоже Это systabcontrol32 это продолжайте блокировать ...WindowFromPoint функция для получения дочерних окон. Кто-нибудь знает, в чем причина этой ситуации и как ее решить? Пожалуйста помочь..Спасибо

Что я уже пробовал:

#include<windows.h>
#include<iostream>
using namespace std;

int main() {

		POINT pt;
		Sleep(3000);
		GetCursorPos(&pt);

		HWND hWnd = WindowFromPoint(pt);
		HWND hWndParent = GetParent(hWnd);
		MapWindowPoints(NULL, hWndParent, &pt, 1);
		HWND hWndChild = RealChildWindowFromPoint(hWndParent,pt);

		char class_name[100];
		char title[100];
		GetClassNameA(hWndChild,class_name, sizeof(class_name));
		GetWindowTextA(hWndChild,title,sizeof(title));
		cout <<"Window name : "<<title<<endl;
		cout <<"Class name  : "<<class_name<<endl;
		cout <<"hwnd        : "<<hWndChild<<endl<<endl;

		system("PAUSE");
		return 0;

}

Shao Voon Wong

Из вашего фрагмента кода это выглядит как не код MFC. Пожалуйста, опубликуйте фактический проблемный код, потому что приложение WinAPI запускается в WinMain (), а не main().

Josh_0101

Я делаю это как простое кодирование на C++ и тестирую его в консоли. Это небольшая часть приложения MFC, которую я отлаживаю.

Shao Voon Wong

Вы пытаетесь получить HWnd из других приложений, не написанных вами? Даже если вы получили их HWnd, вы не можете отправить им SendMessage (), потому что в современных операционных системах Windows MS запрещает межпроцессную связь через отправку сообщения WinAPI из-за проблем безопасности.

Josh_0101

Я могу получить некоторые hwnd из приложения, но я обнаружил, что некоторые элементы управления внутри диалогового окна вкладки не могут быть получены. Эти объяснения основаны на моем понимании из Spy++. Возможно, чтобы получить отсюда какое-то представление о том, что является первопричиной и есть ли для нее какое-то решение.

Shao Voon Wong

Почему вы пытаетесь получить HWNDs от Spy++? Что вы собираетесь делать с hwnd?

Josh_0101

Я использую Spy++ для проверки иерархии окна, чтобы решить, какую функцию окна следует использовать. Цель состоит в том, чтобы получить правильный заголовок окна, когда курсор мыши указывает на него.

Shao Voon Wong

Вы просто пытаетесь украсть конфиденциальную информацию, такую как биткойн-кошелек, пароль, серийный номер или номера кредитных карт. Если даже Spy++ не может видеть HWND, вы можете забыть о получении HWND, потому что элемент управления может даже не реализовываться с помощью HWND.

Josh_0101

Похоже, вы неправильно поняли, о чем я спрашиваю. Я могу получить все HWND, обратившись к иерархии, показанной в Spy++. Эти HWND не скрыты, и я могу получить всю информацию, просто функция WindowFromPoint не смогла до них добраться. К сожалению, я новичок в этом деле, и для меня это будет долгий путь, если я захочу использовать эти знания для кражи конфиденциальной информации. Спасибо за предложение, но оно неприменимо.

1 Ответов

Рейтинг:
2

Shao Voon Wong

МФЦ CButton наследует от CWnd базовый класс. CWnd и его производный класс имеет это GetSafeHwnd() для возврата HWND. Если у вас есть CButton объект, назовем его GetSafeHwnd() функция. Если вы хотите захватить ввод мыши, подкласс CButton класс с вашим собственным классом для обработки WM_MOUSEMOVE сообщение или другие сообщения мыши самостоятельно. Ниже приведена полезная статья о подклассах Криса Маундера, основателя CodeProject, на которую вы можете сослаться о том, как это сделать. Этой статье уже 18 лет, но она не устарела: я до сих пор обращаюсь к ней каждый год при написании кода MFC.

Создавайте свои собственные элементы управления - искусство подклассов[^]