2011-07-29 2 views
3

Win7에서 아이콘을 프로그래밍 방식으로 고정하는 것이 허용되지 않는 것처럼 보일 수도 있습니다 (여기에 : http://msdn.microsoft.com/en-us/library/dd378460(v=VS.85).aspx). 일부 VB 스크립트에서는이를 수행하는 몇 가지 방법이 있습니다.lnk 파일을 이기기 위해 C#을 사용하여 작업 표시 줄

볼 수 있듯이
private static void PinUnpinTaskBar(string filePath, bool pin) 
{ 
if (!File.Exists(filePath)) throw new FileNotFoundException(filePath); 

// create the shell application object 
dynamic shellApplication = Activator.CreateInstance(Type.GetTypeFromProgID("Shell.Application")); 

string path = Path.GetDirectoryName(filePath); 
string fileName = Path.GetFileName(filePath); 

dynamic directory = shellApplication.NameSpace(path); 
dynamic link = directory.ParseName(fileName); 

dynamic verbs = link.Verbs(); 
for (int i = 0; i < verbs.Count(); i++) 
    { 
     dynamic verb = verbs.Item(i); 
     string verbName = verb.Name.Replace(@"&", string.Empty).ToLower(); 

     if ((pin && verbName.Equals("pin to taskbar")) || (!pin && verbName.Equals("unpin from taskbar"))) 
     { 

      verb.DoIt(); 
     } 
    } 

    shellApplication = null; 
} 

, 코드가 .NET 프레임 워크 4.0 기능을 사용한다 : 누군가가이 같은 C#으로이 일을하는 방법을 발견했다. 제가 물어보고 싶은 질문은 :이 기능을 변형시켜 3.5 프레임 워크를 사용하여 똑같은 것을 만들 수 있습니까? 어떤 아이디어? 감사합니다.

+0

사용자가 이미 프로그램을 작업 표시 줄에 고정시킬 수 있습니다. 왜 다른 방법을 고안해야합니까? –

답변

0

dynamic의 사용을 제거하고 반사 전화로 교체하십시오. 추악한데 .NET 3.5에서 컴파일 할 수 있는지 테스트하는 것 이상으로 테스트하지는 않았지만이 방법을 사용하십시오. 이미 없으면 using System.Reflection;을 수업에 추가해야합니다.

private static void PinUnpinTaskBar(string filePath, bool pin) 
{ 
    if (!File.Exists(filePath)) throw new FileNotFoundException(filePath); 

    // create the shell application object 
    var shellType = Type.GetTypeFromProgID("Shell.Application"); 

    var shellApplication = Activator.CreateInstance(shellType); 

    string path = Path.GetDirectoryName(filePath); 
    string fileName = Path.GetFileName(filePath); 

    var directory = shellType.InvokeMember("Namespace", BindingFlags.InvokeMethod, null, shellApplication, new object[] { path }); 
    var link = directory.GetType().InvokeMember("ParseName", BindingFlags.InvokeMethod, null, directory, new object[] {fileName}); 
    var verbs = link.GetType().InvokeMember("Verbs", BindingFlags.InvokeMethod, null, link, new object[] { }); 

    int verbsCount = (int)verbs.GetType().InvokeMember("Count", BindingFlags.InvokeMethod, null, verbs, new object[] { }); 

    for (int i = 0; i < verbsCount; i++) 
    { 
     var verb = verbs.GetType().InvokeMember("Item", BindingFlags.InvokeMethod, null, verbs, new object[] { i }); 

     var namePropertyValue = (string)verb.GetType().GetProperty("Name").GetValue(verb, null); 
     var verbName = namePropertyValue.Replace(@"&", string.Empty).ToLower(); 

     if ((pin && verbName.Equals("pin to taskbar")) || (!pin && verbName.Equals("unpin from taskbar"))) 
     { 

      verbs.GetType().InvokeMember("DoIt", BindingFlags.InvokeMethod, null, verbs, new object[] { }); 
     } 
    } 

    shellApplication = null; 
} 
+0

오류 코드 DISP_E_MEMBERNOTFOUND가있는 ComException을 throw합니다. – msbg

관련 문제