Processing Ajax...

Title
Close Dialog

Message

Confirm
Close Dialog

Confirm
Close Dialog

A recent AVG and Avast antivirus update is preventing DisplayFusion 9.9 from launching on some systems.
If you're running into this issue, please update to the latest DisplayFusion 10.0 Beta.

Restart service on resolution change

User Image
Chris G1
80 discussion posts
Is there a way to have DisplayFusion restart a Windows service when the screen resolution changes or a monitor is connected?
19 days ago  • #1
User Image
Chris G1
80 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));
    }
}
18 days ago  • #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.
16 days ago  • #3
Was this helpful?  Login to Vote(-)  Login to Vote(-)