Hwnd c что это

Мы с Вами в этом шаге каснемся работы с окнами в Windows. У каждого окна есть уникальный идентификатор HWND. Этот идентификатор указывает на окно. Окна в Windows можно представить в виде дерева с корнем в DeskTop. Это легко увидеть запустив SPY (см. "Шаг 47 — Как пользоваться SPY").

Итак, как и у любого дерева, у дерева окон есть корень. Получить указатель на него можно функцией GetDesktopWindow(), которая вернет HWND корня в виде рабочего стола. Ага начало есть. Дальше как у того богатыря на картинке. Налево, направо или куда. От текущего HWND можно получить HWND либо ребенка, вот так GetWindow(hwnd, GW_CHILD), либо соседа вот так GetWindow(hwnd, GW_HWNDNEXT). И так далее. Дерево господа и алгоритм его обхода. Имея HWND можно получить заголовок окна GetWindowText. Ну пора. Вот код получения имен окон первого уровня. А вот результат работы у меня

Вообще могу подсказать HWND — это handle-обработка DDE — Dynamic Data Exchange Management Library (библиотека управления динамическим обменом данных) она содержится в директиве Ddeml.h из этого следует — typedef HANDLE HSZ. Если интересно узнать больше о DDE что будет полезно для лучшего понимания можно почитать данную инфу по ссылке ниже:http://citforum.ru/programming/32less/les21.shtml

В WinAPI такие идентификаторы реализованы в виде указателей неизвестно на что. Чтобы указатели на разные вещи не имели один и тот же тип (вроде void *) и не слишком запутывались между собой, в приведённом макросе для каждого отдельного типа хэндлов создаётся своя структура, указателем на которую и является хэндл.

Хорошо, ЕДИНСТВЕННАЯ причина, которую я спрашиваю, состоит в том, что я прочитал, что HWND является указателем, указатели изменяют исходное значение вместо создания дубликата, который хранится в этой ячейке памяти.

Но на самом деле он не действует как указатель, поэтому я говорю это, потому что, если бы у меня был оператор switch, Пример:

Но не следует забывать, что вы — новый программист на C ++ для Win32. Просто, найдя адрес памяти, затем захватывая содержимое внутри. Если адрес памяти не меняется и т. Д.

Я действительно не знаю, вы не возражаете против разработки? Благодарю.

Решение

Это, вероятно, не самый качественный ответ; предложения по улучшению приветствуются.

Вы правы, предполагая, что значение HWND никогда не изменяется, пока окно, на которое указывает HWND, остается живым.

Я предполагаю, что вы написали такой код:

и интересно, почему это не работает, но меняется

Это не собственность HWND. Ничего о сбое кода не происходит, потому что значение HWND изменилось. На самом деле, это не имеет ничего общего с Windows, и все, что связано с C.

Причина, по которой код не работает, заключается в том, что переменная button создается каждый раз, когда wndproc() функция называется. Видите, оконная процедура вызывается много раз, по одному разу для каждого сообщения, которое окно когда-либо получает во время выполнения вашей программы. Каждый раз вы получаете совершенно новый button переменная, и значение, которое button переменная в предыдущих вызовах теряется. Указатель все еще там, но он не хранится ни в одной переменной или в любом другом месте памяти! Окно не было разрушено. Вы просто не можете добраться до него обычными способами.

Что за static действительно, говорит C, что вы хотите, чтобы переменная оставалась без изменений при каждом вызове функции Так что теперь каждый вызов вашей оконной процедуры имеет одинаковый button и это значение указателя больше не теряется.

Это быстрое решение, и оно не очень хорошо масштабируется для очень больших проектов. В этих случаях структуры, содержащие дескрипторы окна, (возможно) глобальные переменные или использование GWLP_USERDATA или другой cbWndExtra байты лучше. Я думаю, что лучший вопрос заключается в том, почему это быстрое исправление продолжает предлагаться в качестве решения подобных проблем других людей здесь, в Переполнении стека (или, по крайней мере, почему это быстрое исправление не объясняется), но это то, о чем мы должны подумать, как сообщество.

Просто помните, что по умолчанию в большинстве языков (не только C и C ++!) Локальные переменные функции существуют только на время каждого отдельного вызова функции.

Другие решения

В коде, о котором идет речь, отсутствует много контекста (так что здесь просто догадайтесь вслепую), но если код находится в отдельной функции и переменной hButton является локальной переменной в этой функции, то вы должны помнить, что локальные переменные выходят из области видимости, когда функция, в которой они находятся, возвращает, и в следующий раз, когда вызывается функция, переменная является совершенно новой, уникальной для этого вызова и только этот звонок.

Также стоит отметить, что нестатические локальные переменные не инициализируются автоматически. Если вы явно не инициализируете такую ​​переменную, ее значение будет неопределенный и использование его любым способом (кроме как для его инициализации) приводит к неопределенное поведение.

Оцените статью
Много толка
Добавить комментарий