2009-06-01T16:28:08の更新内容

programming/tips/createlnk/index.wiki.txt

current previous
1,874 1,14
~
${smdncms:keywords,ショートカットファイル,lnk,C#,IShellLink}
${smdncms:keywords,ショートカットファイル,lnk,C#}
 
${smdncms:tags,lang/c#,plat/win,api/com}
${smdncms:tags,lang/c#,plat/win,api/com}
~
*ショートカットファイル(.lnkファイル)を作成する
*ショートカットファイルを作成する
+
IShellLinkインターフェイスを用いることで、ショートカットの作成・読み込みができる。 ここではIShellLinkのラッパークラスとして ShellLinkクラスを作成し、それを使用している。 ShellLinkクラスのメソッドの詳細およびその他の関連クラス・インターフェイス等は以下のコードにある通り。 なお、このコードは[[Creating and Modifying Shortcuts:http://www.vbaccelerator.com/home/NET/Code/Libraries/Shell_Projects/Creating_and_Modifying_Shortcuts/article.asp]]を参考にして作成した。 また、ANSI環境下では動作確認していない。
+

          
+
なお、Windows Scripting Hostの[[CreateShortcutメソッド:http://msdn.microsoft.com/ja-jp/library/cc364400.aspx]]を使うことでより簡単にショートカットを作成することもできる。
+
#googleadunit
+

          
+
**コード
+
***使用例
+
#code(cs){{
+
using System;
+
using System.IO;
+

          
+
namespace SantaMarta.Tips.ShellLink
+
{
+
    class Shortcut
+
    {
+
        static void Main( string[] args )
+
        {
+
            // 作成先
+
            string shortcutPath = Path.Combine( Environment.GetFolderPath( Environment.SpecialFolder.Desktop ), "電卓.lnk" );
+

          
+
            // ショートカットを作成
+
            ShellLink shortcut = new ShellLink();
+

          
+
            shortcut.Description = "電卓のショートカットです。";
+
            shortcut.TargetPath = @"%SystemRoot%\System32\calc.exe";
+
            shortcut.DisplayMode = ShellLink.ShellLinkDisplayMode.Normal;
+

          
+
            shortcut.Save( shortcutPath );
+

          
+
            Console.WriteLine( "{0}を作成しました。", shortcut.CurrentFile );
+

          
+
            shortcut.Dispose();
+

          
+
            shortcut = null;
+

          
+
            // ショートカットを読み込み
+
            shortcut = new ShellLink( shortcutPath );
+

          
+
            Console.WriteLine( "{0}を読み込みます。", shortcut.CurrentFile );
+
            Console.WriteLine( "ターゲット: {0}", shortcut.TargetPath );
+
            Console.WriteLine( "説明: {0}", shortcut.Description );
+

          
+
            shortcut.Dispose();
+

          
+
            shortcut = null;
+
        }
+
    }
+
}
+
}}
+

          
+
#prompt(出力例){{
+
C:\Documents and Settings\--------\デスクトップ\電卓.lnkを作成しました。
+
C:\Documents and Settings\--------\デスクトップ\電卓.lnkを読み込みます。
+
ターゲット: C:\WINDOWS\system32\calc.exe
+
説明: 電卓のショートカットです。
+
Press any key to continue
+
}}
+

          
+
***実装
+
#code(cs){{
+
using System;
+
using System.IO;
+
using System.Text;
+
using System.ComponentModel;
+
using System.Runtime.InteropServices;
+
using System.Windows.Forms;
+

          
+
namespace SantaMarta.Tips.ShellLink
+
{
+
    #region "COM Interop"
+

          
+
    /// <summary>
+
    /// ShellLink コクラス 
+
    /// </summary>
+
    [ComImport]
+
    [Guid("00021401-0000-0000-C000-000000000046")]
+
    [ClassInterface(ClassInterfaceType.None)]
+
    internal class ShellLinkObject {}
+

          
+
    #region "Unicode環境用"
+

          
+
    /// <summary>
+
    /// IShellLinkWインターフェイス
+
    /// </summary>
+
    [ComImport]
+
    [Guid("000214F9-0000-0000-C000-000000000046")]
+
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
+
    internal interface IShellLinkW
+
    {
+
        void GetPath
+
            (
+
            [Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszFile,
+
            int cch,
+
            [MarshalAs(UnmanagedType.Struct)] ref WIN32_FIND_DATAW pfd,
+
            uint fFlags
+
            );
+

          
+
        void GetIDList( out IntPtr ppidl );
+
            
+
        void SetIDList( IntPtr pidl );
+

          
+
        void GetDescription( [Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszName, int cch );
+

          
+
        void SetDescription( [MarshalAs(UnmanagedType.LPWStr)] string pszName );
+

          
+
        void GetWorkingDirectory( [Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszDir, int cch );
+

          
+
        void SetWorkingDirectory( [MarshalAs(UnmanagedType.LPWStr)] string pszDir );
+

          
+
        void GetArguments( [Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszArgs, int cch );
+

          
+
        void SetArguments( [MarshalAs(UnmanagedType.LPWStr)] string pszArgs );
+

          
+
        void GetHotkey( out ushort pwHotkey );
+

          
+
        void SetHotkey( ushort wHotkey );
+

          
+
        void GetShowCmd( out int piShowCmd );
+

          
+
        void SetShowCmd( int iShowCmd );
+

          
+
        void GetIconLocation
+
            (
+
            [Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszIconPath,
+
            int cch,
+
            out int piIcon
+
            );
+

          
+
        void SetIconLocation
+
            (
+
            [MarshalAs(UnmanagedType.LPWStr)] string pszIconPath,
+
            int iIcon
+
            );
+

          
+
        void SetRelativePath
+
            (
+
            [MarshalAs(UnmanagedType.LPWStr)] string pszPathRel,
+
            uint dwReserved
+
            );
+

          
+
        void Resolve
+
            (
+
            IntPtr hwnd,
+
            uint fFlags
+
            );
+

          
+
        void SetPath( [MarshalAs(UnmanagedType.LPWStr)] string pszFile );
+
    }
+

          
+
    /// <summary>
+
    /// WIN32_FIND_DATAW 構造体
+
    /// </summary>
+
    [StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Unicode)]
+
    internal struct WIN32_FIND_DATAW
+
    {
+
        public const int MAX_PATH = 260;
+

          
+
        public uint dwFileAttributes;
+
        public System.Runtime.InteropServices.FILETIME ftCreationTime;
+
        public System.Runtime.InteropServices.FILETIME ftLastAccessTime;
+
        public System.Runtime.InteropServices.FILETIME ftLastWriteTime;
+
        public uint nFileSizeHigh;
+
        public uint nFileSizeLow;
+
        public uint dwReserved0;
+
        public uint dwReserved1;
+
        
+
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_PATH)]
+
        public string cFileName;
+
        
+
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 14)]
+
        public string cAlternateFileName;
+
    }
+

          
+
    #endregion
+

          
+
    #region "ANSI環境用"
+

          
+
    /// <summary>
+
    /// IShellLinkAインターフェイス
+
    /// </summary>
+
    [ComImport]
+
    [Guid("000214EE-0000-0000-C000-000000000046")]
+
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
+
    internal interface IShellLinkA
+
    {
+
        void GetPath
+
            (
+
            [Out, MarshalAs(UnmanagedType.LPStr)] StringBuilder pszFile,
+
            int cch,
+
            [MarshalAs(UnmanagedType.Struct)] ref WIN32_FIND_DATAA pfd,
+
            uint fFlags
+
            );
+

          
+
        void GetIDList( out IntPtr ppidl );
+
            
+
        void SetIDList( IntPtr pidl );
+

          
+
        void GetDescription( [Out, MarshalAs(UnmanagedType.LPStr)] StringBuilder pszName, int cch );
+

          
+
        void SetDescription( [MarshalAs(UnmanagedType.LPStr)] string pszName );
+

          
+
        void GetWorkingDirectory( [Out, MarshalAs(UnmanagedType.LPStr)] StringBuilder pszDir, int cch );
+

          
+
        void SetWorkingDirectory( [MarshalAs(UnmanagedType.LPStr)] string pszDir );
+

          
+
        void GetArguments( [Out, MarshalAs(UnmanagedType.LPStr)] StringBuilder pszArgs, int cch );
+

          
+
        void SetArguments( [MarshalAs(UnmanagedType.LPStr)] string pszArgs );
+

          
+
        void GetHotkey( out ushort pwHotkey );
+

          
+
        void SetHotkey( ushort wHotkey );
+

          
+
        void GetShowCmd( out int piShowCmd );
+

          
+
        void SetShowCmd( int iShowCmd );
+

          
+
        void GetIconLocation
+
            (
+
            [Out, MarshalAs(UnmanagedType.LPStr)] StringBuilder pszIconPath,
+
            int cch,
+
            out int piIcon
+
            );
+

          
+
        void SetIconLocation
+
            (
+
            [MarshalAs(UnmanagedType.LPStr)] string pszIconPath,
+
            int iIcon
+
            );
+

          
+
        void SetRelativePath
+
            (
+
            [MarshalAs(UnmanagedType.LPStr)] string pszPathRel,
+
            uint dwReserved
+
            );
+

          
+
        void Resolve
+
            (
+
            IntPtr hwnd,
+
            uint fFlags
+
            );
+

          
+
        void SetPath( [MarshalAs(UnmanagedType.LPStr)] string pszFile );
+
    }
+

          
+
    /// <summary>
+
    /// WIN32_FIND_DATAA 構造体
+
    /// </summary>
+
    [StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Ansi)]
+
    internal struct WIN32_FIND_DATAA
+
    {
+
        public const int MAX_PATH = 260;
+

          
+
        public uint     dwFileAttributes;
+
        public System.Runtime.InteropServices.FILETIME ftCreationTime;
+
        public System.Runtime.InteropServices.FILETIME ftLastAccessTime;
+
        public System.Runtime.InteropServices.FILETIME ftLastWriteTime;
+
        public uint     nFileSizeHigh;
+
        public uint     nFileSizeLow;
+
        public uint     dwReserved0;
+
        public uint     dwReserved1;
+
        
+
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_PATH)]
+
        public string cFileName;
+
        
+
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 14)]
+
        public string cAlternateFileName;
+
    }
