У меня даже в
2018 64-bit заработало.
В принципе, если нет желания заморачиваться с тулкитами, это самое то. Только надо кое какие вещи допилить для большей надёжности:
1. Все вызовы CLFN организованы в UI-потоке (оранжевый цвет). Большинство функций WinAPI реентерантны (около 90%) и те, что используются в примере, точно. Думаю, не нужно объяснять, чем чревато параллельное выполнение несвязанных частей кода в UI-потоке. Потому CLFN'ы нужно переключить в Any thread (жёлтый).
2. Все хэндлы окон (HWND) заданы как U32. Это верно только для 32-разрядной среды выполнения, т.к. указатель в ней имеет размер в 4 байта. Для 64-разрядной среды размер указателя - 8 байтов.
typedef void *PVOID;
typedef PVOID HANDLE;
typedef HANDLE HWND;
Так что следует установить Data Type как (Un)signed Pointer-sized Integer (лучше-таки как Signed, т.к. некоторые функции могут принимать вместо хэндла зарезервированные отрицательные параметры).
Почему работает в
64-bit - часто у недавно запущенного/бездействующего/мало загруженного приложения достаточно памяти, чтобы адреса выделяемых ячеек не выходили за границу 4-х байтов. В этом случае адрес хэндла вполне помещается в 4-байтовое число без потери данных. При длительной работе или большом количестве операций память может заполниться и программа начнёт выделять адреса за границей 4-х байтов. В таком случае они уже не будут помещаться в 4 байта. Точнее, число U64 обрежется и в U32 попадёт младшая часть числа. В результате получится неверный хэндл. Понятно, что в таком случае не удастся выполнить никаких операций с окном - хотя критической ошибки не случится, окно или не создастся, или не будет управляться, или не закроется.
А
пример ниже довольно интересный, в том плане, что оказывается была в
функция для встраивания одного окна в другое. Почему была - потому что в последних версиях не работает по какой-то причине (заменил deprecated-узлы на новые - толку ноль). В
8.5 работает, как ни странно, только графика "жертвы" подглючивает местами.