[NEW_FEATURE] Save in new instance with admin privileges.
While user tries to save a file which requires administrator privileges, another instance in admin mode could be launched to save the file in question.
This commit is contained in:
parent
c3037a91df
commit
4cca41267e
@ -65,6 +65,9 @@ struct SortTaskListPred
|
|||||||
|
|
||||||
LRESULT CALLBACK Notepad_plus_Window::Notepad_plus_Proc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
|
LRESULT CALLBACK Notepad_plus_Window::Notepad_plus_Proc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
|
||||||
{
|
{
|
||||||
|
if (hwnd == NULL)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
switch(Message)
|
switch(Message)
|
||||||
{
|
{
|
||||||
case WM_NCCREATE : // First message we get the ptr of instantiated object
|
case WM_NCCREATE : // First message we get the ptr of instantiated object
|
||||||
|
@ -380,21 +380,105 @@ bool Notepad_plus::doSave(BufferID id, const TCHAR * filename, bool isCopy)
|
|||||||
|
|
||||||
if (!res)
|
if (!res)
|
||||||
{
|
{
|
||||||
if(error_msg.empty())
|
// try to open Notepad++ in admin mode
|
||||||
|
if (!_isAdministrator)
|
||||||
{
|
{
|
||||||
_nativeLangSpeaker.messageBox("FileLockedWarning",
|
bool isSnapshotMode = NppParameters::getInstance()->getNppGUI().isSnapshotMode();
|
||||||
_pPublicInterface->getHSelf(),
|
if (isSnapshotMode) // if both rememberSession && backup mode are enabled
|
||||||
TEXT("Please check if this file is opened in another program."),
|
{ // Open the 2nd Notepad++ instance in Admin mode, then close the 1st instance.
|
||||||
TEXT("Save failed"),
|
int openInAdminModeRes = _nativeLangSpeaker.messageBox("OpenInAdminMode",
|
||||||
MB_OK);
|
_pPublicInterface->getHSelf(),
|
||||||
|
TEXT("The file cannot be saved and it may be protected.\rDo you want to launch Notepad++ in Administrator mode?"),
|
||||||
|
TEXT("Save failed"),
|
||||||
|
MB_YESNO);
|
||||||
|
|
||||||
|
if (openInAdminModeRes == IDYES)
|
||||||
|
{
|
||||||
|
TCHAR nppFullPath[MAX_PATH];
|
||||||
|
::GetModuleFileName(NULL, nppFullPath, MAX_PATH);
|
||||||
|
|
||||||
|
generic_string args = TEXT("-multiInst");
|
||||||
|
size_t res = (size_t)::ShellExecute(_pPublicInterface->getHSelf(), TEXT("runas"), nppFullPath, args.c_str(), TEXT("."), SW_SHOW);
|
||||||
|
|
||||||
|
// If the function succeeds, it returns a value greater than 32. If the function fails,
|
||||||
|
// it returns an error value that indicates the cause of the failure.
|
||||||
|
// https://msdn.microsoft.com/en-us/library/windows/desktop/bb762153%28v=vs.85%29.aspx
|
||||||
|
|
||||||
|
if (res < 32)
|
||||||
|
{
|
||||||
|
_nativeLangSpeaker.messageBox("OpenInAdminModeFailed",
|
||||||
|
_pPublicInterface->getHSelf(),
|
||||||
|
TEXT("Notepad++ cannot be opened in Administrator mode."),
|
||||||
|
TEXT("Open in Administrator mode failed"),
|
||||||
|
MB_OK);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
::SendMessage(_pPublicInterface->getHSelf(), WM_CLOSE, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else // rememberSession && backup mode are not both enabled
|
||||||
|
{ // open only the file to save in Notepad++ of Administrator mode by keeping the current instance.
|
||||||
|
int openInAdminModeRes = _nativeLangSpeaker.messageBox("OpenInAdminModeWithoutCloseCurrent",
|
||||||
|
_pPublicInterface->getHSelf(),
|
||||||
|
TEXT("The file cannot be saved and it may be protected.\rDo you want to launch Notepad++ in Administrator mode?"),
|
||||||
|
TEXT("Save failed"),
|
||||||
|
MB_YESNO);
|
||||||
|
|
||||||
|
if (openInAdminModeRes == IDYES)
|
||||||
|
{
|
||||||
|
TCHAR nppFullPath[MAX_PATH];
|
||||||
|
::GetModuleFileName(NULL, nppFullPath, MAX_PATH);
|
||||||
|
|
||||||
|
BufferID bufferID = bufferID = _pEditView->getCurrentBufferID();
|
||||||
|
Buffer * buf = MainFileManager->getBufferByID(bufferID);
|
||||||
|
|
||||||
|
//process the fileNamePath into LRF
|
||||||
|
generic_string fileNamePath = buf->getFullPathName();
|
||||||
|
|
||||||
|
generic_string args = TEXT("-multiInst -nosession ");
|
||||||
|
args += TEXT("\"");
|
||||||
|
args += fileNamePath;
|
||||||
|
args += TEXT("\"");
|
||||||
|
size_t res = (size_t)::ShellExecute(_pPublicInterface->getHSelf(), TEXT("runas"), nppFullPath, args.c_str(), TEXT("."), SW_SHOW);
|
||||||
|
|
||||||
|
// If the function succeeds, it returns a value greater than 32. If the function fails,
|
||||||
|
// it returns an error value that indicates the cause of the failure.
|
||||||
|
// https://msdn.microsoft.com/en-us/library/windows/desktop/bb762153%28v=vs.85%29.aspx
|
||||||
|
|
||||||
|
if (res < 32)
|
||||||
|
{
|
||||||
|
_nativeLangSpeaker.messageBox("OpenInAdminModeFailed",
|
||||||
|
_pPublicInterface->getHSelf(),
|
||||||
|
TEXT("Notepad++ cannot be opened in Administrator mode."),
|
||||||
|
TEXT("Open in Administrator mode failed"),
|
||||||
|
MB_OK);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
::MessageBox(_pPublicInterface->getHSelf(), error_msg.c_str(), TEXT("Save failed"), MB_OK);
|
|
||||||
|
if (error_msg.empty())
|
||||||
|
{
|
||||||
|
_nativeLangSpeaker.messageBox("FileLockedWarning",
|
||||||
|
_pPublicInterface->getHSelf(),
|
||||||
|
TEXT("Please check if this file is opened in another program."),
|
||||||
|
TEXT("Save failed"),
|
||||||
|
MB_OK);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
::MessageBox(_pPublicInterface->getHSelf(), error_msg.c_str(), TEXT("Save failed"), MB_OK);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_pFuncList && (!_pFuncList->isClosed()) && _pFuncList->isVisible())
|
if (res && _pFuncList && (!_pFuncList->isClosed()) && _pFuncList->isVisible())
|
||||||
{
|
{
|
||||||
_pFuncList->reload();
|
_pFuncList->reload();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user