+

          
+
    #endregion
+

          
+
    #endregion
+

          
+
    /// <summary>
+
    /// ショートカットに関する処理を行うためのクラスです。
+
    /// </summary>
+
    public sealed class ShellLink : IDisposable
+
    {
+
        // IShellLinkインターフェイス
+
        private IShellLinkW shellLinkW;
+
        private IShellLinkA shellLinkA;
+

          
+
        // カレントファイル
+
        private string currentFile;
+

          
+
        // 実行環境
+
        private bool isUnicodeEnvironment;
+

          
+
        // 各種定数
+
        internal const int MAX_PATH = 260;
+

          
+
        internal const uint SLGP_SHORTPATH   = 0x0001; // 短い形式(8.3形式)のファイル名を取得する
+
        internal const uint SLGP_UNCPRIORITY = 0x0002; // UNCパス名を取得する
+
        internal const uint SLGP_RAWPATH     = 0x0004; // 環境変数などが変換されていないパス名を取得する
+

          
+
        #region "[型] ShellLinkDisplayMode列挙型"
+

          
+
        /// <summary>
+
        /// 実行時のウィンドウの表示方法を表す列挙型です。
+
        /// </summary>
+
        public enum ShellLinkDisplayMode : int
+
        {
+
            /// <summary>通常の大きさのウィンドウで起動します。</summary>
+
            Normal = 1,
+

          
+
            /// <summary>最大化された状態で起動します。</summary>
+
            Maximized = 3,
+

          
+
            /// <summary>最小化された状態で起動します。</summary>
+
            Minimized = 7,
+
        }
+

          
+
        #endregion
+

          
+
        #region "[型] ShellLinkResolveFlags列挙型"
+

          
+
        /// <summary></summary>
+
        [Flags]
+
        public enum ShellLinkResolveFlags : int
+
        {
+
            /// <summary></summary>
+
            SLR_ANY_MATCH = 0x2,
+

          
+
            /// <summary></summary>
+
            SLR_INVOKE_MSI = 0x80,
+

          
+
            /// <summary></summary>
+
            SLR_NOLINKINFO = 0x40,
+

          
+
            /// <summary></summary>
+
            SLR_NO_UI = 0x1,
+

          
+
            /// <summary></summary>
+
            SLR_NO_UI_WITH_MSG_PUMP = 0x101,
+

          
+
            /// <summary></summary>
+
            SLR_NOUPDATE = 0x8,
+

          
+
            /// <summary></summary>
+
            SLR_NOSEARCH = 0x10,
+

          
+
            /// <summary></summary>
+
            SLR_NOTRACK = 0x20,
+

          
+
            /// <summary></summary>
+
            SLR_UPDATE  = 0x4
+
        }
+

          
+
        #endregion
+

          
+
        #region "コンストラクション・デストラクション"
+

          
+
        /// <summary>
+
        /// コンストラクタ
+
        /// </summary>
+
        /// <exception cref="COMException">IShellLinkインターフェイスを取得できませんでした。</exception>
+
        public ShellLink()
+
        {
+
            currentFile = "";
+

          
+
            shellLinkW = null;
+
            shellLinkA = null;
+

          
+
            try
+
            {
+
                if
+
                {
+
                    // Unicode環境
+
                    shellLinkW =;
+

          
+
                    isUnicodeEnvironment = true;
+
                }
+
                else
+
                {
+
                    // Ansi環境
+
                    shellLinkA =;
+

          
+
                    isUnicodeEnvironment = false;
+
                }
+
            }
+
            catch
+
            {
+
                throw new COMException( "IShellLinkインターフェイスを取得できませんでした。" );
+
            }
+
        }
+

          
+
        /// <summary>
+
        /// コンストラクタ
+
        /// </summary>
+
        /// <param name="linkFile">ショートカットファイル</param>
+
        public ShellLink( string linkFile ) : this()
+
        {
+
            Load( linkFile );
+
        }
+

          
+
        /// <summary>
+
        /// デストラクタ
+
        /// </summary>
+
        ~ShellLink()
+
        {
+
            Dispose();            
+
        }
+

          
+
        /// <summary>
+
        /// このインスタンスが使用しているリソースを解放します。
+
        /// </summary>
+
        public void Dispose()
+
        {
+
            if 
+
            {
+
                Marshal.ReleaseComObject( shellLinkW );
+
                shellLinkW = null;
+
            }
+

          
+
            if
+
            {
+
                Marshal.ReleaseComObject( shellLinkA );
+
                shellLinkA = null;
+
            }
+
        }
+

          
+
        #endregion
+

          
+
        #region "プロパティ"
+

          
+
        /// <summary>
+
        /// カレントファイル。
+
        /// </summary>
+
        public string CurrentFile
+
        {
+
            get { return currentFile; }
+
        }
+

          
+
        /// <summary>
+
        /// ショートカットのリンク先。
+
        /// </summary>
+
        public string TargetPath
+
        {
+
            get
+
            {        
+
                StringBuilder targetPath = new StringBuilder( MAX_PATH, MAX_PATH );
+
                
+
                if
+
                {
+
                    WIN32_FIND_DATAW data = new WIN32_FIND_DATAW();
+

          
+
                    shellLinkW.GetPath( targetPath, targetPath.Capacity, ref data, SLGP_UNCPRIORITY );
+
                }
+
                else
+
                {
+
                    WIN32_FIND_DATAA data = new WIN32_FIND_DATAA();
+

          
+
                    shellLinkA.GetPath( targetPath, targetPath.Capacity, ref data, SLGP_UNCPRIORITY );
+
                }
+
                
+
                return targetPath.ToString();
+
            }
+
            set
+
            {
+
                if
+
                {
+
                    shellLinkW.SetPath( value );
+
                }
+
                else
+
                {
+
                    shellLinkA.SetPath( value );
+
                }
+
            }
+
        }
+

          
+
        /// <summary>
+
        /// 作業ディレクトリ。
+
        /// </summary>
+
        public string WorkingDirectory
+
        {
+
            get
+
            {
+
                StringBuilder workingDirectory = new StringBuilder( MAX_PATH, MAX_PATH );
+

          
+
                if
+
                {
+
                    shellLinkW.GetWorkingDirectory( workingDirectory, workingDirectory.Capacity );
+
                }
+
                else
+
                {
+
                    shellLinkA.GetWorkingDirectory( workingDirectory, workingDirectory.Capacity );
+
                }
+

          
+
                return workingDirectory.ToString();
+
            }
+
            set
+
            {
+
                if
+
                {
+
                    shellLinkW.SetWorkingDirectory( value );    
+
                }
+
                else
+
                {
+
                    shellLinkA.SetWorkingDirectory( value );
+
                }
+
            }
+
        }
+

          
+
        /// <summary>
+
        /// コマンドライン引数。
+
        /// </summary>
+
        public string Arguments
+
        {
+
            get
+
            {
+
                StringBuilder arguments = new StringBuilder( MAX_PATH, MAX_PATH );
+

          
+
                if
+
                {
+
                    shellLinkW.GetArguments( arguments, arguments.Capacity );
+
                }
+
                else
+
                {
+
                    shellLinkA.GetArguments( arguments, arguments.Capacity );
+
                }
+

          
+
                return arguments.ToString();
+
            }
+
            set
+
            {
+
                if
+
                {
+
                    shellLinkW.SetArguments( value );    
+
                }
+
                else
+
                {
+
                    shellLinkA.SetArguments( value );
+
                }
+
            }
+
        }
+

          
+
        /// <summary>
+
        /// ショートカットの説明。
+
        /// </summary>
+
        public string Description
+
        {
+
            get
+
            {
+
                StringBuilder description = new StringBuilder( MAX_PATH, MAX_PATH );
+

          
+
                if
+
                {
+
                    shellLinkW.GetDescription( description, description.Capacity );
+
                }
+
                else
+
                {
+
                    shellLinkA.GetDescription( description, description.Capacity );
+
                }
+

          
+
                return description.ToString();
+
            }
+
            set
+
            {
+
                if
+
                {
+
                    shellLinkW.SetDescription( value );    
+
                }
+
                else
+
                {
+
                    shellLinkA.SetDescription( value );
+
                }
+
            }
+
        }
+

          
+
        /// <summary>
+
        /// アイコンのファイル。
+
        /// </summary>
+
        public string IconFile
+
        {
+
            get
+
            {
+
                int iconIndex = 0;
+
                string iconFile = "";
+

          
+
                GetIconLocation( out iconFile, out iconIndex );
+
                
+
                return iconFile;
+
            }
+
            set
+
            {
+
                int iconIndex = 0;
+
                string iconFile = "";
+

          
+
                GetIconLocation( out iconFile, out iconIndex );
+
                
+
                SetIconLocation( value, iconIndex );
+
            }
+
        }
+

          
+
        /// <summary>
+
        /// アイコンのインデックス。
+
        /// </summary>
+
        public int IconIndex
+
        {
+
            get
+
            {
+
                int iconIndex = 0;
+
                string iconPath = "";
+

          
+
                GetIconLocation( out iconPath, out iconIndex );
+
                
+
                return iconIndex;
+
            }
+
            set
+
            {
+
                int iconIndex = 0;
+
                string iconPath = "";
+

          
+
                GetIconLocation( out iconPath, out iconIndex );
+
                
+
                SetIconLocation( iconPath, value );
+
            }
+
        }
+

          
+
        /// <summary>
+
        /// アイコンのファイルとインデックスを取得する
+
        /// </summary>
+
        /// <param name="iconFile">アイコンのファイル</param>
+
        /// <param name="iconIndex">アイコンのインデックス</param>
+
        private void GetIconLocation( out string iconFile, out int iconIndex )
+
        {
+
            StringBuilder iconFileBuffer = new StringBuilder( MAX_PATH, MAX_PATH );
+
                
+
            if
+
            {
+
                shellLinkW.GetIconLocation( iconFileBuffer, iconFileBuffer.Capacity, out iconIndex );
+
            }
+
            else
+
            {
+
                shellLinkA.GetIconLocation( iconFileBuffer, iconFileBuffer.Capacity, out iconIndex );
+
            }
+

          
+
            iconFile = iconFileBuffer.ToString();
+
        }
+

          
+
        /// <summary>
+
        /// アイコンのファイルとインデックスを設定する
+
        /// </summary>
+
        /// <param name="iconFile">アイコンのファイル</param>
+
        /// <param name="iconIndex">アイコンのインデックス</param>
+
        private void SetIconLocation( string iconFile, int iconIndex )
+
        {
+
            if
+
            {
+
                shellLinkW.SetIconLocation( iconFile, iconIndex );
+
            }
+
            else
+
            {
+
                shellLinkA.SetIconLocation( iconFile, iconIndex );
+
            }
+
        }
+

          
+
        /// <summary>
+
        /// 実行時のウィンドウの大きさ。
+
        /// </summary>
+
        public ShellLinkDisplayMode DisplayMode
+
        {
+
            get
+
            {
+
                int showCmd = 0;
+

          
+
                if
+
                {
+
                    shellLinkW.GetShowCmd( out showCmd );    
+
                }
+
                else
+
                {
+
                    shellLinkA.GetShowCmd( out showCmd );
+
                }
+

          
+
                returnshowCmd;
+
            }
+
            set
+
            {
+
                if
+
                {
+
                    shellLinkW.SetShowCmd(;
+
                }
+
                else
+
                {
+
                    shellLinkA.SetShowCmd(;
+
                }
+
            }
+
        }
+

          
+
        /// <summary>
+
        /// ホットキー。
+
        /// </summary>
+
        public Keys HotKey
+
        {
+
            get
+
            {
+
                ushort hotKey = 0;
+

          
+
                if
+
                {
+
                    shellLinkW.GetHotkey( out hotKey );
+
                }
+
                else
+
                {
+
                    shellLinkA.GetHotkey( out hotKey );
+
                }
+

          
+
                returnhotKey;
+
            }
+
            set
+
            {
+
                if
+
                {
+
                    shellLinkW.SetHotkey(;
+
                }
+
                else
+
                {
+
                    shellLinkA.SetHotkey(;
+
                }
+
            }
+
        }
+

          
+
        #endregion
+

          
+
        #region "保存と読み込み"
+

          
+
        /// <summary>
+
        /// IShellLinkインターフェイスからキャストされたIPersistFileインターフェイスを取得します。
+
        /// </summary>
+
        /// <returns>IPersistFileインターフェイス。 取得できなかった場合はnull。</returns>
+
        private UCOMIPersistFile GetIPersistFile()
+
        {
+
            if
+
            {
+
                return shellLinkW as UCOMIPersistFile;
+
            }
+
            else
+
            {
+
                return shellLinkA as UCOMIPersistFile;
+
            }
+
        }
+

          
+
        /// <summary>
+
        /// カレントファイルにショートカットを保存します。
+
        /// </summary>
+
        /// <exception cref="COMException">IPersistFileインターフェイスを取得できませんでした。</exception>
+
        public void Save()
+
        {
+
            Save( currentFile );
+
        }
+

          
+
        /// <summary>
+
        /// 指定したファイルにショートカットを保存します。
+
        /// </summary>
+
        /// <param name="linkFile">ショートカットを保存するファイル</param>
+
        /// <exception cref="COMException">IPersistFileインターフェイスを取得できませんでした。</exception>
+
        public void Save( string linkFile )
+
        {
+
            // IPersistFileインターフェイスを取得して保存
+
            UCOMIPersistFile persistFile = GetIPersistFile();
+

          
+
            if;
+

          
+
            persistFile.Save( linkFile, true );
+

          
+
            // カレントファイルを保存
+
            currentFile = linkFile;
+
        }
+

          
+
        /// <summary>
+
        /// 指定したファイルからショートカットを読み込みます。
+
        /// </summary>
+
        /// <param name="linkFile">ショートカットを読み込むファイル</param>
+
        /// <exception cref="FileNotFoundException">ファイルが見つかりません。</exception>
+
        /// <exception cref="COMException">IPersistFileインターフェイスを取得できませんでした。</exception>
+
        public void Load( string linkFile )
+
        {
+
            Load( linkFile, IntPtr.Zero, ShellLinkResolveFlags.SLR_ANY_MATCH | ShellLinkResolveFlags.SLR_NO_UI, 1 );
+
        }
+

          
+
        /// <summary>
+
        /// 指定したファイルからショートカットを読み込みます。
+
        /// </summary>
+
        /// <param name="linkFile">ショートカットを読み込むファイル</param>
+
        /// <param name="hWnd">このコードを呼び出したオーナーのウィンドウハンドル</param>
+
        /// <param name="resolveFlags">ショートカット情報の解決に関する動作を表すフラグ</param>
+
        /// <exception cref="FileNotFoundException">ファイルが見つかりません。</exception>
+
        /// <exception cref="COMException">IPersistFileインターフェイスを取得できませんでした。</exception>
+
        public void Load( string linkFile, IntPtr hWnd, ShellLinkResolveFlags resolveFlags )
+
        {
+
            Load( linkFile, hWnd, resolveFlags, 1 );
+
        }
+

          
+
        /// <summary>
+
        /// 指定したファイルからショートカットを読み込みます。
+
        /// </summary>
+
        /// <param name="linkFile">ショートカットを読み込むファイル</param>
+
        /// <param name="hWnd">このコードを呼び出したオーナーのウィンドウハンドル</param>
+
        /// <param name="resolveFlags">ショートカット情報の解決に関する動作を表すフラグ</param>
+
        /// <param name="timeOut">SLR_NO_UIを指定したときのタイムアウト値(ミリ秒)</param>
+
        /// <exception cref="FileNotFoundException">ファイルが見つかりません。</exception>
+
        /// <exception cref="COMException">IPersistFileインターフェイスを取得できませんでした。</exception>
+
        public void Load( string linkFile, IntPtr hWnd, ShellLinkResolveFlags resolveFlags, TimeSpan timeOut )
+
        {
+
            Load( linkFile, hWnd, resolveFlags,;
+
        }
+
        
+
        /// <summary>
+
        /// 指定したファイルからショートカットを読み込みます。
+
        /// </summary>
+
        /// <param name="linkFile">ショートカットを読み込むファイル</param>
+
        /// <param name="hWnd">このコードを呼び出したオーナーのウィンドウハンドル</param>
+
        /// <param name="resolveFlags">ショートカット情報の解決に関する動作を表すフラグ</param>
+
        /// <param name="timeOutMilliseconds">SLR_NO_UIを指定したときのタイムアウト値(ミリ秒)</param>
+
        /// <exception cref="FileNotFoundException">ファイルが見つかりません。</exception>
+
        /// <exception cref="COMException">IPersistFileインターフェイスを取得できませんでした。</exception>
+
        public void Load( string linkFile, IntPtr hWnd, ShellLinkResolveFlags resolveFlags, int timeOutMilliseconds )
+
        {
+
            if;
+

          
+
            // IPersistFileインターフェイスを取得
+
            UCOMIPersistFile persistFile = GetIPersistFile();
+

          
+
            if;
+

          
+
            // 読み込み
+
            persistFile.Load( linkFile, 0x00000000 );
+

          
+
            // フラグを処理
+
            uint flags =resolveFlags;
+

          
+
            if
+
            {
+
                flags |=;
+
            }
+

          
+
            // ショートカットに関する情報を読み込む
+
            if
+
            {
+
                shellLinkW.Resolve( hWnd, flags );
+
            }
+
            else
+
            {
+
                shellLinkA.Resolve( hWnd, flags );
+
            }
+

          
+
            // カレントファイルを指定
+
            currentFile = linkFile;
+
        }
+

          
+
        #endregion
+
    }
+
}
+
}}
+

          
+
**メモ
+
以下は調査中に書いたメモ。
+

          
+
***ショートカットファイルを作成する
 
Windowsのショートカットファイル、.lnkファイルをC#で作成・編集するためのプログラムを書く。
Windowsのショートカットファイル、.lnkファイルをC#で作成・編集するためのプログラムを書く。
 

        

        
~
***解答
**解答
 
やろうとしていたことが、全てここ記述されている…
やろうとしていたことが、全てここ記述されている…
 

        

        
 
http://www.vbaccelerator.com/home/NET/Code/Libraries/Shell_Projects/Creating_and_Modifying_Shortcuts/article.asp
http://www.vbaccelerator.com/home/NET/Code/Libraries/Shell_Projects/Creating_and_Modifying_Shortcuts/article.asp
 

        

        
~
***調べてて参考になった
**調べてて参考になった
 
-IShellLinkインターフェイス関連の解説
-IShellLinkインターフェイス関連の解説
 
--http://techtips.belution.com/ja/vc/0032/
--http://techtips.belution.com/ja/vc/0032/
 
--http://yokohama.cool.ne.jp/chokuto/urawaza/interface/IShellLink/
--http://yokohama.cool.ne.jp/chokuto/urawaza/interface/IShellLink/
884,7 24,7
 
--http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpguide/html/cpcontlbimpmemberconversion.asp
--http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpguide/html/cpcontlbimpmemberconversion.asp
 
--http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpguide/html/cpconinheritanceaggregationcontainment.asp
--http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpguide/html/cpconinheritanceaggregationcontainment.asp
 

        

        
~
***まとめ
**まとめ
 
要はCOMとして用意されているIShellLinkW(A)やIPersistFileインターフェイスと、同等でマネージドなシグネチャを持つインターフェイスをC#で実装することで、COMと同じ機能を有することができる。 ただし、このときGUIDとInterfaceTypeを指定する必要がある。 たとえば、こんな感じ(コメントはもとのMIDLコード)。
要はCOMとして用意されているIShellLinkW(A)やIPersistFileインターフェイスと、同等でマネージドなシグネチャを持つインターフェイスをC#で実装することで、COMと同じ機能を有することができる。 ただし、このときGUIDとInterfaceTypeを指定する必要がある。 たとえば、こんな感じ(コメントはもとのMIDLコード)。
 
#code(cs){{
#code(cs){{
 
[Guid("000214F9-0000-0000-C000-000000000046")]
[Guid("000214F9-0000-0000-C000-000000000046")]
942,7 82,7
 

        

        
 
ひとまずこんな感じ。 インターフェイスのシグネチャを間違えて書かなければ問題なく動く。 あと、[In, Out]属性はref、[Out]属性はoutに変えられるから、C#の場合はそっちのキーワードに置き換えた方がコーディングしやすいかも。
ひとまずこんな感じ。 インターフェイスのシグネチャを間違えて書かなければ問題なく動く。 あと、[In, Out]属性はref、[Out]属性はoutに変えられるから、C#の場合はそっちのキーワードに置き換えた方がコーディングしやすいかも。
 

        

        
~
***補足、IPersistFileインターフェイスについて
**補足、IPersistFileインターフェイスについて
 
.NET FrameworkにはSystem.Runtime.InteropServices.UCOMIPersistFileインターフェイスなるものが存在している(http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/cpref/html/frlrfsystemruntimeinteropservicesucomipersistfileclasstopic.asp)。
.NET FrameworkにはSystem.Runtime.InteropServices.UCOMIPersistFileインターフェイスなるものが存在している(http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/cpref/html/frlrfsystemruntimeinteropservicesucomipersistfileclasstopic.asp)。
 

        

        
 
#code{{
#code{{

programming/tips/explorer_options/index.wiki.txt

current previous
1,7 1,8
 
${smdncms:keywords,エクスプローラ,オプション,スイッチ,explorer.exe}
${smdncms:keywords,エクスプローラ,オプション,スイッチ,explorer.exe}
~
${smdncms:tags,plat/win,lang/vb,lang/c#}
${smdncms:tags,plat/win}
 
*エクスプローラのオプションスイッチ
*エクスプローラのオプションスイッチ
~
explorer.exeを起動する際に引数を指定することで、様々な方法で起動することができる。 引数には次のようなものがある。 また、特殊なフォルダを開くこともできる。 

          
-
参考資料: http://opt-1.matsc.kyutech.ac.jp/explorer.html
 

        

        
 
 explorer.exe [/n],[/e] [(,)/root,[object]] [/select,[object]]
 explorer.exe [/n],[/e] [(,)/root,[object]] [/select,[object]]
 

        

        
9,80 10,3
 
:/e|Windows エクスプローラをデフォルトの表示設定(フォルダツリーもつく)で新しいウィンドウを開く. ","に続いて,表示したいフォルダを書かなければ,標準でCドライブが表示される.
:/e|Windows エクスプローラをデフォルトの表示設定(フォルダツリーもつく)で新しいウィンドウを開く. ","に続いて,表示したいフォルダを書かなければ,標準でCドライブが表示される.
 
:/root,[オブジェクト]|オブジェクトに指定した所をrootのように見せて表示する.この場合,オブジェクトのフォルダより上位のフォルダを表示しないので,そこには移れない.オブジェクトの所を半角スペースのみにすると,デスクトップがルートになる.
:/root,[オブジェクト]|オブジェクトに指定した所をrootのように見せて表示する.この場合,オブジェクトのフォルダより上位のフォルダを表示しないので,そこには移れない.オブジェクトの所を半角スペースのみにすると,デスクトップがルートになる.
 
:/select,[オブジェクト]|ウィンドウに,指定したフォルダ,ファイル,またはアプリケーションが選択された状態で表示する.
:/select,[オブジェクト]|ウィンドウに,指定したフォルダ,ファイル,またはアプリケーションが選択された状態で表示する.
+

          
+
#googleadunit
+

          
+
#code(vb){{
+
Imports System
+
Imports System.Diagnostics
+

          
+
Module MainModule
+

          
+
    Sub Main()
+

          
+
        ' ツリーなし
+
        Process.Start("explorer.exe", "/n,C:\")
+
        ' ツリー付き
+
        Process.Start("explorer.exe", "/e,C:\")
+

          
+
        ' ツリー付きルート指定
+
        Process.Start("explorer.exe", "/e,/root,C:\Windows")
+
        ' C:\を開いてC:\Windowsを選択
+
        Process.Start("explorer.exe", "/n,/select,C:\Windows")
+
        ' C:\Windows\を開いてC:\Windows\Explorer.exeを選択
+
        Process.Start("explorer.exe", "/n,/select,C:\Windows\Explorer.exe")
+

          
+
        ' マイコンピュータを開く
+
        Process.Start("explorer.exe", "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}")
+
        ' ゴミ箱を開く
+
        Process.Start("explorer.exe", "::{645FF040-5081-101B-9F08-00AA002F954E}")
+
        ' マイドキュメントを開く
+
        Process.Start("explorer.exe", "::{450D8FBA-AD25-11D0-98A8-0800361B1103}")
+

          
+
        ' マイドキュメントを開く(別の方法)
+
        Process.Start( "explorer.exe", Environment.GetFolderPath( Environment.SpecialFolder.Personal ) )
+

          
+
    End Sub
+

          
+
End Module
+
}}
+

          
+
#code(cs){{
+
using System;
+
using System.Diagnostics;
+

          
+
namespace Sample
+
{
+
    class Sample
+
    {
+
        public static void Main()
+
        {
+
            // ツリーなし
+
            Process.Start( "explorer.exe", "/n,C:\\" );
+
            // ツリー付き
+
            Process.Start( "explorer.exe", "/e,C:\\" );
+

          
+
            // ツリー付きルート指定
+
            Process.Start( "explorer.exe", "/e,/root,C:\\Windows" );
+
            // C:\を開いてC:\Windowsを選択
+
            Process.Start( "explorer.exe", "/n,/select,C:\\Windows" );
+
            // C:\Windows\を開いてC:\Windows\Explorer.exeを選択
+
            Process.Start( "explorer.exe", "/n,/select,C:\\Windows\\Explorer.exe" );
+

          
+
            // マイコンピュータを開く
+
            Process.Start( "explorer.exe", "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}" );
+
            // ゴミ箱を開く
+
            Process.Start( "explorer.exe", "::{645FF040-5081-101B-9F08-00AA002F954E}" );
+
            // マイドキュメントを開く
+
            Process.Start( "explorer.exe", "::{450D8FBA-AD25-11D0-98A8-0800361B1103}" );
+

          
+
            // マイドキュメントを開く(別の方法)
+
            Process.Start( "explorer.exe", Environment.GetFolderPath( Environment.SpecialFolder.Personal ) );
+
        }
+
    }
+
}
+
}}
+

          
+
-参考資料
+
--http://opt-1.matsc.kyutech.ac.jp/explorer.html
+

          

programming/tips/colorspaces/index.wiki.txt

current previous
1,122 1,117
~
${smdncms:keywords,カラースペース,色空間,変換,RGB,CMYK,HSV,表色系}
${smdncms:keywords,カラースペース,色空間,変換,RGB,CMYK,HSV,HSI,表色系}
~
${smdncms:tags,algo,lang/delphi,lang/vb,lang/c#}
${smdncms:tags,algo,lang/delphi,lang/vb}
 
*カラースペース変換式
*カラースペース変換式
+
ある表色系(色空間・カラースペース)から別の表色系に変換する式とサンプルなど。
 

        

        
~
-参考資料
-参考資料 http://www.joochan.com/rgb-convert.html
+
--[[色空間 - Wikipedia:http://ja.wikipedia.org/wiki/色空間]]
+
--[[YUVフォーマット及び YUVとRGBの変換:http://vision.kuee.kyoto-u.ac.jp/~hiroaki/firewire/yuv.html]]
 
-関連するページ
-関連するページ
 
--[[works/tools/junk/ColorModelPreview]]
--[[works/tools/junk/ColorModelPreview]]
+
--[[programming/mono/Mono.Simd]]
 

        

        
~
**代表的な表色系の種類
**RGB <-> YMC
+
:RGB|加法混色の表色系、R(赤)、G(緑)、B(青)の三原色の強さによって色を表す
+
:CMY|減法混色の表色系、C(シアン)、M(マゼンタ)、Y(黄)の三原色の濃度によって色を表す
+
:CMYK|黒の発色をよくするためにCMYを拡張してK(Key plate)の濃度を加えた表色系
+
印刷物などの表色に用いられ、シアン・マゼンタ・黄・黒のインクの濃度を表す
+
:HSV|H(hue,色相)、S(saturation,彩度),V(value,明度)の三要素によって色を表す
+
色相は環状の値で、通常0度から360度で表す
+
:YCbCr|Y(luma,輝度成分)とCb(blue-difference chroma,青の色差成分)、Cr(red-difference chroma,赤の色差成分)の三要素によって色を表す
+
動画処理などの映像技術に用いられる
+

          
+
**RGB⇄CMY
+
R, G, B, C, M, Yの値域が0〜255(8ビット)の場合。
 
#code{{
#code{{
-
Y = 255 - B
-
M = 255 - G
 
C = 255 - R
C = 255 - R
+
M = 255 - G
+
Y = 255 - B
 

        

        
 
R = 255 - C
R = 255 - C
 
G = 255 - M
G = 255 - M
 
B = 255 - Y
B = 255 - Y
-
       
-
ただし、R, G, B, Y, M, C : 0〜255
 
}}
}}
 

        

        
~
**RGB⇄CMYK
**RGB -> HSV
~
R, G, B, C, M, Y, Kの値域が0〜255(8ビット)の場合。
:H|Hue(色相)
~

          
:S|Saturation(彩度)
~
***RGB→CMYK
:V|Value(明度), Intensityとも
~
#code{{

          
~
K = min(255 - R, 255 - G, 255 - B)
#code(pas){{
~
C = 255 - R - K
 if R <= G then
~
M = 255 - G - K
 begin
~
Y = 255 - B - K
   if G <= B then max := B
~
}}
   else max := G;
