2017-05-02 10 views
0

나는 C#으로 미니 프로그램을 작성 중이며 컴퓨터에 설치 프로그램을 찾고 싶습니다. 난 예를 들어 있지만 작동하지 %를 발견 100C#으로 프로그램 목록을 어떻게 찾을 수 있습니까?

내 코드 : programName을 = CCleaner를

public static bool CheckProgram(string ProgramName) 
    { 
     bool status = false; 
     string registry_key = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";    
     using (RegistryKey key = Registry.LocalMachine.OpenSubKey(registry_key)) 
     { 
      foreach (string subkey_name in key.GetSubKeyNames()) 
      { 
       using (RegistryKey subkey = key.OpenSubKey(subkey_name)) 
       { 
        if (!string.IsNullOrEmpty(Convert.ToString(subkey.GetValue("DisplayName")))) 
        { 
         if (Convert.ToString(subkey.GetValue("DisplayName")).Contains(ProgramName)) 
          status = true; 
        } 
       } 
      } 
     } 
     return status; 
    } 

"CClenear"하지만 때 리터 쓰기 "자바"의 작업을 찾을 수없는 그 내 프로그램을 실행 리터. 내 컴퓨터에 % 100 CClenear이 설치되어 있음을 확신합니다. 자바, 마이크로 소프트 오피스, Gom Player는 발견되었지만 Ccleaner, Spotify 등은 발견되지 않았습니다. 내 잘못은 어디에서 도와 줄 수 있니? 감사.

+0

당신이 (key.GetSubKeyNames에서 무엇을 얻을 수 있습니까) – Yaman

+0

이 경우 감도가 될 수 발행물? –

+0

Regedit의 레지스트리를보고 레지스트리에 실제로 무엇이 있는지와 왜 검색에서 찾을 수 없는지 확인하는 것이 좋습니다. –

답변

0

먼저, 키가 있는지 다시 한번 확인하십시오. 모든 표시 이름을 파일에 쓰도록 코드를 변경 한 다음 원하는 파일을 검색 할 수 있습니다. 다음 코드는 목록에있는 모든 비어 있지 않은 표시 이름을 저장 한 다음 파일에 그 목록 (당신이 원하는 경우 다른 파일 경로를 지정) 작성합니다 :

string registryKey = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"; 
List<string>displayNames = new List<string>(); 

using (RegistryKey key = Registry.LocalMachine.OpenSubKey(registryKey)) 
{ 
    foreach (string subkeyName in key.GetSubKeyNames()) 
    { 
     using (RegistryKey productKey = key.OpenSubKey(subkeyName)) 
     { 
      var displayName = Convert.ToString(productKey.GetValue("DisplayName")); 

      if (!string.IsNullOrWhiteSpace(displayName)) displayNames.Add(displayName); 
     } 
    } 
} 

var fileName = @"c:\temp\DisplayNames.txt"; 
File.WriteAllLines(fileName, displayNames); 

지금 텍스트 파일을 열 수 있습니다 검색 할 정확한 이름을 찾으십시오 (실제로 존재하는 경우).


또 다른 옵션은 IndexOf 방법을 사용하여 대소 문자를 구분하지 않고 비교를하는 것입니다. IndexOf은 문자열 하나가 발견되면 0 기반 인덱스를 반환하거나 문자열을 찾을 수없는 경우 -1을 반환합니다. 또한 대소 문자를 구분하지 않고 검색 할 수있는 매개 변수가 필요합니다 (또한 시작 부분뿐만 아니라 검색어에 대한 전체 문자열을 검색합니다). 이에

if (Convert.ToString(subkey.GetValue("DisplayName")).Contains(ProgramName)) 

: :이 라인을 변경하여 원래의 코드에서이 작업을 수행 할 수 있습니다

if (Convert.ToString(subkey.GetValue("DisplayName")) 
    .IndexOf(ProgramName, StringComparison.OrdinalIgnoreCase) > -1) 
+0

당신의 코멘트를 감사하십시오 Rufus L, 나는 또한 동일한 결과를 생각한다 (나는 시도하고 그렇습니다 동일). Vikhram은 위에 썼습니다. 설치된 모든 프로그램은 "SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall"에 없습니다. 예를 들어 Spotify는 regedit에 다른 장소를 등록했습니다. 일부 프로그램을 보았는데 설치된 프로그램이 모두 나열되었습니다. 컴퓨터에 설치된 모든 프로그램을 나열하려면 어떻게합니까? 어쩌면 내가 이론을 바꿔야 할 것 같아. – Muhammed

+0

일부 프로그램은 사용자별로 설치됩니다. 사람들을 위해, 당신은 단지 사용자의 현재 로깅가 액세스 할 수있는 사람을 볼 수있을 것이다. 그들은 아래에 다음과 같습니다 대답으로 사용 : –

+0

이 표시 주시기 바랍니다 "사용을 (RegistryKey 키 = Registry.LocalMachine.OpenSubKey (registryKey))"와 " 사용 (RegistryKey 키 = Registry.CurrentUser.OpenSubKey (registry_key)) "를 해결했다. 감사. –