Окна верхнего уровня используют слот идентификатора в качестве HMENU (точнее, дочерние окна используют слот HMENU в качестве идентификатора элемента управления);поэтому дочерние окна не могут иметь HMENU, а HWND верхнего уровня не могут иметь идентификаторы.
Вероятно, случается, что когда вы опускаете WS_CHILD, окна воспринимают идентификатор как HMENU, и, поскольку он недопустимHMENU, не удается вызвать CreateWindow.
Вообще говоря, идентификатор имеет смысл только в контексте известного контейнера.Таким образом, в контексте диалога идентификаторы имеют смысл, потому что диалоговое окно владеет элементами управления в нем, и автор может убедиться, что в нем нет дубликатов - и GetDlgItem сделает что-то разумное.
Но на рабочем столе каждое окноиз другого источника, поэтому не было бы никакого способа обеспечить уникальные идентификаторы, поэтому концепция в любом случае не имела бы смысла.
Ваш лучший выбор, возможно, состоит в том, чтобы спасти сам HWND и использовать егонепосредственно при необходимости.
Следует помнить одну вещь: если вы не используете WS_CHILD, ваше новое окно на самом деле является дочерним по отношению к окну рабочего стола, но HWND принадлежит * .Вы проходите мимо, это не ребенок этого окна.Перечисление дочерних окон этого окна владельца не вернет ваше новое окно.
Рэймонд Чен (чей блог должен считаться обязательным для чтения всеми разработчиками Win32) имеет хорошее объяснение проблемы «родитель против владельца» здесь.