-
 end
-
 else if R <= B then max := B
-
 else max := R;
-

          
-
 if R >= G then
-
 begin
-
   if G >= B then min := B
-
   else min := G;
-
 end
-
 else if R >= B then min := B
-
 else min := R;
-

          
-
 d := max - min;
-

          
-
 V := max;
-

          
-
 if d <> 0 then S := d * 255 / max
-
 else S := 0;
-

          
-
 if S = 0 then H := 0;
-
 else
-
 begin
-
   rt := max - R * 60 / d;
-
   gt := max - G * 60 / d;
-
   bt := max - B * 60 / d;
-

          
-
   if R = max then H := bt - gt;
-
   else if G = max then H := 120 + rt - bt;
-
   else H := 240 + gt - rt;
-

          
-
   if H < 0 then H := H + 360;
-
 end;
-
}}
-

          
-
**HSV -> RGB
-
#code(pas){{
-
 if S = 0 then
-
 begin
-
   R := V;  G := V;  B := V;
-
 end
-
 else
-
 begin
-
   ht := H * 6;
-
   d := ht mod 360;
-

          
-
   t1 := V * / 255;
-
   t2 := V * / 255;
-
   t3 := V * / 255;
-

          
-
   case ht div 360 of
-
   0:
-
     begin
-
       R := V;  G := t3; B := t1;
