summaryrefslogtreecommitdiff
path: root/plugins/ZeroSwitch/src/ZeroSwitch.cpp
diff options
context:
space:
mode:
authorKirill Volinsky <mataes2007@gmail.com>2015-05-21 13:01:57 +0000
committerKirill Volinsky <mataes2007@gmail.com>2015-05-21 13:01:57 +0000
commite0771af6a53381f7dd826d2b6bee77c3610f15e0 (patch)
treeb4d986f8d1f1a8f8e8dca2ccfbd11331c35145cf /plugins/ZeroSwitch/src/ZeroSwitch.cpp
parentc29f535799abdb5a473b12206a3b390e474517ab (diff)
plugin ZeroSwitch added. Works only under WinXP
git-svn-id: http://svn.miranda-ng.org/main/trunk@13731 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
Diffstat (limited to 'plugins/ZeroSwitch/src/ZeroSwitch.cpp')
-rw-r--r--plugins/ZeroSwitch/src/ZeroSwitch.cpp154
1 files changed, 154 insertions, 0 deletions
diff --git a/plugins/ZeroSwitch/src/ZeroSwitch.cpp b/plugins/ZeroSwitch/src/ZeroSwitch.cpp
new file mode 100644
index 0000000000..df460395c8
--- /dev/null
+++ b/plugins/ZeroSwitch/src/ZeroSwitch.cpp
@@ -0,0 +1,154 @@
+// ZeroSwitch.cpp : Defines the entry point for the DLL application.
+//
+
+#include "stdafx.h"
+
+HINSTANCE hInst;
+HHOOK hHook;
+HWND hDummyWnd = NULL, hHelperWnd = NULL, hMirandaWnd = NULL;
+int hLangpack;
+
+PLUGININFOEX pluginInfo = {
+ sizeof(PLUGININFOEX),
+ __PLUGIN_NAME,
+ PLUGIN_MAKE_VERSION(__MAJOR_VERSION, __MINOR_VERSION, __RELEASE_NUM, __BUILD_NUM),
+ __DESCRIPTION,
+ __AUTHOR,
+ __AUTHOREMAIL,
+ __COPYRIGHT,
+ __AUTHORWEB,
+ UNICODE_AWARE,
+ // {3F1657B1-69CB-4992-9CFC-226C808A5202}
+ { 0x3f1657b1, 0x69cb, 0x4992, { 0x9c, 0xfc, 0x22, 0x6c, 0x80, 0x8a, 0x52, 0x2 } }
+};
+
+BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD, LPVOID)
+{
+ hInst = hinstDLL;
+ return TRUE;
+}
+
+extern "C" __declspec(dllexport) PLUGININFOEX* MirandaPluginInfoEx(DWORD)
+{
+ return &pluginInfo;
+}
+
+LRESULT CALLBACK HelperProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
+{
+ switch (message)
+ {
+ case WM_ACTIVATE:
+ if (LOWORD(wParam) != WA_INACTIVE) // Helper window got activated
+ SetActiveWindow(hMirandaWnd);
+ break;
+ case WM_DESTROY:
+ if (hWnd == hHelperWnd)
+ hHelperWnd = NULL;
+ else
+ hDummyWnd = NULL;
+ break;
+ default:
+ return DefWindowProc(hWnd, message, wParam, lParam);
+ }
+ return 0;
+}
+
+void CreateHelperWnd()
+{
+ WNDCLASSEX wcex;
+ // First we must check if Miranda's main window has the "Title bar" border style...
+ if ((GetWindowLongPtr(hMirandaWnd, GWL_STYLE) & WS_CAPTION) && !(GetWindowLongPtr(hMirandaWnd, GWL_EXSTYLE) & WS_EX_TOOLWINDOW))
+ return;
+
+ if (hHelperWnd)
+ return; // We need only one helper window
+ // Widows taskbar workaround
+ // We don't want our helper window to be displayed on Windows taskbar.
+ // So firt of all we have to create an invisible window and then set it as
+ // parent to our window.
+
+ // Register windows class
+ wcex.cbSize = sizeof(WNDCLASSEX);
+ wcex.style = CS_HREDRAW | CS_VREDRAW;
+ wcex.lpfnWndProc = HelperProc;
+ wcex.cbClsExtra = 0;
+ wcex.cbWndExtra = 0;
+ wcex.hInstance = hInst;
+ wcex.hIcon = LoadSkinnedIconBig(SKINICON_OTHER_MIRANDA);
+ wcex.hCursor = NULL;
+ wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
+ wcex.lpszMenuName = NULL;
+ wcex.lpszClassName = _T("ZeroSwitchHlp");
+ wcex.hIconSm = LoadSkinnedIcon(SKINICON_OTHER_MIRANDA);
+
+ if (NULL == RegisterClassEx(&wcex))
+ return; // wtf
+
+ hDummyWnd = CreateWindow(_T("ZeroSwitchHlp"), _T(""), WS_POPUP, 0, 0, 0, 0, NULL, NULL, hInst, NULL);
+ if (!hDummyWnd)
+ UnregisterClass(_T("ZeroSwitchHlp"), hInst);
+ hHelperWnd = CreateWindow(_T("ZeroSwitchHlp"), _T("Miranda NG"), WS_OVERLAPPEDWINDOW | WS_VISIBLE, -100, -100, 90, 90, hDummyWnd, NULL, hInst, NULL);
+ if (!hHelperWnd)
+ {
+ DestroyWindow(hDummyWnd);
+ UnregisterClass(_T("ZeroSwitchHlp"), hInst);
+ }
+}
+
+void DestroyHelperWnd()
+{
+ if (hHelperWnd)
+ {
+ DestroyWindow(hHelperWnd);
+ DestroyWindow(hDummyWnd);
+ UnregisterClass(_T("ZeroSwitchHlp"), hInst);
+ }
+}
+
+LRESULT CALLBACK CallWndRetProc(int nCode, WPARAM wParam, LPARAM lParam)
+{
+ PCWPRETSTRUCT pMes;
+
+ if (nCode >= 0)
+ {
+ pMes = (PCWPRETSTRUCT)lParam; // Get message details
+ if (!hMirandaWnd)
+ hMirandaWnd = FindWindow(_T("Miranda"), NULL);
+
+ if (pMes->hwnd == hMirandaWnd)
+ {
+ if (pMes->message == WM_SHOWWINDOW) // We are interested only in this message
+ {
+ if (pMes->wParam == TRUE) // The window is being shown
+ CreateHelperWnd();
+ else
+ DestroyHelperWnd();
+ }
+ }
+ }
+ return CallNextHookEx(NULL, nCode, wParam, lParam); // Pass the message to other hooks in chain
+}
+
+extern "C" int __declspec(dllexport) Load(void)
+{
+ mir_getLP(&pluginInfo);
+
+ if (IsWinVerVistaPlus()) {
+ MessageBox(NULL, TranslateT("Plugin works under Windows XP only"), TranslateT("ZeroSwitch plugin failed"), MB_ICONSTOP);
+ return 1;
+ }
+
+ // Let's setup shop :)
+ hHook = SetWindowsHookEx(WH_CALLWNDPROCRET, CallWndRetProc, NULL, GetCurrentThreadId());
+ if (hHook == NULL)
+ MessageBox(NULL, TranslateT("Oops, we've got a big hook error here :("), TranslateT("ZeroSwitch plugin failed"), MB_ICONSTOP);
+ return 0;
+}
+
+extern "C" int __declspec(dllexport) Unload(void)
+{
+ if (hHook)
+ UnhookWindowsHookEx(hHook);
+ DestroyHelperWnd();
+ return 0;
+} \ No newline at end of file