Minimize notepad++ to tray instead of closing.
-
Often people that want things don’t bother to think through the design enough. In this case, what is missing is "If the close command is to minimize the window instead of closing, how do you actually close the app when you want to?
-
Here is a PythonScript that will minimize Notepad++ to the system tray (if Notepad++ is so configured in its Preferences) when the upper-right
X
button is pressed. To truly quit Notepad++, hold the Shift key while pressing theX
.I call the script
ExitNppMinimizesToSystemTray.py
and here is its code:# -*- coding: utf-8 -*- from __future__ import print_function from Npp import * import ctypes from ctypes import wintypes import platform #------------------------------------------------------------------------------- user32 = ctypes.WinDLL('user32') notepad.hwnd = user32.FindWindowW(u'Notepad++', None) LRESULT = wintypes.LPARAM WndProcType = ctypes.WINFUNCTYPE( LRESULT, # return type wintypes.HWND, wintypes.UINT, wintypes.WPARAM, wintypes.LPARAM # arguments ) running_32bit = platform.architecture()[0] == '32bit' SetWindowLong = user32.SetWindowLongW if running_32bit else user32.SetWindowLongPtrW SetWindowLong.restype = WndProcType SetWindowLong.argtypes = [wintypes.HWND, wintypes.INT, WndProcType] SendMessageW = user32.SendMessageW SendMessageW.restype = LRESULT SendMessageW.argtypes = [ wintypes.HWND, wintypes.UINT, wintypes.WPARAM, wintypes.LPARAM ] GWL_WNDPROC = -4 WM_CLOSE = 0x10 WM_SYSCOMMAND = 0x112 SC_MINIMIZE = 0xF020 VK_SHIFT = 0x10 #------------------------------------------------------------------------------- class ENMTST(object): def __init__(self): self.new_npp_wnd_proc_hook_for_SetWindowLong = WndProcType(self.new_npp_wnd_proc_hook) self.orig_npp_wnd_proc = SetWindowLong(notepad.hwnd, GWL_WNDPROC, self.new_npp_wnd_proc_hook_for_SetWindowLong) def new_npp_wnd_proc_hook(self, hwnd, msg, wParam, lParam): retval = True if msg == WM_CLOSE and not self.shift_held(): SendMessageW(hwnd, WM_SYSCOMMAND, SC_MINIMIZE, 0) retval = False # set to False if we don't want further processing of this message if retval: retval = self.orig_npp_wnd_proc(hwnd, msg, wParam, lParam) return retval def shift_held(self): return (user32.GetAsyncKeyState(VK_SHIFT) & 0x8000) != 0 #------------------------------------------------------------------------------- # to run from startup.py, put these lines (uncommented) in that file: #import ExitNppMinimizesToSystemTray #ExitNppMinimizesToSystemTray.ENMTST() if __name__ == '__main__': ENMTST()
-
Wow, that’s powerful! I was expecting it to stop the
X
, and maybe even File > Exit andAlt+F4
. When it minimizes to the tray, even the right-click Close Tray Icon won’t exit out.Further, a standard
taskkill /im notepad++.exe
was even intercepted (whether from my restart-notepad++ user-defined-command or from a command prompt). It took ataskkill /F /IM notepad++.exe
to override that hook, or killing it through task manager. (But the overpowered nature of the script did encourage me to add /F to my restart-notepad++ user command, because when I want a restart, I really mean it.)If the developers do implement such a feature , I hope they provide a way so that WindowCloseX works as configured, but File > Exit and
Alt+F4
work as normal (or at leastAlt+F4
– there has to be a common). Or add a new Tray Right Click command to “Fully Close Notepad++” when that option is in place. I’ve said as much in the feature request. -
-
-
@peterjones said in Minimize notepad++ to tray instead of closing.:
If the developers do implement such a feature
I really don’t see that happening; it seems a very special-case need – and for that case a script is sufficient IMO.
-
BTW, I noticed that the menu that appears when one right-clicks the tray icon is always in English, no matter what Notepad++'s localization preference is set to. That’s fine for me, so I’m not inclined to open an issue about it.
-
@alan-kilborn said in Minimize notepad++ to tray instead of closing.:
I’m not inclined to open an issue about it
Okay, then I have. I think that’s a general-purpose enough desire to not require a “generic user” be the one to ask for it. There shouldn’t be a menu or dialog label in the main application that isn’t translatable, IMO.
-
@alan-kilborn for most applications wit this behavior, I believe I’ve seen that all other methods of closing the application besides using the X will still close the application
The usual suspects of file menu/exit or quit, ALT+F4, tray right click + exit all quit the application
Not saying this is right or wrong, but in my experience that’s the most common behavior.
-
-
@alan-kilborn I’m only interested in closing to an icon, not +folding. I still have no idea how to use this script)
-
I still have no idea how to use this script
- Install PythonScript plugin (use Plugins Admin to install it)
- Plugins > Python Script > New script, name =
ExitNppMinimizesToSystemTray.py
(If it doesn’t default to the%AppData%\Notepad++\Plugins\Config\PythonScript\scripts
directory, make sure you choose that directory; but for a fresh installation of PythonScript, it should default there) - Paste the script that @Alan-Kilborn shared and save
- Look at Plugins > Python Script > Scripts to make sure it’s there.
- If you choose that script, it will run, and the Windows-standard close-window-
X
(or File > Close) will minimize Notepad++ – and, if you have the Settings > Preferences > Misc > Minimize to System Tray turned on, then it will minimize to the tray rather than to the normal taskbar area - This will keep that “feature” until you use Shift + close-window-
X
to really exit.
- If you choose that script, it will run, and the Windows-standard close-window-
- If you want it to always automatically run that script, so that the close-window-
X
override is always minimize-to-tray for you- Plugins > Python Script > Configuration… and set Initialisation to
ATSTARTUP
and click OK - Look at Plugins > Python Script > Scripts
- if there is an entry called
startup (user)
, ctrl+click on that entry to edit it.
(Do not confuse that withstartup
in the same menu, which is separate, and you should not edit it) - if it does not exist, use Plugins > Python Script > New script, and give it the name
startup.py
in the same directory as you put the first script
- if there is an entry called
- in the user
startup.py
that you’re now editing, add
and save the changesimport ExitNppMinimizesToSystemTray ExitNppMinimizesToSystemTray.ENMTST()
- The next time you run Notepad++, it will automatically run that script, and now windows-close-
X
will just minimize-to-tray instead of exiting Notepad++. As a reminder, to really exit Notepad++, you now must use shift + windows-close-X
- Plugins > Python Script > Configuration… and set Initialisation to
-
All this does not matter, because with the script, the X button simply becomes the “minimize window” button and nothing more. Clicking on X does not prompt you to save changes to the file. I want it to be standard functionality, not a third-party script that forces me to download another additional plugin, perform some third-party manipulation, or install another additional program.
-
@themark2580 said in Minimize notepad++ to tray instead of closing.:
All this does not matter
Wow. Thanks for telling me and Alan that we’ve wasted all the time we’ve spent trying to help you.
You asked how to use the script, and I told you how. If you don’t want to use it, you don’t have to.
X button simply becomes the “minimize window” button and nothing more.
You told us you wanted to change the behavior of the X. We told you how.
I want it to be standard functionality
Well, as we tried to make clear, it’s not standard functionality. And as the Forum FAQs and the “Read this before posting” say very plainly, this Forum is not where official feature requests go. Read the “Read this before posting” and the FAQ it links you to, and you can find out where feature requests actually go. (Edit: you had already created the issue, I forgot. But that makes me even more confused why you are demanding here that it be made standard functionality when you already knew we couldn’t do anything about it)
Good luck.
-
Clicking on X does not prompt you to save changes to the file.
To get that functionality, one would just enter one extra line in the script,
editor.saveAll()
, before triggering the minimize. But since you aren’t interested in plugins, it’s irrelevant to you.Hopefully, future readers might get something out of this addition.
-
@peterjones Does this trigger a save request or does it save everything without asking?
-
Just like the File > Save All, it will save all files that are already named, and it will prompt on any unnamed files (
new 1
and its ilk) -
@themark2580 said in Minimize notepad++ to tray instead of closing.:
All this does not matter, because with the script, the X button simply becomes the “minimize window” button and nothing more.
Yes, but the problem as originally stated dealt with your “bad habit” of pressing the X and thinking it would minimize to tray. The workaround script worked around that bad habit.
I want it to be standard functionality
It’s good to want things. It is also good to consider workarounds when you can’t have exactly what you want.
-
This post is deleted! -
Nearly a year ago, @alan-kilborn said in Minimize notepad++ to tray instead of closing.:
I’m not inclined to open an issue about it
and I replied,
Okay, then I have. I think that’s a general-purpose enough desire to not require a “generic user” be the one to ask for it. There shouldn’t be a menu or dialog label in the main application that isn’t translatable, IMO.
They just fixed it. I wonder what prompted them to notice and fix that issue. (I had completely forgotten about it, and was surprised when I got the notification. Then, because I didn’t link here from the issue, I had to search the forum for what prompted that issue, because it’s not something I would have run across on my own.)
-
@PeterJones said in Minimize notepad++ to tray instead of closing.:
They just fixed it. I wonder what prompted them to notice and fix that issue.
I think a developer was working on a batch of translating issues, and just gathered that one into the batch.