-
     end;
-
   1:
-
     begin
-
       R := t2; G := V;  B := t1;
-
     end;
-
   2:
-
     begin
-
       R := t1; G := V;  B := t3;
-
     end;
-
   3:
-
     begin
-
       R := t1; G := t2; B := V;
-
     end;
-
   4:
-
     begin
-
       R := t3; G := t1; B := V;
-
     end;
-
   else
-
     begin
-
       R := V;  G := t1; B := t2;
-
     end;
-
   end;
-
 end;
 

        

        
~
***CMYK→RGB
ただし、R, G, B, S, V : 0〜255
~
#code{{
                    H : 0〜359
+
R' = 255 - C - K
+
G' = 255 - M - K
+
B' = 255 - Y - K
+

          
+
R = max(0, R') // R' < 0のときは0、そうでないときはR'
+
G = max(0, G')
+
B = max(0, B')
 
}}
}}
 

        

        
~
**RGB⇄HSV
*VB.NETで実装
~
R, G, B, S, Vの値域が0〜255(8ビット)、Hの値域が0〜359の場合。
**構造体宣言
+

          
+
***RGB→HSV
+
#code{{
+
max = Max(R, G, B)
+
min = Min(R, G, B)
+

          
+
    max - min
+
S = ---------
+
       max
