ソース掲示板




すべてから検索

キーワード   条件 表示 現行ログ 過去ログ トピックス 名前 本文
【VB.NET】PATH 環境変数エディタ ( No.0 )
日時: 2013/05/01 23:26
名前: lightbox



ユーザー環境変数
拡張子:
HKEY_CURRENT_USER\Environment
システム環境変数
拡張子:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
↓ツールボックスに登録して、LboxGrid を フォームに貼り付けます ブラウザでダウンロード 登録は、ツールボックスの「全般」で右クリックして「アイテムの登録」を行います 登録すると、「参照設定」にも登録されると思いますが、もし無ければ登録して下さい 値を空にすると、その行は削除されます。 行を追加したい場合は、任意の行の最後で ";" を入力してデータを続けます。
拡張子:
' RegistryKey クラス用
Imports Microsoft.Win32
Imports System.Runtime.InteropServices


Public Class Form1

	Const HWND_BROADCAST = &HFFFF
	Const WM_WININICHANGE = &H1A
	Const SMTO_ABORTIFHUNG = &H2

	<DllImport("User32.dll")> _
	 Private Shared Function SendMessageTimeout( _
	  ByVal hWnd As Integer, _
	  ByVal msg As Integer, _
	  ByVal wParam As Integer, _
	  ByVal lParam As String, _
	  ByVal fuFlags As Integer, _
	  ByVal uTimeout As Integer, _
	  ByRef lpdwResult As System.IntPtr) As Integer
	End Function

	' ユーザーかシステムかを示す変数( 1:ユーザー,2:システム )
	Private mode As Integer = 0

	' *********************************************************
	' 初期処理
	' *********************************************************
	Private Sub Form1_Load(ByVal sender As System.Object, _
	ByVal e As System.EventArgs) Handles MyBase.Load

		Me.LboxGrid1.AddColumn("PATH", "検索パス")
		Me.LboxGrid1.ReadOnly = False
		Me.LboxGrid1.EditMode = DataGridViewEditMode.EditOnF2

	End Sub

	' *********************************************************
	' ユーザーの PATH 環境変数の表示
	' *********************************************************
	Private Sub ユーザToolStripMenuItem_Click(ByVal sender As System.Object, _
	ByVal e As System.EventArgs) Handles ユーザToolStripMenuItem.Click

		Me.Text = "PATH環境変数エディタ / ユーザ"

		Dim subkey As String = "Environment"
		Dim regkey As RegistryKey = Registry.CurrentUser.OpenSubKey(subkey, True)

		Try
			' C# では、if ( regkey != null ) {
			If Not regkey Is Nothing Then

				mode = 1
				DataEnum(regkey.GetValue("PATH").ToString())

			Else

				MessageBox.Show("レジストリが正しく開かれていません")

			End If

		Catch ex As Exception

			MessageBox.Show(ex.ToString())

		End Try

		If Not regkey Is Nothing Then

			regkey.Close()

		End If

	End Sub

	' *********************************************************
	' システムの PATH 環境変数の表示
	' *********************************************************
	Private Sub システムToolStripMenuItem_Click(ByVal sender As System.Object, _
	ByVal e As System.EventArgs) Handles システムToolStripMenuItem.Click

		Me.Text = "PATH環境変数エディタ / システム"

		Dim subkey As String = "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
		Dim regkey As RegistryKey = Registry.LocalMachine.OpenSubKey(subkey, True)

		Try
			If Not regkey Is Nothing Then

				mode = 2
				DataEnum(regkey.GetValue("PATH").ToString())

			Else

				MessageBox.Show("レジストリが正しく開かれていません")

			End If

		Catch ex As Exception

			MessageBox.Show(ex.ToString())

		End Try

		If Not regkey Is Nothing Then

			regkey.Close()

		End If

	End Sub

	' *********************************************************
	' 文字列を ";" で分解して配列にする
	' ※ 引数は 値渡し
	' *********************************************************
	Private Sub DataEnum(ByVal Path As String)

		' 区切り文字定義
		Dim delimStr As String = ";"
		Dim delimiter As Char() = delimStr.ToCharArray()

		' 配列に分割
		Dim split As String() = Path.Split(delimiter)

		' ソートはしない( パスの順序に意味がある )
		' 表示のみならばソートしても良い
		' Array.Sort(split, split.GetLowerBound(0), split.Length)

		LoadGrid(split)

	End Sub

	' *********************************************************
	' LboxGrid にデータをロード
	' ※ 引数は 参照渡し
	' *********************************************************
	Private Sub LoadGrid(ByRef data As String())

		Me.LboxGrid1.Clear()
		' 自動サイズ変更モード
		Me.LboxGrid1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells

		For Each value As String In data

			Me.LboxGrid1.AddRow()
			Me.LboxGrid1.SetColumnText("PATH", value)

		Next

		' 自動サイズ変更の列をユーザが変更できるようにする
		Me.LboxGrid1.AllowResizeColumn(True)

	End Sub


	' *********************************************************
	' 更新
	' *********************************************************
	Private Sub ToolStripMenuItem2_Click(ByVal sender As System.Object, _
	ByVal e As System.EventArgs) Handles ToolStripMenuItem2.Click

		If mode = 0 Then
			MessageBox.Show("更新できません / ユーザまたはシステムを選択して下さい")
			Return
		End If

		Dim str As String = ""
		Dim fld As String = ""

		Me.LboxGrid1.EndEdit()

		' LboxGrid の全行を列挙して PATH 環境変数の値を作成する
		Me.LboxGrid1.SetCurrentRow()
		Do While (Me.LboxGrid1.FindNextRow())

			fld = Me.LboxGrid1.GetColumnText("PATH")
			If fld = "" Then
				Continue Do
			Else
				fld = fld.Trim()
				If fld = "" Then
					Continue Do
				End If
			End If

			If str <> "" Then
				str &= ";"
			End If

			str &= fld

		Loop

		' 作成された内容の表示
		If MessageBox.Show(str, "更新しますか? ( 実行後システムに反映するのに5秒必要です )", _
		 MessageBoxButtons.OKCancel, _
		 MessageBoxIcon.Question) = Windows.Forms.DialogResult.Cancel Then
			Return
		End If

		' レジストリへの書き込み
		If mode = 1 Then
			Dim subkey As String = "Environment"
			Dim regkey As RegistryKey = Registry.CurrentUser.OpenSubKey(subkey, True)

			regkey.SetValue("PATH", str)
			DataEnum(regkey.GetValue("PATH").ToString())

			regkey.Close()
		End If

		' レジストリへの書き込み
		If mode = 2 Then
			Dim subkey As String = "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
			Dim regkey As RegistryKey = Registry.LocalMachine.OpenSubKey(subkey, True)

			regkey.SetValue("PATH", str)
			DataEnum(regkey.GetValue("PATH").ToString())

			regkey.Close()
		End If

		Dim rdata As Integer = 0

		SendMessageTimeout(HWND_BROADCAST, WM_WININICHANGE, 0, "Environment", SMTO_ABORTIFHUNG, 5000, rdata)

	End Sub

End Class
環境変数の変更をシステムに通知する方法 : Microsoft サポートオンライン C#はこちら : 古いバージョンです ↓プロジェクトが使える方はこちら( LboxGrid[lightbox.dll] 同梱 ) http://lightbox.on.coocan.jp/download/PATH_EDITOR.lzh