Oliviaophia / SmartTaskbar

A lightweight utility which can automatically switch the display state of the Windows Taskbar.
MIT License
1.3k stars 74 forks source link

Multiple monitors #24

Open nizos opened 6 years ago

nizos commented 6 years ago

Can you make the taskbar hide only on the display where a program is maximized and not all the others?

Oliviaophia commented 6 years ago

I tried it, failed. Windows API does not support controlling different taskbars. If you have a better way, please let me know. I really want to solve this problem.

nizos commented 6 years ago

Hi ChanpleCai,

Great work!

I notice that when a window is maximized (say on monitor 1) and the taskbar is hidden on all monitors (monitors 1,2 & 3), if I move the mouse down to the taskbar area on one of the monitors where the window is not maximized (monitor 2 or 3), the taskbar will raise only on that particular monitor.

When doing that, the window focus is not taken away, I can still type on the maximized window on monitor 1 while still being able to see the taskbar on the monitor where the taskbar is raised.

I would really love for this to work for two reasons: 1 - Always being able to tell what time it is. 2- Always being able to see which programs are running and where to find them on the taskbar.

All of this while still being able to enjoy having a fully maximized window on the other monitors.

So this is what I am thinking: A - Find whatever underlying signal that is being sent to explorer.exe or the responsible service in this case that is responsible for triggering this behavior and try to inherit it and override it. B - Implement a custom taskbar that replaces the original taskbar on none-primary monitors (like Display Fusion has done).

Again, I would love for this to work and I understand that it might not be possible to implement due to the current limitations on the the operating system at the moment. I will look around for information and possible solutions and implementation methods if you are open to it, which gladly you seem to be, and I would be happy to do anything from my end as well to contribute towards this feature becoming possible.

nizos commented 6 years ago

Link to referenced Display Fusion taskbar in my previous comment (method B): https://www.displayfusion.com/Features/Taskbar/

Specifically, bullet #5: • Auto-Hide: Configure each of your taskbars to auto-hide, or to stay always visible.

Oliviaophia commented 6 years ago

Actually I am trying the A method you said. I found that the activation of the taskbar is related to the mouse event. yet, the simulated mouse event does not work for it. ^_^

Oliviaophia commented 5 years ago

the new Auto Mode partial support for multiple monitors, not perfect, but enough.

nizos commented 5 years ago

I bought it from the store and installed the latest release here as well. I don't see a difference. Maybe it hasn't been pushed yet? Thanks for the effort!

nizos commented 5 years ago

Ok I have tried building the source code. Your implementation works but it seems like there is some logical conflict in terms of behavior. The closest way I can explain it is that the bar behaves this way when maximizing different windows on different monitors:

https://i.imgur.com/e16qOEj.gif

I added a missing "break" at the bottom of this function in TaskbarController.cs:

   switch (Settings.ModeType)
        {
            case AutoModeType.Disabled:
            #if DEBUG
                _autoMode = new DumbMode();
            #endif
                break;
            case AutoModeType.ForegroundMode:
                _autoMode = new ForegroundMode();
                break;
            case AutoModeType.ClassicAutoMode:
            case AutoModeType.ClassicAdaptiveMode:
            case AutoModeType.WhitelistMode:
            case AutoModeType.BlacklistMode:
                _autoMode = new AutoMode();
                break;
            default:
            #if DEBUG
                throw new ArgumentOutOfRangeException();
            #else
                Settings.ModeType = AutoModeType.Disabled;
            #endif
                break;
        }

I would love to help you with this project but there is barely any comments on what anything does so I feel like I am trying to solve a maze.

citizenserious commented 4 years ago

This would really be a nice feature. I am looking forward too it (:

Oliviaophia commented 2 years ago

Ok I have tried building the source code. Your implementation works but it seems like there is some logical conflict in terms of behavior. The closest way I can explain it is that the bar behaves this way when maximizing different windows on different monitors:

https://i.imgur.com/e16qOEj.gif

I added a missing "break" at the bottom of this function in TaskbarController.cs:

   switch (Settings.ModeType)
        {
            case AutoModeType.Disabled:
            #if DEBUG
                _autoMode = new DumbMode();
            #endif
                break;
            case AutoModeType.ForegroundMode:
                _autoMode = new ForegroundMode();
                break;
            case AutoModeType.ClassicAutoMode:
            case AutoModeType.ClassicAdaptiveMode:
            case AutoModeType.WhitelistMode:
            case AutoModeType.BlacklistMode:
                _autoMode = new AutoMode();
                break;
            default:
            #if DEBUG
                throw new ArgumentOutOfRangeException();
            #else
                Settings.ModeType = AutoModeType.Disabled;
            #endif
                break;
        }

I would love to help you with this project but there is barely any comments on what anything does so I feel like I am trying to solve a maze.

I wrote that piece of code a bit rough, I will add some comments later.

Oliviaophia commented 2 years ago

The new windows 11 version bypasses this problem. I will later add this logic to the windows 10 version.