+

          
+
V = max
+

          
+
Rが最大のとき
+
             G - B
+
  H = 60 * --------- + 0
+
           max - min
+

          
+
Gが最大のとき
+
             B - R
+
  H = 60 * --------- + 120
+
           max - min
+

          
+
Bが最大のとき
+
             R - G
+
  H = 60 * --------- + 240
+
           max - min
+

          
+
ここでH < 0のとき
+
  H += 360
+
}}
+

          
+
***HSV→RGB
+
省略。 後述する実装例もしくは[[HSV色空間 - Wikipedia:http://ja.wikipedia.org/wiki/HSV%E8%89%B2%E7%A9%BA%E9%96%93]]を参照。
+

          
+
**RGB⇄YCbCr
+
***スケーリングされていないYCbCrの場合
+
#code{{
+
(Y ) =
+
(Cb) =
+
(Cr) =
+

          
+
(R ) =
+
(G ) =
+
(B ) =
+
}}
+

          
+
***スケーリングされたYCbCrの場合
+
R, G, Bの値域が0〜255(8ビット)、Yの値域が16〜235(8ビット)、Cb, Crの値域が16〜240(8ビット、128=色差なし)の場合。
+

          
+
#code{{
+
(Y ) =
+
(Cb) =
+
(Cr) =
+

          
+
(R ) =
+
(G ) =
+
(B ) =
+
}}
+

          
+
**VB.NETでのRGB, CMYK, HSV相互変換の実装例
+
***構造体宣言
 
