Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

管理者としてコマンドプロンプトを開くメニュー項目を追加 #618

Merged
17 changes: 17 additions & 0 deletions help/sakura/_RESOURCE/HLP000377.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML lang="ja">
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<link rel="stylesheet" href="dsk_sakura.css" type="text/css">
<link rel="shortcut icon" href="images/favicon.ico">
<TITLE>�Ǘ��҂Ƃ��ăR�}���h�v�����v�g���J��</TITLE>
<META NAME="MS-HKWD" CONTENT="�R�}���h�v�����v�g���J��">
<META NAME="MS-HKWD" CONTENT="OpenCommandPrompt">
</HEAD>
<BODY>
<script type="text/javascript" src="item.js"></script>
<noscript>[<a href="HLP000001.html">�ڎ�</a>]<br></noscript>
<h2>�Ǘ��҂Ƃ��ăR�}���h�v�����v�g���J��</h2>
�t�@�C���̏ꏊ���Ǘ��҂Ƃ��ăR�}���h�v�����v�g�ŊJ���܂��B

</BODY></HTML>
5 changes: 5 additions & 0 deletions help/sakura/sakura.hhc
Original file line number Diff line number Diff line change
Expand Up @@ -347,6 +347,11 @@
<param name="Local" value="_RESOURCE\HLP000376.html">
<param name="ImageNumber" value="9">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="�Ǘ��҂Ƃ��ăR�}���h�v�����v�g���J��">
<param name="Local" value="_RESOURCE\HLP000377.html">
<param name="ImageNumber" value="9">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="�ŋߎg�����t�@�C��">
<param name="Local" value="_RESOURCE\HLP000029.html">
Expand Down
4 changes: 4 additions & 0 deletions help/sakura/sakura.hhk
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,10 @@
<param name="Local" value="_RESOURCE\HLP000376.html">
</OBJECT>
<LI><OBJECT type="text/sitemap">
<param name="Name" value="�Ǘ��҂Ƃ��ăR�}���h�v�����v�g���J��">
<param name="Local" value="_RESOURCE\HLP000377.html">
</OBJECT>
<LI><OBJECT type="text/sitemap">
<param name="Name" value="�ŋߎg�����t�@�C��">
<param name="Local" value="_RESOURCE\HLP000029.html">
</OBJECT>
Expand Down
2 changes: 2 additions & 0 deletions help/sakura/sakura.hhp
Original file line number Diff line number Diff line change
Expand Up @@ -386,6 +386,7 @@ _RESOURCE\HLP000373.html
_RESOURCE\HLP000374.html
_RESOURCE\HLP000375.html
_RESOURCE\HLP000376.html
_RESOURCE\HLP000377.html
_RESOURCE\HLP_UR000.html
_RESOURCE\HLP_UR017.html
_RESOURCE\HLP_UR016.html
Expand Down Expand Up @@ -776,6 +777,7 @@ HLP000373=_RESOURCE\HLP000373.html
HLP000374=_RESOURCE\HLP000374.html
HLP000375=_RESOURCE\HLP000375.html
HLP000376=_RESOURCE\HLP000376.html
HLP000377=_RESOURCE\HLP000377.html
HLP_UR000=_RESOURCE\HLP_UR000.html
HLP_UR017=_RESOURCE\HLP_UR017.html
HLP_UR016=_RESOURCE\HLP_UR016.html
Expand Down
1 change: 1 addition & 0 deletions sakura_core/Funccode_x.hsrc
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,7 @@ F_EXITALLEDITORS = 30194, //編集の全終了 なし
F_EXITALL = 30195, //サクラエディタの全終了 なし
F_OPEN_FOLDER_IN_EXPLORER = 30196, //ファイルの場所を開く
F_OPEN_COMMAND_PROMPT = 30197, //コマンドプロンプトを開く
F_OPEN_COMMAND_PROMPT_AS_ADMIN = 30198, //管理者としてコマンドプロンプトを開く

