引数を「ファイル名を指定して実行」に「送る」。
FileRunX.exe [引数...]
用途
(a) SendToフォルダに置いて、ファイルを「送る」。
(b) ショートカットなどのコマンドラインに前置して、実行前に確認ダイアログを出す。
(c) ショートカットなどのコマンドラインに前置して、実行時に引数の追加変更ダイアログを出す。
vbc /t:winexe FileRunX.vb
Imports System.Text
Imports System.Threading
Delegate Function CallBack(hwnd As Integer, lParam As Integer) As Boolean
Module Module1
Declare Auto Function SHRunDialog Lib "shell32" Alias "#61" (hWnd As Integer, hIcon As Integer, lpszPath As String, szTitle As String, szPrompt As String, uFlags As Integer) As Integer
Declare Function EnumWindows Lib "user32" (lpEnumFunc As CallBack, IParam As Integer) As Integer
Declare Function GetWindowThreadProcessId Lib "user32" (hwnd As Integer, ByRef ProcessId As Integer) As Integer
Declare Auto Function GetClassName Lib "user32" (hwnd As Integer, lpClassName As StringBuilder, nMaxCount As Integer) As Integer
Declare Auto Function FindWindowEx Lib "user32" (hWndParent As Integer, hWndChildAfter As Integer, lpszClassName As String, lpszWindowCaption As Integer) As Integer
Declare Auto Function SendMessage Lib "user32" (hwnd As Integer, wMsg As Integer, wParm As Integer, lParm As String) As Integer
Const WM_SETTEXT As Integer=&H000C
Dim hwnd As Integer
Sub Main()
Dim FileRunThread As New Thread(AddressOf FileRun)
FileRunThread.IsBackground=True
FileRunThread.Start()
Dim sTitle As String = "ファイル名を指定して実行" & Chr(0)
Dim sPrompt As String = "実行するプログラム名、または開くフォルダやドキュメント名、インターネット リソース名を入力してください。" & Chr(0)
SHRunDialog(0, 0, Environment.CurrentDirectory, sTitle, sPrompt, 0)
End Sub
Sub FileRun()
Dim CommandLine As String = System.Environment.CommandLine
Dim Quoted As Boolean = False
Dim k As Integer
For k=0 To CommandLine.Length-1
If CommandLine.Chars(k) = """" Then
Quoted = Not Quoted
ElseIf Not Quoted AndAlso CommandLine.Chars(k) = " " Then
Exit For
End If
Next
CommandLine = CommandLine.Remove(0,k).Trim()
' Console.WriteLine("Arguments:{0}",CommandLine)
If CommandLine.Length=0 Then Exit Sub
System.Threading.Thread.Sleep(0)
Do
hwnd=0
EnumWindows(AddressOf EnumFunc, System.Diagnostics.Process.GetCurrentProcess().Id)
If hwnd Then
hwnd = FindWindowEx(hwnd, 0, "ComboBox", 0)
If hwnd Then
SendMessage(hwnd, WM_SETTEXT, 0, CommandLine)
Exit Sub
End If
End If
System.Threading.Thread.Sleep(100)
Loop
End Sub
Function EnumFunc(hwnd1 As Integer, lParam As Integer) As Boolean
Dim pid As Integer
GetWindowThreadProcessId(hwnd1, pid)
Dim sb1 As New StringBuilder(256)
GetClassName(hwnd1, sb1, sb1.Capacity + 1)
If lParam=pid And sb1.ToString()="#32770" Then
hwnd=hwnd1
Return False
End If
Return True
End Function
End Module
« ショートカットに相対パスを指定する。(その3) | トップページ | Run Applications at a Low Integrity Level (その2) »