それぞれのカラースペースでの色データを表す構造体を作成。
それぞれのカラースペースでの色データを表す構造体を作成。
 
#code(vb,RGB){{
#code(vb,RGB){{
 
''' <summary>
''' <summary>
248,15 243,15
 

        

        
 
}}
}}
 

        

        
~
#code(vb,HSV){{
#code(vb,HSI){{
 
''' <summary>
''' <summary>
~
''' HSV
''' HSI
 
''' </summary>
''' </summary>
 
<StructLayout(LayoutKind.Explicit)> _
<StructLayout(LayoutKind.Explicit)> _
~
Public Structure Hsv
Public Structure Hsi
 

        

        
~
    Public Shared ReadOnly White As Hsv
    Public Shared ReadOnly White As Hsi
~
    Public Shared ReadOnly Black As Hsv
    Public Shared ReadOnly Black As Hsi
 

        

        
 
    Public Const HueMin As Short = 0
    Public Const HueMin As Short = 0
 
    Public Const HueMax As Short = 359
    Public Const HueMax As Short = 359
264,31 259,31
 
    Public Const SaturationMin As Byte = 0
    Public Const SaturationMin As Byte = 0
 
    Public Const SaturationMax As Byte = 255
    Public Const SaturationMax As Byte = 255
 

        

        
