aboutsummaryrefslogtreecommitdiff
path: root/Src/Plugins/Input/in_cdda/grabwnd.cpp
diff options
context:
space:
mode:
authorJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
committerJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
commit20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch)
tree12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/Plugins/Input/in_cdda/grabwnd.cpp
parent537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff)
downloadwinamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz
Initial community commit
Diffstat (limited to 'Src/Plugins/Input/in_cdda/grabwnd.cpp')
-rw-r--r--Src/Plugins/Input/in_cdda/grabwnd.cpp74
1 files changed, 74 insertions, 0 deletions
diff --git a/Src/Plugins/Input/in_cdda/grabwnd.cpp b/Src/Plugins/Input/in_cdda/grabwnd.cpp
new file mode 100644
index 00000000..71341fcd
--- /dev/null
+++ b/Src/Plugins/Input/in_cdda/grabwnd.cpp
@@ -0,0 +1,74 @@
+#include ".\grabwnd.h"
+#include <strsafe.h>
+
+
+#define LCID_INVARIANT MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT)
+typedef struct _GRABDATA
+{
+ HHOOK hook;
+ HWND hwndParent;
+ WCHAR szClassName[256];
+ WCHAR szTitle[256];
+ GRABCB callback;
+ ULONG_PTR user;
+} GRABDATA;
+
+static GRABDATA g_grab = {0, 0, };
+
+static BOOL IsTargetClass(HWND hwnd, LPCWSTR plzClassName)
+{
+ wchar_t szName[256] = {0};
+ return (0x00 == plzClassName[0] ||
+ (GetClassNameW(hwnd, szName, sizeof(szName)/sizeof(wchar_t)) &&
+ CSTR_EQUAL == CompareStringW(LCID_INVARIANT, NORM_IGNORECASE, szName, -1, plzClassName, -1)));
+}
+
+static BOOL IsTargetTitle(HWND hwnd, LPCWSTR pszTitle)
+{
+ wchar_t szName[256] = {0};
+ return (0x00 == pszTitle[0] ||
+ (GetWindowTextW(hwnd, szName, sizeof(szName)/sizeof(wchar_t)) &&
+ CSTR_EQUAL == CompareStringW(LCID_INVARIANT, NORM_IGNORECASE, szName, -1, pszTitle, -1)));
+}
+static LRESULT CALLBACK HookProc(int code, WPARAM wParam, LPARAM lParam)
+{
+ if (HCBT_CREATEWND == code && IsTargetClass((HWND)wParam, g_grab.szClassName) &&
+ IsTargetTitle((HWND)wParam, g_grab.szTitle) &&
+ (!g_grab.hwndParent || ((CBT_CREATEWND*)lParam)->lpcs->hwndParent == g_grab.hwndParent))
+ {
+ LRESULT result;
+ if (g_grab.callback)
+ {
+ g_grab.callback((HWND)wParam, ((CBT_CREATEWND*)lParam)->lpcs, &((CBT_CREATEWND*)lParam)->hwndInsertAfter, g_grab.user);
+ }
+ result = CallNextHookEx(g_grab.hook, code, wParam, lParam);
+ UnhookWindowsHookEx(g_grab.hook);
+
+
+ ZeroMemory(&g_grab, sizeof(GRABDATA));
+ return result;
+ }
+ return CallNextHookEx(g_grab.hook, code, wParam, lParam);
+}
+
+BOOL BeginGrabCreateWindow(LPCWSTR pszClassName, LPCWSTR pszTitle, HWND hwndParent, GRABCB callback, ULONG_PTR user)
+{
+ if (g_grab.hook || !callback) return FALSE;
+ if (pszClassName) StringCchCopyW(g_grab.szClassName, sizeof(g_grab.szClassName)/sizeof(wchar_t), pszClassName);
+ else g_grab.szClassName[0] = 0x00;
+ if (pszTitle) StringCchCopyW(g_grab.szTitle, sizeof(g_grab.szTitle)/sizeof(wchar_t), pszTitle);
+ else g_grab.szTitle[0] = 0x00;
+ g_grab.hwndParent = hwndParent;
+ g_grab.callback = callback;
+ g_grab.user = user;
+
+ g_grab.hook = SetWindowsHookEx(WH_CBT, HookProc, NULL, GetCurrentThreadId());
+ if (!g_grab.hook) ZeroMemory(&g_grab, sizeof(GRABDATA));
+
+ return (NULL != g_grab.hook);
+}
+void EndGrabCreateWindow(void)
+{
+ if (g_grab.hook) UnhookWindowsHookEx(g_grab.hook);
+ ZeroMemory(&g_grab, sizeof(GRABDATA));
+} \ No newline at end of file