Please do not use if not absolutely necessary. Quoting Brian, "Window focus should almost always lie with the user."
Usage:
Measure:
Options:
Return value:
Commands:
Example: [!CommandMeasure Focus "JSMeter\System"]
Code: Select all
[MeasureName]
Measure=Plugin
Plugin=Focus
FocusOnRefresh=0
Code: Select all
FocusOnRefresh : brings focus to the current config on refresh
- 0(default)
- 1
0 : if current config is not in focus
1 : if current config is in focus
1 : if current config is in focus
Code: Select all
[!CommandMeasure MeasureName "config"]
Code:
Example skin:
Code: Select all
[Rainmeter]
Update=1000
AccurateText=1
OnFocusAction=[!SetOption Image SolidColor 00BBFF][!UpdateMeter Image][!Redraw]
OnUnfocusAction=[!SetOption Image SolidColor 00FF00][!UpdateMeter Image][!Redraw]
[Focus]
Measure=Plugin
Plugin=Focus
FocusOnRefresh=0
[Image]
Meter=Image
H=100
W=200
SolidColor=FF00FF
MouseOverAction=[!CommandMeasure Focus "[#CURRENTCONFIG]"]
FocusPluginExample_1.0.0.1.rmskin
Zip:
Installer:
Focus_1.0.0.1.zip
FocusPluginExample_1.0.0.1.rmskin
Do not use like:
or
Code: Select all
OnRefreshAction=[!CommandMeasure MeasureName "config1"][!CommandMeasure MeasureName "config2"]
Code: Select all
FocusOnRefresh=1
;and
OnRefreshAction=[!CommandMeasure MeasureName "other config"]
Code: Select all
#include <Windows.h>
#include <stdio.h>
#include "../../API/RainmeterAPI.h"
#include <string>
struct Measure
{
HWND windowHandle;
int focusOnRefresh;
Measure() : windowHandle(NULL), focusOnRefresh()
{
};
};
PLUGIN_EXPORT void Initialize(void** data, void* rm)
{
Measure* measure = new Measure;
*data = measure;
measure->windowHandle = RmGetSkinWindow(rm);
measure->focusOnRefresh = RmReadInt(rm, L"FocusOnRefresh", 0);
if (measure->focusOnRefresh == 1) {
while (measure->windowHandle != GetForegroundWindow()) {
SetForegroundWindow(measure->windowHandle);
}
}
}
PLUGIN_EXPORT void Reload(void* data, void* rm, double* maxValue)
{
Measure* measure = (Measure*)data;
}
PLUGIN_EXPORT double Update(void* data)
{
Measure* measure = (Measure*)data;
if (measure->windowHandle != GetForegroundWindow()) {
return 0.0;
} else {
return 1.0;
}
}
HWND GetSkinWindow(const wchar_t* configName)
{
HWND trayWnd = FindWindow(L"RainmeterTrayClass", NULL);
if (trayWnd)
{
COPYDATASTRUCT cds;
cds.dwData = 5101;
cds.cbData = (DWORD)(wcslen(configName) + 1) * sizeof(wchar_t);
cds.lpData = (void*)configName;
return (HWND)SendMessage(trayWnd, WM_COPYDATA, 0, (LPARAM)&cds);
}
return NULL;
}
PLUGIN_EXPORT void ExecuteBang(void* data, LPCWSTR args)
{
Measure* measure = (Measure*)data;
HWND hwnd = GetSkinWindow(args);
if (!hwnd) {
RmLog(LOG_ERROR, L"Focus.dll: Invalid config. Make sure config is loaded!");
}
else {
while (hwnd != GetForegroundWindow()) {
SetForegroundWindow(hwnd);
}
}
}
PLUGIN_EXPORT void Finalize(void* data)
{
Measure* measure = (Measure*)data;
delete measure;
}