~
    Public Const ValueMin As Byte = 0
    Public Const IntensityMin As Byte = 0
~
    Public Const ValueMax As Byte = 255
    Public Const IntensityMax As Byte = 255
 

        

        
 
    Shared Sub New()
    Shared Sub New()
 

        

        
~
        White = New Hsv(0, 0, ValueMax)
        White = New Hsi(0, 0, IntensityMax)
~
        Black = New Hsv(0, 0, ValueMin)
        Black = New Hsi(0, 0, IntensityMin)
 

        

        
 
    End Sub
    End Sub
 

        

        
 
    <FieldOffset(0)> Public H As Short
    <FieldOffset(0)> Public H As Short
 
    <FieldOffset(2)> Public S As Byte
    <FieldOffset(2)> Public S As Byte
~
    <FieldOffset(3)> Public V As Byte
    <FieldOffset(3)> Public I As Byte
 

        

        
~
    Public Overloads Function Equals(ByVal hsv As Hsv) As Boolean
    Public Overloads Function Equals(ByVal hsi As Hsi) As Boolean
 

        

        
~
        Return
        Return
 

        

        
 
    End Function
    End Function
 

        

        
~
    Private Sub New(ByVal h As Short, ByVal s As Byte, ByVal v As Byte)
    Private Sub New(ByVal h As Short, ByVal s As Byte, ByVal i As Byte)
 

        

        
 
        Me.H = h
        Me.H = h
 
        Me.S = s
        Me.S = s
~
        Me.V = v
        Me.I = i
 

        

        
 
    End Sub
    End Sub
 

        

        
296,7 291,7
 

        

        
 
}}
}}
 

        

        
~
***ColorConverter
**ColorConverter
 
変換メソッドとその他のユーティリティメソッドをもったクラスを作成。
変換メソッドとその他のユーティリティメソッドをもったクラスを作成。
 

        

        
 
#code(vb){{
#code(vb){{
380,48 375,48
 
    End Function
    End Function
 

        

        
 
    ''' <summary>
    ''' <summary>
~
    ''' HSVからRGBへの変換
    ''' HSIからRGBへの変換
 
    ''' </summary>
    ''' </summary>
~
    Public Shared Function ToRgb(ByVal hsv As Hsv) As Rgb
    Public Shared Function ToRgb(ByVal hsi As Hsi) As Rgb
 

        

        
 
        Dim rgb As New rgb()
        Dim rgb As New rgb()
 

        

        
~
        If hsv.S = 0 Then
        If hsi.S = 0 Then
 

        

        
~
            rgb.R = hsv.V
            rgb.R = hsi.I
~
            rgb.G = hsv.V
            rgb.G = hsi.I
~
            rgb.B = hsv.V
            rgb.B = hsi.I
 

        

        
 
        Else
        Else
 

        

        
~
            Const hueMax As Single = CSng(hsv.HueMax)
            Const hueMax As Single = CSng(hsi.HueMax)
~
            Const saturationMax As Single = CSng(hsv.SaturationMax)
            Const saturationMax As Single = CSng(hsi.SaturationMax)
 

        

        
~
            Dim ht As Integer = hsv.H * 6
            Dim ht As Integer = hsi.H * 6
~
            Dim d As Single = CSng(ht Mod hsv.HueMax)
            Dim d As Single = CSng(ht Mod hsi.HueMax)
~
            Dim t1 As Byte = CByte(hsv.V *
            Dim t1 As Byte = CByte(hsi.I *
~
            Dim t2 As Byte = CByte(hsv.V *
            Dim t2 As Byte = CByte(hsi.I *
~
            Dim t3 As Byte = CByte(hsv.V *
            Dim t3 As Byte = CByte(hsi.I *
 

        

        
~
            Select Case ht \ hsv.HueMax
            Select Case ht \ hsi.HueMax
 

        

        
 
                Case 0
                Case 0
~
                    rgb.R = hsv.V : rgb.G = t3 : rgb.B = t1
                    rgb.R = hsi.I : rgb.G = t3 : rgb.B = t1
 

        

        
 
                Case 1
                Case 1
~
                    rgb.R = t2 : rgb.G = hsv.V : rgb.B = t1
                    rgb.R = t2 : rgb.G = hsi.I : rgb.B = t1
 

        

        
 
                Case 2
                Case 2
~
                    rgb.R = t1 : rgb.G = hsv.V : rgb.B = t3
                    rgb.R = t1 : rgb.G = hsi.I : rgb.B = t3
 

        

        
 
                Case 3
                Case 3
~
                    rgb.R = t1 : rgb.G = t2 : rgb.B = hsv.V
                    rgb.R = t1 : rgb.G = t2 : rgb.B = hsi.I
 

        

        
 
                Case 4
                Case 4
~
                    rgb.R = t3 : rgb.G = t1 : rgb.B = hsv.V
                    rgb.R = t3 : rgb.G = t1 : rgb.B = hsi.I
 

        

        
 
                Case Else
                Case Else
~
                    rgb.R = hsv.V : rgb.G = t1 : rgb.B = t2
                    rgb.R = hsi.I : rgb.G = t1 : rgb.B = t2
 

        

        
 
            End Select
            End Select
 

        

        
451,32 446,32
 
    End Function
    End Function
 

        

        
 
    ''' <summary>
    ''' <summary>
~
    ''' RGBからHSVへの変換
    ''' RGBからHSIへの変換
 
    ''' </summary>
    ''' </summary>
~
    Public Shared Function ToHsv(ByVal rgb As Rgb) As Hsv
    Public Shared Function ToHsi(ByVal rgb As Rgb) As Hsi
 

        

        
~
        Dim hsv As New Hsv()
        Dim hsi As New hsi()
 

        

        
 
        Dim max As Short = GetGreatestValue(rgb.R, rgb.G, rgb.B)
        Dim max As Short = GetGreatestValue(rgb.R, rgb.G, rgb.B)
 
        Dim min As Short = GetSmallestValue(rgb.R, rgb.G, rgb.B)
        Dim min As Short = GetSmallestValue(rgb.R, rgb.G, rgb.B)
 

        

        
 
        Dim d As Single = CSng(max - min)
        Dim d As Single = CSng(max - min)
 

        

        
~
        hsv.V = CByte(max)
        hsi.I = CByte(max)
 

        

        
 
        If d = 0.0 Then
        If d = 0.0 Then
 

        

        
~
            hsv.S = 0
            hsi.S = 0
 

        

        
 
        Else
        Else
 

        

        
~
            hsv.S = CByte(d * 255.0F / CSng(max))
            hsi.S = CByte(d * 255.0F / CSng(max))
 

        

        
 
        End If
        End If
 

        

        
~
        If hsv.S = 0 Then
        If hsi.S = 0 Then
 

        

        
~
            hsv.H = 0
            hsi.H = 0
 

        

        
 
        Else
        Else
 

        

        
486,32 481,32
 

        

        
 
            If rgb.R = max Then
            If rgb.R = max Then
 

        

        
~
                hsv.H = bt - gt
                hsi.H = bt - gt
 

        

        
 
            ElseIf rgb.G = max Then
            ElseIf rgb.G = max Then
 

        

        
~
                hsv.H = 120S + rt - bt
                hsi.H = 120S + rt - bt
 

        

        
 
            Else
            Else
 

        

        
~
                hsv.H = 240S + gt - rt
                hsi.H = 240S + gt - rt
 

        

        
 
            End If
            End If
 

        

        
~
            If hsv.H < 0 Then hsv.H += 360S
            If hsi.H < 0 Then hsi.H += 360S
 

        

        
 
        End If
        End If
 

        

        
~
        Return hsv
        Return hsi
 

        

        
 
    End Function
    End Function
 

        

        
 
    ''' <summary>
    ''' <summary>
~
    ''' CMYKからHSVへの変換
    ''' CMYKからHSIへの変換
 
    ''' </summary>
    ''' </summary>
~
    Public Shared Function ToHsv(ByVal cmyk As Cmyk) As Hsv
    Public Shared Function ToHsi(ByVal cmyk As Cmyk) As Hsi
 

        

        
~
        Return ToHsv(ToRgb(cmyk))
        Return ToHsi(ToRgb(cmyk))
 

        

        
 
    End Function
    End Function
 

        

        
532,35 527,14
 
    End Function
    End Function
 

        

        
 
    ''' <summary>
    ''' <summary>
~
    ''' HSVからCMYKへの変換
    ''' HSIからCMYKへの変換
 
    ''' </summary>
    ''' </summary>
~
    Public Shared Function ToCmyk(ByVal hsv As Hsv) As Cmyk
    Public Shared Function ToCmyk(ByVal hsi As Hsi) As Cmyk
 

        

        
~
        Return ToCmyk(ToRgb(hsv))
        Return ToCmyk(ToRgb(hsi))
 

        

        
 
    End Function
    End Function
 

        

        
 
End Class
End Class
 
}}
}}
 

        

        
+
**C#でのYCbCr→RGB変換の実装例
+
この例でyuvはYUV422フォーマット(Y0CbY1Crの順)で格納されたピクセルへのbyte*型ポインタ、bgrはBGRの順で格納されるピクセルへのbyte*型ポインタを表す。
+
#code(cs){{
+
var y0 = +1.164f *;
+
var cb =;
+
var y1 = +1.164f *;
+
var cr =;
+

          
+
var db =;
+
var dg =;
+
var dr =;
+

          
+
*(bgr++) =;
+
*(bgr++) =;
+
*(bgr++) =;
+

          
+
*(bgr++) =;
+
*(bgr++) =;
+
*(bgr++) =;
+
}}
+

          

