From e0448197044db8a12a63500e415f23a8268edeed Mon Sep 17 00:00:00 2001 From: Nikola Metulev <711864+nmetulev@users.noreply.github.com> Date: Wed, 30 Jul 2025 16:32:48 -0700 Subject: [PATCH] Added qt and wxWidgets --- src/Frameworks.cpp | 53 +++++++++++++++++++++++++++++++++++++ src/resource/WinSpy.rc | 3 ++- src/resource/qt.bmp | Bin 0 -> 4246 bytes src/resource/resource.h | 2 ++ src/resource/wxwidgets.bmp | Bin 0 -> 3126 bytes 5 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 src/resource/qt.bmp create mode 100644 src/resource/wxwidgets.bmp diff --git a/src/Frameworks.cpp b/src/Frameworks.cpp index e31d148..fd6a7a9 100644 --- a/src/Frameworks.cpp +++ b/src/Frameworks.cpp @@ -66,11 +66,13 @@ INT_PTR CALLBACK FrameworksDlgProc(HWND hwnd, UINT iMsg, WPARAM, LPARAM) {L"DirectUI", MAKEINTRESOURCE(IDB_FRAMEWORK_DIRECTUI)}, {L"Electron", MAKEINTRESOURCE(IDB_FRAMEWORK_ELECTRON)}, {L"Flutter", MAKEINTRESOURCE(IDB_FRAMEWORK_FLUTTER)}, + {L"Qt", MAKEINTRESOURCE(IDB_FRAMEWORK_QT)}, {L"React Native", MAKEINTRESOURCE(IDB_FRAMEWORK_REACT_NATIVE)}, {L"System Xaml", MAKEINTRESOURCE(IDB_FRAMEWORK_WINUI)}, {L"WinUI", MAKEINTRESOURCE(IDB_FRAMEWORK_WINUI)}, {L"WPF", MAKEINTRESOURCE(IDB_FRAMEWORK_WPF)}, {L"WebView2", MAKEINTRESOURCE(IDB_FRAMEWORK_WEBVIEW2)}, + {L"wxWidgets", MAKEINTRESOURCE(IDB_FRAMEWORK_WXWIDGETS)}, {L"Unknown", IDI_APPLICATION} // Default icon for unmapped frameworks }; @@ -143,6 +145,17 @@ void UpdateFrameworksTab(HWND hwnd) {L"Chrome_RenderWidgetHostHWND", L"Chromium"}, {L"Chrome_WidgetWin_1", L"Chromium"}, {L"DirectUIHWND", L"DirectUI"}, + {L"QWidget", L"Qt"}, + {L"Qt5QWindowIcon", L"Qt"}, + {L"Qt6QWindowIcon", L"Qt"}, + {L"QMainWindow", L"Qt"}, + {L"QDialog", L"Qt"}, + {L"wxWindowMSW", L"wxWidgets"}, + {L"wxMDIFrameClassNR", L"wxWidgets"}, + {L"wxMDIChildFrameClassNR", L"wxWidgets"}, + {L"wxFrameClassNR", L"wxWidgets"}, + {L"wxDialogClassNR", L"wxWidgets"}, + {L"wxPanelClassNR", L"wxWidgets"}, {L"SysListView32", L"ComCtl32"}, {L"SysTreeView32", L"ComCtl32"}, {L"SysTabControl32", L"ComCtl32"}, @@ -173,6 +186,16 @@ void UpdateFrameworksTab(HWND hwnd) {L"flutter_windows.dll", L"Flutter (in process)"}, {L"libcef.dll", L"CEF (in process)"}, {L"electron_native_auth.node", L"Electron (in process)"}, + {L"qt5core.dll", L"Qt (in process)"}, + {L"qt6core.dll", L"Qt (in process)"}, + {L"qt5gui.dll", L"Qt (in process)"}, + {L"qt6gui.dll", L"Qt (in process)"}, + {L"qt5widgets.dll", L"Qt (in process)"}, + {L"qt6widgets.dll", L"Qt (in process)"}, + {L"wxmsw31u_core_vc_custom.dll", L"wxWidgets (in process)"}, + {L"wxmsw32u_core_vc_custom.dll", L"wxWidgets (in process)"}, + {L"wxbase31u_vc_custom.dll", L"wxWidgets (in process)"}, + {L"wxbase32u_vc_custom.dll", L"wxWidgets (in process)"}, }; for (auto &classPair : classMap) { @@ -285,6 +308,36 @@ void UpdateFrameworksTab(HWND hwnd) } } } + } else if (wcsstr(fileName, L"qt5core.dll") != nullptr || wcsstr(fileName, L"qt6core.dll") != nullptr) { + // Get Qt version information + DWORD versionInfoSize = GetFileVersionInfoSizeW(moduleFullPath, nullptr); + if (versionInfoSize > 0) { + std::unique_ptr versionInfo(new BYTE[versionInfoSize]); + if (GetFileVersionInfoW(moduleFullPath, 0, versionInfoSize, versionInfo.get())) { + VS_FIXEDFILEINFO *fileInfo; + UINT fileInfoSize; + if (VerQueryValueW(versionInfo.get(), L"\\", (LPVOID *)&fileInfo, &fileInfoSize)) { + wchar_t version[64]; + swprintf_s(version, ARRAYSIZE(version), L"Qt-%d.%d.%d.%d (in process)", HIWORD(fileInfo->dwFileVersionMS), LOWORD(fileInfo->dwFileVersionMS), HIWORD(fileInfo->dwFileVersionLS), LOWORD(fileInfo->dwFileVersionLS)); + AddListViewItem(hwndList, version, L"Qt"); + } + } + } + } else if (wcsstr(fileName, L"wxmsw") != nullptr && wcsstr(fileName, L"_core_") != nullptr) { + // Get wxWidgets version information + DWORD versionInfoSize = GetFileVersionInfoSizeW(moduleFullPath, nullptr); + if (versionInfoSize > 0) { + std::unique_ptr versionInfo(new BYTE[versionInfoSize]); + if (GetFileVersionInfoW(moduleFullPath, 0, versionInfoSize, versionInfo.get())) { + VS_FIXEDFILEINFO *fileInfo; + UINT fileInfoSize; + if (VerQueryValueW(versionInfo.get(), L"\\", (LPVOID *)&fileInfo, &fileInfoSize)) { + wchar_t version[64]; + swprintf_s(version, ARRAYSIZE(version), L"wxWidgets-%d.%d.%d.%d (in process)", HIWORD(fileInfo->dwFileVersionMS), LOWORD(fileInfo->dwFileVersionMS), HIWORD(fileInfo->dwFileVersionLS), LOWORD(fileInfo->dwFileVersionLS)); + AddListViewItem(hwndList, version, L"wxWidgets"); + } + } + } } } } diff --git a/src/resource/WinSpy.rc b/src/resource/WinSpy.rc index b8cb50a..531845d 100644 --- a/src/resource/WinSpy.rc +++ b/src/resource/WinSpy.rc @@ -602,6 +602,8 @@ IDB_FRAMEWORK_REACT_NATIVE BITMAP "react.bmp" IDB_FRAMEWORK_WEBVIEW2 BITMAP "webview2.bmp" IDB_FRAMEWORK_WINUI BITMAP "winui.bmp" IDB_FRAMEWORK_WPF BITMAP "wpf.bmp" +IDB_FRAMEWORK_QT BITMAP "qt.bmp" +IDB_FRAMEWORK_WXWIDGETS BITMAP "wxwidgets.bmp" ///////////////////////////////////////////////////////////////////////////// @@ -715,4 +717,3 @@ IDB_SELBOX PNG "selbox.png" ///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED - diff --git a/src/resource/qt.bmp b/src/resource/qt.bmp new file mode 100644 index 0000000000000000000000000000000000000000..dc8e9a6543e3a1382a22e6d704df28c5e60532a6 GIT binary patch literal 4246 zcmeH|T}V_x6vs6K!>Gi15TUe>H@&;-?p9iAx=LE0M4>`uh_Yc2(VHUmQn|b8uDb|s zh=EW(7DO*S2z@~H5cE>f7dUfQ6AUwhFtF6y|J=J%SGoJq;`Wlmo}HO9bIxz(%*?rt z+F)jiT7vk$1j!3aDq3l1Q+cvk6Rk)8iukFWybI?V|BNNpf=AV7_%AUhYgTI!ScM4q z<-1p{Q0+sNTd@X~z#2yVA;+fp`4Y~Dq(A|CvWFkYAwKrfX3UnB zFrOsixx)5%9Q-90vy61}{dK*()CzxQpIot<*j~A0JN7=ioG;CI_+Do>FSc~^B2y19 zJ_ef=bF{k#zb9hxabM05OO*ccqZ>rq$15_xzo+NBxwT!44}WZ3KRD5lgLr+`&k^ld zeE1#_zHrw%;paVclc=A2xUH7Pyu2ve#iS|Cr=(!-C8S4eFJs;()Z-Xi6ij^`oi8bf zc@6mjt6pzMZ7{#}@S>ez)_|rnFZktZ6X{&6aI}l%!SQBNpyhIo)&g7XotiD)93a zH?w`XJ=LD>e3z06_Ddr^&ZnRFsO{Q*%!{kZzcbaD-ts0g-^2F_zAemGz&F#HJly^` z+SzOKd7A!uUwYZCs*ZSkLj95J)1$XH+p|wxxCaTS7o@l?NOZk z(#U+u9nue+Qy<=#72lt%D`UAEdwE$l&b|uzyMnE&XV9j6Jg?Ik?vKuYXreU@_jV}O zT&#n>rPG*){BQaidw%4+Cv1st6h|?h>{`#Kb)f(IER)S9|KK%<{Zk#3o6->5lNdV- UaVA;Xz*oO-`ZcVz|E~!A0{qZVZ2$lO literal 0 HcmV?d00001 diff --git a/src/resource/resource.h b/src/resource/resource.h index b46f95f..94bd1e5 100644 --- a/src/resource/resource.h +++ b/src/resource/resource.h @@ -49,6 +49,8 @@ #define IDB_FRAMEWORK_DIRECTUI 176 #define IDB_FRAMEWORK_WPF 177 #define IDB_FRAMEWORK_WEBVIEW2 178 +#define IDB_FRAMEWORK_QT 179 +#define IDB_FRAMEWORK_WXWIDGETS 180 #define IDC_LIST1 1000 #define IDC_DRAGGER 1001 #define IDC_LIST2 1001 diff --git a/src/resource/wxwidgets.bmp b/src/resource/wxwidgets.bmp new file mode 100644 index 0000000000000000000000000000000000000000..7284d645143be6fea43ee84f0c8e07a715d81e11 GIT binary patch literal 3126 zcmcgtX;4&G7Jk-L&9B7x!zyLQpcBOnu*L<9z<@#+<7CE(646A|8BtLprXn~lfXEs) zqjZBCi-0VR2*{!lTDHc-ei&piMi3es5?LDP*YD8{-LLzdGq<~4VvSX)!ql8P@7C$A zcfNDZ_wN0!=Rcg^qAcc2*2UzR_w1QQ%_fo6?o6jB^Yh&B|7C(;G8l}!!DMj~nBAZ^ znvBLbZ(&%ai%)FZyN3?g-yE=?-XCx;Ab<|o*Su#B9em{8gNLd&DM8x)GNgr~`rdwv z`~5VIqO8tR6mb%(7CF*`gWQx$JbXArQIA7HVB4o)?|@5};=%N=h$ff3-BFW1&9ot#xUxfpl=oL0f|72x0qix%N~e}Xx4 zVAd>xuRAOH5%HC**1@5`JF-t?^}e!3Uzu#HtZ}QX!B^I>xuM~NT;9jAFG@&jpLltX z6cpm2AaHXNTwK7(36?E`C5vJHe6Y2Bf&U@{e`YzmMj544+6)f7GcYi1V1OEUN}1OI zYH*0^e7x_wyE^{a#*o%2H+-bJT8zhz!us{X+O_Z(H(0$ImM;f;dst{^!52SziH=y_ z)iqbq6E->d5y#oHnk5=$KFio@G&UM`riOc)8>d>^I);Xd?b?XRS@c!!8^e^gY4^*jg_4@5B>&7r^ z7=~1FWYmkvAPi&6X()xFrnlFM-_W3pic-ntkbN1$Pr|Wd5EKNPHxaJj126D!#~IUg zDXFjUBkpMXLNzSW>knwPf7NI_)C{TO#4vwmn5B%`jy2;;pZDL`s7y*!wX~q55EBw0 zDhfiwkd*ku2mZDJy}WVuya`d-EBL7$?crmi)qv56{wC8u$HzSx#@#Xq;mVO^DMgP| z@vMKDOqnWHb#&nM>yReK)5#bc3lR|z91J`B(eE?UCeN`{Q7hT$2K@waesUtMyz z_m9=Qw?*o_QNC*jy~|I&)315!mZ;K_%Le{i#5BY(g#RE08u^V3vtG@3F&cLZzO+|i z<-h4pUtz%r`PJBnSBoGg7t$|5YAUA0aScveRW_7viH**7ww9vCEv}=e3xx&wJl~9% z0r(YSB;pB#0|x!ajOIg9g4O&^p}76z89(3M?JF%A{;3~n8g5iU$u%KAA2PGC;P~A> z2MWSMVT&&k;aIX17c4;AIb=U&OC-fS--=iOC_+p|j71Db{L*OLJu$J}pkFgMc)PF9 z+J9Hqa7M=CCrWH@$Hsb;R%1muN{X@KaE02(8}f3&e>bdHX+Ccb4zO?`!Otm@RPy`} zh}Qu#5YHo?MT|#0g?Jn>81e6;s@muHL_gEceP34gRMw=emTD_2wI$cIS0wuKFN!rg zHe+D{Id$mjifhPuTZQDjO@Ak^NK(u5-H2ohkrA>1FCvO9gTz<{`E+FD1wNTVrQ$L& z?#IQ;W8>w~vGT}hIxOn@{LfCa{(ewW3?aer;d&s#;p&FY&hYNLlET6}240CM1FQfn zMz~`67UvMpSO(dxQq}eKTlulBf=QUv8?3I^^LmreRa!c>cdsC=5t0*O-#%fp4|sW^ zyF1z~s!d5L9~~q3_Ymt5ZxNypix6`V(-Bh-<96cf~E;=QZCeY1sG#x`XN7BtFX?Z9uPit!%)@pxA z&TC`Et#8yKF|@Qmex4Bj6-1haLpXFuAX9AEfNpNg>{&l#XB!X=CV|{#dW(}lc=i5z zEjanJr{A9-a0s_$Tj!PBDWW5G-5fb6Jln!DsBqc#i z43To~-~OF>WMfXzdg^LNtE%v)e)5Ths!F(a4f6^xD+|u0!Pj47d^~qBsH?DGis*<> zAG9lSa!{$j*8A8{k3?R}EAZ-7B%GvQ#B*u=d-wFpnx>3zn4D-%N%^^~l&z~{zq!d? zFJp^}*qmH8J)KJv4~2)yKM$N>HB-hXiR|$3{j4l`ax$HiOeZGL32}5>3>_UsM?|!o iKCOPPU~f`F0D