|
分類:[.NET 全般]
Windowsで作業をしていて
同じフォルダーを二つ以上開いてしまうことがあります。
同じフォルダーが開かれている場合
一つを残してそれ以外を閉じるプログラムを作りたいと考えています。
以下のコードを作ったのですが
この方法だと、
例えば
C:\testフォルダーと
D:\textフォルダーが開かれている場合、
フルパスは異なるのに、フォルダー名は同じなので
同じフォルダーだと認識されてしまい、
片方が閉じられてしまいます。
フルパスが違っている場合には、
フォルダー名が同じでも閉じないようにしたいのですが
どうすれば良いでしょうか?
Imports System.Runtime.InteropServices
Imports System.Text
'http://dobon.net/vb/dotnet/process/enumwindows.html
Public Class Program
''' <summary>
''' エントリポイント
''' </summary>
Declare Function SetCurrentDirectoryW Lib "kernel32" (ByVal lpPathName As Long) As Long
Private Declare Function MoveWindow Lib "user32" Alias "MoveWindow" _
(ByVal hwnd As IntPtr, ByVal x As Integer, ByVal y As Integer, _
ByVal nWidth As Integer, ByVal nHeight As Integer, _
ByVal bRepaint As Integer) As Integer
Public Shared Sub Main()
'ウィンドウを列挙する
EnumWindows(New EnumWindowsDelegate(AddressOf EnumWindowCallBack), _
IntPtr.Zero)
Beep()
End Sub
Public Delegate Function EnumWindowsDelegate(ByVal hWnd As IntPtr, _
ByVal lparam As IntPtr) As Boolean
<DllImport("user32.dll")> _
Public Shared Function EnumWindows(ByVal lpEnumFunc As EnumWindowsDelegate, _
ByVal lparam As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function
<DllImport("user32.dll", CharSet:=CharSet.Auto, SetLastError:=True)> _
Private Shared Function GetWindowText(ByVal hWnd As IntPtr, _
ByVal lpString As StringBuilder, ByVal nMaxCount As Integer) As Integer
End Function
<DllImport("user32.dll", CharSet:=CharSet.Auto, SetLastError:=True)> _
Private Shared Function GetWindowTextLength(ByVal hWnd As IntPtr) As Integer
End Function
<DllImport("user32.dll", CharSet:=CharSet.Auto, SetLastError:=True)> _
Private Shared Function GetClassName(ByVal hWnd As IntPtr, _
ByVal lpClassName As StringBuilder, ByVal nMaxCount As Integer) As Integer
End Function
'クローズメッセージを選択されたウィンドウに送る
Public Const WM_CLOSE = &H10
Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" _
(ByVal hwnd As IntPtr, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
Public Const SC_CLOSE = &HF060
Public Const WM_SYSCOMMAND = &H112
Private Shared Win_hai() As String
Private Shared filenum As Integer = 0
Private Shared Function EnumWindowCallBack(ByVal hWnd As IntPtr, _
ByVal lparam As IntPtr) As Boolean
'ウィンドウのタイトルの長さを取得する
Dim textLen As Integer = GetWindowTextLength(hWnd)
If 0 < textLen Then
'ウィンドウのタイトルを取得する
Dim tsb As New StringBuilder(textLen + 1)
GetWindowText(hWnd, tsb, tsb.Capacity)
'ウィンドウのクラス名を取得する
Dim csb As New StringBuilder(256)
GetClassName(hWnd, csb, csb.Capacity)
If csb.ToString() = "CabinetWClass" Then 'ウインドウの場合
If filenum >= 1 Then
For i As Integer = 1 To filenum
If Win_hai(i) = tsb.ToString() Then
SendMessage(hWnd, WM_SYSCOMMAND, SC_CLOSE, 0%)
Return True
End If
Next i
End If
filenum = filenum + 1
ReDim Preserve Win_hai(filenum)
Win_hai(filenum) = tsb.ToString()
End If
End If
Return True
End Function
End Class
|