programming/netfx2/System.Windows.Forms.ApplicationContext/index.wiki.txt

current previous
1,150 0,0
+
${smdncms:keywords,System.Windows.Forms.ApplicationContext}
+
*System.Windows.Forms.ApplicationContext
+
ApplicationContextクラスを継承することで、アプリケーションスレッドの終了条件を定義する事ができる。 Application.Run()メソッドにApplicationContextクラスから派生したインスタンスを渡すことによりメッセージループの実行が開始する。 ApplicationContext.ExitThread()メソッドを呼び出すことでメッセージループの実行を終了することができる。
+

          
+
このクラスのインスタンスを用いてアプリケーションを開始することにより、ウィンドウを持たないアプリケーションでもメッセージループを持つことができるようになる。 MainFormプロパティを設定することによりウィンドウを持つこともできるが、ウィンドウが閉じてもExitThread()メソッドを呼び出さない限りメッセージループは終了せず、Application.Run()の呼び出しも終了しない。
+

          
+
#googleadunit
+

          
+
この例ではApplicationContextを継承したCalculatingApplicationというクラスを作成し、アプリケーションを起動している。 また、計算が終了した時点でクラス内からExitThread()メソッドを呼び出している。 これが呼び出された時点でアプリケーションが終了する。
+

          
+
#code(vb){{
+
Public Class CalculatingApplication
+

          
+
    Inherits System.Windows.Forms.ApplicationContext
+

          
+
    Public Sub New()
+

          
+
        MyBase.New()
+

          
+
    End Sub
+

          
+
    Public Sub Start()
+

          
+
        ' 計算を行うスレッドを起動する
+
        Dim thread As New System.Threading.Thread(AddressOf Calculate)
+

          
+
        thread.Start()
+

          
+
    End Sub
+

          
+
    Private Sub Calculate()
+

          
+
        Console.WriteLine("計算を開始します。")
+

          
+
        Dim count As Integer = 0
+

          
+
        Do
+

          
+
            count += 1
+

          
+
            System.Threading.Thread.Sleep(50)
+

          
+
        Loop Until
+

          
+
        ' スレッドのメッセージループを終了する
+
        MyClass.ExitThread()
+

          
+
        Console.WriteLine("計算が終了しました。")
+

          
+
    End Sub
+

          
+
    Protected Overrides Sub ExitThreadCore()
+

          
+
        Console.WriteLine("スレッドのメッセージループを終了します。")
+

          
+
        MyBase.ExitThreadCore()
+

          
+
    End Sub
+

          
+
End Class
+

          
+
Public Class MainClass
+

          
+
    Public Shared Sub Main()
+

          
+
        Dim app As New CalculatingApplication
+

          
+
        ' 計算を開始する
+
        app.Start()
+

          
+
        Console.WriteLine("現在のスレッドでメッセージループが開始されます。")
+

          
+
        ' CalculatingApplicationクラスのインスタンスを使用してアプリケーションを起動する
+
        System.Windows.Forms.Application.Run(app)
+

          
+
        Console.WriteLine("スレッドのメッセージループは終了しました。")
+

          
+
    End Sub
+

          
+
End Class
+
}}
+

          
+
#code(cs){{
+
public class CalculatingApplication : System.Windows.Forms.ApplicationContext
+
{
+
    public CalculatingApplication() : base() {}
+

          
+
    public void Start()
+
    {
+
        // 計算を行うスレッドを起動する
+
        System.Threading.Thread thread = new System.Threading.Thread( new System.Threading.ThreadStart( Calculate ) );
+

          
+
        thread.Start();
+
    }
+

          
+
    private void Calculate()
+
    {
+
        Console.WriteLine( "計算を開始します。" );
+

          
+
        int count = 0;
+

          
+
        do
+
        {
+
            count += 1;
+

          
+
            System.Threading.Thread.Sleep( 50 );
+

          
+
        } while;
+

          
+
        // スレッドのメッセージループを終了する
+
        this.ExitThread();
+

          
+
        Console.WriteLine( "計算が終了しました。" );
+
    }
+

          
+
    protected override void ExitThreadCore()
+
    {
+
        Console.WriteLine( "スレッドのメッセージループを終了します。" );
+

          
+
        base.ExitThreadCore();
+
    }
+
}
+

          
+
public class MainClass
+
{
+
    public static void Main()
+
    {
+
        CalculatingApplication app = new CalculatingApplication();
+

          
+
        // 計算を開始する
+
        app.Start();
+

          
+
        Console.WriteLine( "現在のスレッドでメッセージループが開始されます。" );
+

          
+
        // CalculatingApplicationクラスのインスタンスを使用してアプリケーションを起動する
+
        System.Windows.Forms.Application.Run( app );
+

          
+
        Console.WriteLine( "スレッドのメッセージループは終了しました。" );
+
    }
+
}
+
}}
+

          
+
#prompt(出力結果){{
+
現在のスレッドでメッセージループが開始されます。
+
計算を開始します。
+
スレッドのメッセージループを終了します。
+
スレッドのメッセージループは終了しました。
+
計算が終了しました。
+
Press any key to continue
+
}}