Processing Ajax...

Title
Close Dialog

Message

Confirm
Close Dialog

Confirm
Close Dialog

Confirm
Close Dialog

User Image
Chris G1
82 discussion posts
Is there a way to have DisplayFusion restart a Windows service when the screen resolution changes or a monitor is connected?
Mar 11, 2023  • #1
User Image
Chris G1
82 discussion posts
I tried using something like this but it doesn't seem to work even if I add the .NET reference to System.ServiceProcess.dll

Code

using System;
using System.Drawing;
using System.Windows.Forms;
using System.Management;
using System.ServiceProcess;

//Code brought to you by: solaris765
//Because numbers after my screen name are fun.
//Automatically changes Monitor Profile based on resolution changes.
//
// The 'windowHandle' parameter will contain the window handle for the:
// - Active window when run by hotkey
// - Window Location target when run by a Window Location rule
// - TitleBar Button owner when run by a TitleBar Button
// - Jump List owner when run from a Taskbar Jump List
// - Currently focused window if none of these match
public static class DisplayFusionFunction
{
    public static void Run(IntPtr windowHandle)
    {
        int maxHRes = getMaxResolution();
        BFS.Dialog.ShowMessageInfo(maxHRes.ToString());

        // default Resolution
        if (maxHRes == 1920)
        {
        RestartService("Start11");
        }

        // nVidia Surround / AMD Eyefinity
        else if (maxHRes > 1920)
        {
        RestartService("Start11");
        }
    }

    public static int getMaxResolution()
    {
        //Must include: using System.Management;

        ManagementScope scope = new ManagementScope();

        ObjectQuery query = new ObjectQuery("SELECT * FROM CIM_VideoControllerResolution");
        int hRes = 0;
        using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query))
        {
            ManagementObjectCollection results = searcher.Get();

            int temp;
            foreach (ManagementBaseObject result in results)
            {
                temp = Convert.ToInt32(result["HorizontalResolution"]);
                if (temp > hRes)
                hRes = temp;
            }
        }
        return hRes;
    }

    public static void RestartService(string serviceName)
    {
        ServiceController service = new ServiceController(serviceName);

        if (service.Status == ServiceControllerStatus.Running)
        {
            service.Stop();
            service.WaitForStatus(ServiceControllerStatus.Stopped, TimeSpan.FromSeconds(10));
        }

        service.Start();
        service.WaitForStatus(ServiceControllerStatus.Running, TimeSpan.FromSeconds(10));
    }
}
Mar 11, 2023  • #2
Owen Muhlethaler (BFS)'s profile on WallpaperFusion.com
Is DisplayFusion running as administrator? To do this, you would need to create a .exe that can elevate, and then call it, as we can't elevate scripts.
Mar 14, 2023  • #3
Subscribe to this discussion topic using RSS
Was this helpful?  Login to Vote(-)  Login to Vote(-)