Visual Studio
Windows、Web、モバイル デバイス用のアプリケーションを構築するための統合開発ツールの Microsoft スイートのファミリ。
81 件の質問
このブラウザーはサポートされなくなりました。
Microsoft Edge にアップグレードすると、最新の機能、セキュリティ更新プログラム、およびテクニカル サポートを利用できます。
お世話になっております。
現在VisualStudioを用いたドキュメントのバージョン管理を実施しようと考えています。
そこで、ユーザによる誤操作による影響を最小限に抑える方法を模索しているところです。
本題としましては、VisualStudioの各ドキュメントをロックしない状態でも編集ができないような設定を行うことが可能でしょうか。
(ロックをしなければ編集・ドキュメントの更新ができない状態にしたいと考えています。)
上記設定ができるのであれば、設定の方法や手順も併せて展開していただけると幸いです。
使用しているVisualStudioは「VisualStudio2013」です。
以上、どうぞよろしくお願いいたします。
using System;
using System.Diagnostics;
using System.Globalization;
using System.Runtime.InteropServices;
using System.ComponentModel.Design;
using Microsoft.Win32;
using Microsoft.VisualStudio;
using Microsoft.VisualStudio.Shell.Interop;
using Microsoft.VisualStudio.OLE.Interop;
using Microsoft.VisualStudio.Shell;
using System.Linq;
namespace Company.VSPackage1
{
[PackageRegistration(UseManagedResourcesOnly = true)]
[InstalledProductRegistration("#110", "#112", "1.0", IconResourceID = 400)]
[ProvideMenuResource("Menus.ctmenu", 1)]
[Guid(GuidList.guidVSPackage1PkgString)]
[ProvideAutoLoad(Microsoft.VisualStudio.Shell.Interop.UIContextGuids.NoSolution)]
[ProvideAutoLoad(Microsoft.VisualStudio.Shell.Interop.UIContextGuids.SolutionExists)]
[ProvideAutoLoad(Microsoft.VisualStudio.Shell.Interop.UIContextGuids.SolutionHasMultipleProjects)]
[ProvideAutoLoad(Microsoft.VisualStudio.Shell.Interop.UIContextGuids.SolutionHasSingleProject)]
public sealed class VSPackage1Package : Package
{
public VSPackage1Package()
{
}
#region Package Members
protected override void Initialize()
{
base.Initialize();
dte = (EnvDTE80.DTE2)this.GetService(typeof(EnvDTE.DTE));
evDoc = dte.Events.DocumentEvents;
evDoc.DocumentOpening += evDoc_DocumentOpening;
evDoc.DocumentOpened += evDoc_DocumentOpened;
evSol = dte.Events.SolutionEvents;
evSol.Opened += evSol_Opened;
var ev2 = (EnvDTE80.Events2)dte.Events;
evKeyPress = ev2.TextDocumentKeyPressEvents;
evKeyPress.BeforeKeyPress += TextDocumentKeyPressEvents_BeforeKeyPress;
try
{
var rk = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(dte.RegistryRoot);
var sc = rk.OpenSubKey("SourceControl", true);
sc.SetValue("AllowUncontrolledInMemoryEditing", 0, RegistryValueKind.DWord);
}
catch
{ }
}
private EnvDTE80.DTE2 dte;
private EnvDTE.CommandEvents evcmd;
private EnvDTE.DocumentEvents evDoc;
private EnvDTE.SolutionEvents evSol;
private EnvDTE80.TextDocumentKeyPressEvents evKeyPress;
void evSol_Opened() { SetFileReadOnly(dte.Solution); }
void evDoc_DocumentOpened(EnvDTE.Document Document) { SetFileReadOnly(Document); }
void evDoc_DocumentOpening(string DocumentPath, bool ReadOnly) { SetFileReadOnly(DocumentPath); }
private void SetFileReadOnly(EnvDTE.Solution sol)
{
try
{
SetFileReadOnly(sol.FullName);
foreach (EnvDTE.Project p in sol)
{
SetFileReadOnly(p);
}
}
catch { }
}
private void SetFileReadOnly(EnvDTE.Document doc)
{
if (doc == null) return;
try
{
doc.ReadOnly = true;
var p = doc.ProjectItem.ContainingProject;
SetFileReadOnly(p);
}
catch { }
}
private void SetFileReadOnly(EnvDTE.Project p)
{
if (p == null) return;
if (System.IO.File.Exists(p.FullName))
{
SetFileReadOnly(p.FullName);
}
try
{
foreach (EnvDTE.ProjectItem pi in p.ProjectItems)
{
for (short i = 0; i < pi.FileCount; i++)
{
string path = pi.FileNames[i];
SetFileReadOnly(path);
}
try
{
if (pi.Document != null) { pi.Document.ReadOnly = true; }
}
catch { }
}
}
catch { }
}
private void SetFileReadOnly(string path)
{
try
{
if (System.IO.File.Exists(path))
{
var attr = System.IO.File.GetAttributes(path);
if ((attr & System.IO.FileAttributes.ReadOnly) != System.IO.FileAttributes.ReadOnly)
{
//ファイル属性変更していいなら
System.IO.File.SetAttributes(path, attr | System.IO.FileAttributes.ReadOnly);
}
}
}
catch
{
}
}
void DocumentEvents_DocumentClosing(EnvDTE.Document Document)
{
Document.Saved = true;
Document.ReadOnly = true;
}
void TextDocumentKeyPressEvents_BeforeKeyPress(string Keypress, EnvDTE.TextSelection Selection, bool InStatementCompletion, ref bool CancelKeypress)
{
CancelKeypress = true; //キー操作禁止
}
#endregion
}
}
#VisualStudioの外部のメモ帳などで変更できてもいいのかな