Hello jsmorley.
Thank you very much for your answer.
Unfortunately I'm trying to keep the rm reference across the API functions, but I cannot figure it out.
I don't see anything wrong actually, I also tried to remove the skin and load it again completely because I was wondering about other issues.
Now I'm saving references to both API and RM pointers:
Code: Select all
class Measure
{
static public implicit operator Measure(IntPtr data)
{
return (Measure)GCHandle.FromIntPtr(data).Target;
}
public string inputStr; //The string returned in GetString is stored here
public IntPtr buffer; //Prevent marshalAs from causing memory leaks by clearing this before assigning
[b]public Rainmeter.API api;
public IntPtr rm = IntPtr.Zero;[/b]
}
I save them in the Initialize function:
Code: Select all
[DllExport]
public static void Initialize(ref IntPtr data, IntPtr [b]rm[/b])
{
data = GCHandle.ToIntPtr(GCHandle.Alloc(new Measure()));
Measure measure = new Measure();
[b]Rainmeter.API api = (Rainmeter.API)rm;[/b]
[b]measure.api = api;
measure.rm = rm;[/b]
}
and then try to log in the update as I see in your example:
Code: Select all
[DllExport]
public static double Update(IntPtr data)
{
Measure measure = (Measure)data;
measure.api.Log(API.LogType.Notice, "AAA: " + TaskbarHandle.ToString());
measure.api.Log(API.LogType.Notice, "BBB: " + SecondaryTaskbar.ToString());
AccentPolicy accentPolicy = new AccentPolicy();
accentPolicy.AccentState = measure.inputStr == null ? (AccentState)2 : (AccentState)Int32.Parse(measure.inputStr);
EnableBlur(TaskbarHandle, accentPolicy);
EnableBlur(SecondaryTaskbar, accentPolicy);
return 0.0;
}
Still nothing happens. I don't understand what I'm doing wrong.
jsmorley wrote: ↑October 19th, 2019, 2:43 pm
Here is a C# example that does some logging...
Code: Select all
using Rainmeter;
using System;
using System.Drawing;
using System.Runtime.InteropServices;
namespace PluginImageSize
{
class Measure
{
static public implicit operator Measure(IntPtr data)
{
return (Measure)GCHandle.FromIntPtr(data).Target;
}
public IntPtr buffer = IntPtr.Zero;
public IntPtr rm = IntPtr.Zero;
public double width, height;
public Bitmap ImageBitmap;
public string ImageName;
public string Dimension;
public bool fileErrorShown = false;
public bool dimErrorShown = false;
}
public class Plugin
{
[DllExport]
public static void Initialize(ref IntPtr data, IntPtr rm)
{
data = GCHandle.ToIntPtr(GCHandle.Alloc(new Measure()));
Measure measure = (Measure)data;
Rainmeter.API api = (Rainmeter.API)rm;
measure.rm = rm;
}
[DllExport]
public static void Reload(IntPtr data, IntPtr rm, ref double maxValue)
{
Measure measure = (Measure)data;
Rainmeter.API api = (Rainmeter.API)rm;
measure.width = 0.0;
measure.height = 0.0;
measure.ImageName = api.ReadString("ImageName", "");
measure.Dimension = api.ReadString("Dimension", "WIDTH").ToUpper();
int isDisabled = api.ReadInt("Disabled", 0);
int isPaused = api.ReadInt("Paused", 0);
if (isDisabled == 0 && isPaused == 0)
{
try
{
measure.ImageBitmap = new Bitmap(@measure.ImageName, true);
measure.width = measure.ImageBitmap.Width;
measure.height = measure.ImageBitmap.Height;
measure.ImageBitmap.Dispose();
measure.fileErrorShown = false;
}
catch
{
if (!measure.fileErrorShown)
{
api.Log(API.LogType.Error, "ImageSize.dll: File error for " + measure.ImageName);
measure.fileErrorShown = true;
}
}
}
}
[DllExport]
public static double Update(IntPtr data)
{
Measure measure = (Measure)data;
Rainmeter.API api = (Rainmeter.API)measure.rm;
if (measure.Dimension == "WIDTH")
{
measure.dimErrorShown = false;
return measure.width;
}
else if (measure.Dimension == "HEIGHT")
{
measure.dimErrorShown = false;
return measure.height;
}
else
{
if (!measure.dimErrorShown)
{
api.Log(API.LogType.Error, "ImageSize.dll: Dimension option " + measure.Dimension + " invalid");
measure.dimErrorShown = true;
}
return 0.0;
}
}
[DllExport]
public static void Finalize(IntPtr data)
{
Measure measure = (Measure)data;
if (measure.buffer != IntPtr.Zero)
{
Marshal.FreeHGlobal(measure.buffer);
}
GCHandle.FromIntPtr(data).Free();
}
}
}