// 編集系
F_WCHAR = 30200, //文字入力 WCHAR c
Expand Down
3 changes: 2 additions & 1 deletion sakura_core/cmd/CViewCommander.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -234,7 +234,8 @@ BOOL CViewCommander::HandleCommand(
case F_VIEWMODE: Command_VIEWMODE();break; /* ビューモード */
case F_PROPERTY_FILE: Command_PROPERTY_FILE();break; /* ファイルのプロパティ */
case F_OPEN_FOLDER_IN_EXPLORER: Command_OPEN_FOLDER_IN_EXPLORER();break; /* ファイルの場所を開く */
case F_OPEN_COMMAND_PROMPT: Command_OPEN_COMMAND_PROMPT();break; /* コマンドプロンプトを開く */
case F_OPEN_COMMAND_PROMPT: Command_OPEN_COMMAND_PROMPT(FALSE);break; /* コマンドプロンプトを開く */
case F_OPEN_COMMAND_PROMPT_AS_ADMIN: Command_OPEN_COMMAND_PROMPT(TRUE);break; /* 管理者としてコマンドプロンプトを開く */
case F_PROFILEMGR: Command_PROFILEMGR();break; // プロファイルマネージャ
case F_EXITALLEDITORS: Command_EXITALLEDITORS();break; /* 編集の全終了 */ // 2007.02.13 ryoji 追加
case F_EXITALL: Command_EXITALL();break; /* サクラエディタの全終了 */ //Dec. 26, 2000 JEPRO 追加
Expand Down
2 changes: 1 addition & 1 deletion sakura_core/cmd/CViewCommander.h
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ class CViewCommander{
void Command_VIEWMODE( void ); /* ビューモード */
void Command_PROPERTY_FILE( void ); /* ファイルのプロパティ */
void Command_OPEN_FOLDER_IN_EXPLORER( void ); /* ファイルの場所を開く */
void Command_OPEN_COMMAND_PROMPT( void ); /* コマンドプロンプトを開く */
void Command_OPEN_COMMAND_PROMPT( BOOL isAdmin ); /* コマンドプロンプトを開く */
void Command_PROFILEMGR( void ); // プロファイルマネージャ
void Command_EXITALLEDITORS( void ); /* 編集の全終了 */ // 2007.02.13 ryoji 追加
void Command_EXITALL( void ); /* サクラエディタの全終了 */ //Dec. 27, 2000 JEPRO 追加
Expand Down
21 changes: 19 additions & 2 deletions sakura_core/cmd/CViewCommander_File.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@
#include "plugin/CJackManager.h"
#include "env/CSakuraEnvironment.h"
#include "debug/CRunningTimer.h"
#include "util/os.h"
#include "sakura_rc.h"


Expand Down Expand Up @@ -605,7 +606,7 @@ void CViewCommander::Command_OPEN_FOLDER_IN_EXPLORER(void)


/* コマンドプロンプトを開く */
void CViewCommander::Command_OPEN_COMMAND_PROMPT(void)
void CViewCommander::Command_OPEN_COMMAND_PROMPT(BOOL isAdmin)
{
if (!GetDocument()->m_cDocFile.GetFilePathClass().IsValidPath()) {
ErrorBeep();
Expand Down Expand Up @@ -640,7 +641,23 @@ void CViewCommander::Command_OPEN_COMMAND_PROMPT(void)
return;
}

auto hInstance = ::ShellExecuteW(NULL, L"open", szCmdExePathBuf, pszcmdExeParam, strFolder.c_str(), SW_SHOWNORMAL);
LPWSTR pVerb = L"open";
if (isAdmin)
{
pVerb = L"runas";
}

#ifndef _WIN64
/*
64bit OS で 32bit アプリから管理者権限でコマンドプロンプトを起動する場合
通常は 32bit 版のコマンドプロンプトが開かれる。

Wow64 の FileSystem Redirection を一時的にオフにすることにより 64bit 版の
コマンドプロンプトを起動する
*/
CDisableWow64FsRedirect wow64Redirect(isAdmin);
#endif
auto hInstance = ::ShellExecuteW(NULL, pVerb, szCmdExePathBuf, pszcmdExeParam, strFolder.c_str(), SW_SHOWNORMAL);
// If the function succeeds, it returns a value greater than 32.
if (hInstance <= (decltype(hInstance))32) {
ErrorBeep();
Expand Down
6 changes: 6 additions & 0 deletions sakura_core/env/CShareData.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1386,6 +1386,9 @@ void CShareData::InitPopupMenu(DLLSHAREDATA* pShareData)
rMenu.m_nCustMenuItemFuncArr[0][n] = F_OPEN_COMMAND_PROMPT;
rMenu.m_nCustMenuItemKeyArr[0][n] = 'W';
n++;
rMenu.m_nCustMenuItemFuncArr[0][n] = F_OPEN_COMMAND_PROMPT_AS_ADMIN;
rMenu.m_nCustMenuItemKeyArr[0][n] = 'w';
n++;
rMenu.m_nCustMenuItemFuncArr[0][n] = F_PROPERTY_FILE;
rMenu.m_nCustMenuItemKeyArr [0][n] = 'F'; //Nov. 9, 2000 JEPRO 「やり直し」とバッティングしていたアクセスキーを変更(R→F)
n++;
Expand Down Expand Up @@ -1437,6 +1440,9 @@ void CShareData::InitPopupMenu(DLLSHAREDATA* pShareData)
rMenu.m_nCustMenuItemFuncArr[CUSTMENU_INDEX_FOR_TABWND][n] = F_OPEN_COMMAND_PROMPT;
rMenu.m_nCustMenuItemKeyArr[CUSTMENU_INDEX_FOR_TABWND][n] = 'W';
n++;
rMenu.m_nCustMenuItemFuncArr[CUSTMENU_INDEX_FOR_TABWND][n] = F_OPEN_COMMAND_PROMPT_AS_ADMIN;
rMenu.m_nCustMenuItemKeyArr[CUSTMENU_INDEX_FOR_TABWND][n] = 'w';
n++;
rMenu.m_nCustMenuItemFuncArr[CUSTMENU_INDEX_FOR_TABWND][n] = F_0;
rMenu.m_nCustMenuItemKeyArr [CUSTMENU_INDEX_FOR_TABWND][n] = '\0';
n++;
Expand Down
3 changes: 3 additions & 0 deletions sakura_core/func/Funccode.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,7 @@ const EFunctionCode pnFuncList_File[] = { //Oct. 16, 2000 JEPRO 変数名変更(
F_PROPERTY_FILE , /* ファイルのプロパティ */
F_OPEN_FOLDER_IN_EXPLORER , //ファイルの場所を開く
F_OPEN_COMMAND_PROMPT , //コマンドプロンプトを開く
F_OPEN_COMMAND_PROMPT_AS_ADMIN , //管理者としてコマンドプロンプトを開く
F_PROFILEMGR , //プロファイルマネージャ
F_EXITALLEDITORS , //編集の全終了 // 2007.02.13 ryoji F_WIN_CLOSEALL→F_EXITALLEDITORS
F_EXITALL //サクラエディタの全終了 //Dec. 27, 2000 JEPRO 追加
Expand Down Expand Up @@ -625,6 +626,7 @@ int FuncID_To_HelpContextID( EFunctionCode nFuncID )
case F_PROPERTY_FILE: return HLP000022; /* ファイルのプロパティ */
case F_OPEN_FOLDER_IN_EXPLORER: return HLP000373; //ファイルの場所を開く
case F_OPEN_COMMAND_PROMPT: return HLP000376; //コマンドプロンプトを開く
case F_OPEN_COMMAND_PROMPT_AS_ADMIN: return HLP000377; //管理者としてコマンドプロンプトを開く
case F_PROFILEMGR: return HLP000363; //プロファイルマネージャ

case F_EXITALLEDITORS: return HLP000030; //編集の全終了 // 2007.02.13 ryoji 追加
Expand Down Expand Up @@ -1216,6 +1218,7 @@ bool IsFuncEnable( const CEditDoc* pcEditDoc, const DLLSHAREDATA* pShareData, EF
return pcEditDoc->m_cDocFile.GetFilePathClass().IsValidPath(); // 現在編集中のファイルのパス名をクリップボードにコピーできるか

case F_OPEN_COMMAND_PROMPT: //コマンドプロンプトを開く
case F_OPEN_COMMAND_PROMPT_AS_ADMIN: //管理者としてコマンドプロンプトを開く
if (!pcEditDoc->m_cDocFile.GetFilePathClass().IsValidPath())
{
return false;
Expand Down
1 change: 1 addition & 0 deletions sakura_core/sakura.hh
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@
#define HLP000022 22 //ファイルのプロパティ
#define HLP000373 373 //ファイルの場所を開く
#define HLP000376 376 //コマンドプロンプトを開く
#define HLP000377 377 //管理者としてコマンドプロンプトを開く
#define HLP000363 363 //プロファイルマネージャ
#define HLP000029 29 //最近使ったファイル
#define HLP000023 23 //最近使ったフォルダ
Expand Down
1 change: 1 addition & 0 deletions sakura_core/sakura_rc.rc
Original file line number Diff line number Diff line change
Expand Up @@ -2264,6 +2264,7 @@ BEGIN
F_PROFILEMGR "プロファイルマネージャ"
F_OPEN_FOLDER_IN_EXPLORER "ファイルの場所を開く"
F_OPEN_COMMAND_PROMPT "コマンドプロンプトを開く"
F_OPEN_COMMAND_PROMPT_AS_ADMIN "管理者としてコマンドプロンプトを開く"
END

STRINGTABLE DISCARDABLE
Expand Down
31 changes: 31 additions & 0 deletions sakura_core/util/os.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -383,6 +383,20 @@ BOOL CheckSystemResources( const TCHAR* pszAppName )
#endif // (WINVER < _WIN32_WINNT_WIN2K)


/*
https://docs.microsoft.com/en-us/windows/desktop/api/wow64apiset/nf-wow64apiset-iswow64process
*/
BOOL IsWow64()
{
BOOL bIsWow64 = FALSE;
if (!IsWow64Process(GetCurrentProcess(),&bIsWow64))
{
// 失敗したら WOW64 はオフとみなす
bIsWow64 = FALSE;
}
return bIsWow64;
}

// -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- //
// 便利クラス //
// -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- //
Expand All @@ -409,4 +423,21 @@ CCurrentDirectoryBackupPoint::~CCurrentDirectoryBackupPoint()
}


CDisableWow64FsRedirect::CDisableWow64FsRedirect(BOOL isOn)
berryzplus marked this conversation as resolved.
Show resolved Hide resolved
: m_isSuccess(FALSE)
, m_OldValue(NULL)
{
if (isOn && IsWow64()) {
m_isSuccess = Wow64DisableWow64FsRedirection(&m_OldValue);
}
else {
m_isSuccess = FALSE;
}
}

CDisableWow64FsRedirect::~CDisableWow64FsRedirect()
{
if (m_isSuccess) {
Wow64RevertWow64FsRedirection(m_OldValue);
berryzplus marked this conversation as resolved.
Show resolved Hide resolved
}
}
32 changes: 32 additions & 0 deletions sakura_core/util/os.h
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,38 @@ BOOL IsVisualStyle(); // 自分が現在ビジュアルスタイル表示
void PreventVisualStyle( HWND hWnd ); // 指定ウィンドウでビジュアルスタイルを使わないようにする // 2006.06.23 ryoji
void MyInitCommonControls(); // コモンコントロールを初期化する // 2006.06.21 ryoji

/* Wow64 のエミュレーション上で実行しているか判定する */
BOOL IsWow64();

/*!
@brief Wow64 の ファイルシステムリダイレクションを一時的に無効にして、クラス破棄時に元に戻すクラス
@note このクラスを継承しないように final をつける
*/
class CDisableWow64FsRedirect final {
berryzplus marked this conversation as resolved.
Show resolved Hide resolved
public:
/*!
@brief コンストラクタで ファイルシステムリダイレクションを無効にする
@param isOn この引数が TRUE のときに無効化処理を行う
*/
CDisableWow64FsRedirect(BOOL isOn);
berryzplus marked this conversation as resolved.
Show resolved Hide resolved

berryzplus marked this conversation as resolved.
Show resolved Hide resolved
/*!
@brief ファイルシステムリダイレクションを元に戻す
*/
~CDisableWow64FsRedirect();
berryzplus marked this conversation as resolved.
Show resolved Hide resolved

// コピー不可 (C++11 で利用可能)
CDisableWow64FsRedirect(const CDisableWow64FsRedirect&) = delete;
CDisableWow64FsRedirect& operator = (const CDisableWow64FsRedirect&) = delete;

// ムーブ不可 (C++11 で利用可能)
CDisableWow64FsRedirect(CDisableWow64FsRedirect&&) = delete;
CDisableWow64FsRedirect& operator = (CDisableWow64FsRedirect&&) = delete;

private:
BOOL m_isSuccess;
berryzplus marked this conversation as resolved.
Show resolved Hide resolved
PVOID m_OldValue;
};

//カレントディレクトリユーティリティ。
//コンストラクタでカレントディレクトリを保存し、デストラクタでカレントディレクトリを復元するモノ。
Expand Down
1 change: 1 addition & 0 deletions sakura_lang_en_US/sakura_lang_rc.rc
Original file line number Diff line number Diff line change
Expand Up @@ -2269,6 +2269,7 @@ BEGIN
F_PROFILEMGR "Profile Maneger"
F_OPEN_FOLDER_IN_EXPLORER "Open Containing Folder"
F_OPEN_COMMAND_PROMPT "Open Command Propmt"
F_OPEN_COMMAND_PROMPT_AS_ADMIN "Open Command Propmt As Admin"
END

STRINGTABLE DISCARDABLE
Expand Down