1313
1414#include " ../logger.h"
1515
16+ #include " ../entry.h"
17+
1618#include < consoleapi.h>
1719#include < debugapi.h>
1820#include < future>
@@ -34,8 +36,7 @@ owner_draw_menu_info getBitmapFromOwnerDraw(MENUITEMINFOW *menuItemInfo,
3436 measureItem.itemID = menuItemInfo->wID ;
3537 measureItem.itemData = (ULONG_PTR)(menuItemInfo->dwItemData );
3638
37- SendMessageW (hwnd, WM_MEASUREITEM, 0 ,
38- reinterpret_cast <LPARAM>(&measureItem));
39+ SendMessageW (hwnd, WM_MEASUREITEM, 0 , reinterpret_cast <LPARAM>(&measureItem));
3940
4041 result.width = measureItem.itemWidth ;
4142 result.height = measureItem.itemHeight ;
@@ -70,7 +71,7 @@ owner_draw_menu_info getBitmapFromOwnerDraw(MENUITEMINFOW *menuItemInfo,
7071 drawItem.itemData = (ULONG_PTR)(menuItemInfo->dwItemData );
7172
7273 SendMessageW (hwnd, WM_DRAWITEM, 0 ,
73- reinterpret_cast <LPARAM>(&drawItem)); // 发送绘制消息
74+ reinterpret_cast <LPARAM>(&drawItem)); // 发送绘制消息
7475
7576 result.bitmap = CreateCompatibleBitmap (hdc, result.width , result.height );
7677 if (!result.bitmap ) {
@@ -130,7 +131,8 @@ menu menu::construct_with_hmenu(HMENU hMenu, HWND hWnd, bool is_top) {
130131 continue ;
131132 }
132133
133- if ((info.fType & MFT_OWNERDRAW) && config::current->context_menu .experimental_ownerdraw_support ) {
134+ if ((info.fType & MFT_OWNERDRAW) &&
135+ config::current->context_menu .experimental_ownerdraw_support ) {
134136 auto od = getBitmapFromOwnerDraw (&info, hWnd);
135137 if (od.width && od.height ) {
136138 item.owner_draw = od;
@@ -149,9 +151,17 @@ menu menu::construct_with_hmenu(HMENU hMenu, HWND hWnd, bool is_top) {
149151 if (info.hSubMenu ) {
150152 PostMessageW (hWnd, WM_INITMENUPOPUP,
151153 reinterpret_cast <WPARAM>(info.hSubMenu ), 0xFFFFFFFF );
152- item.submenu =
153- [data = menu::construct_with_hmenu (info.hSubMenu , hWnd, false )](
154- std::shared_ptr<menu_widget> mw) { mw->init_from_data (data); };
154+ auto main_thread_id = GetCurrentThreadId ();
155+ item.submenu = [=](std::shared_ptr<menu_widget> mw) {
156+ auto task = [&]() {
157+ mw->init_from_data (
158+ menu::construct_with_hmenu (info.hSubMenu , hWnd, false ));
159+ };
160+ if (main_thread_id == GetCurrentThreadId ())
161+ task ();
162+ else
163+ entry::main_window_loop_hook.add_task (task).wait ();
164+ };
155165 } else {
156166 item.action = [=]() mutable {
157167 menu_render::current.value ()->selected_menu = info.wID ;
0 commit comments