2015-12-04 7 views
1

Я написал программу, которая меняет тему Windows, но после изменения окна персонализации темы остается открытой, и я хочу ее закрыть. Я попытался использовать process.kill() со знакомым именем процесса, но это не сработало. Спасибо.Закрытие окна персонализации с помощью C#

код для того, что я делаю, как показано ниже:

ProcessStartInfo theinfo = new ProcessStartInfo(themepath + "aero.theme"); 
theinfo.CreateNoWindow = true; 
Process thepr = new Process(); 
thepr.StartInfo = theinfo; 
thepr.Start(); 

где «themepath» является строка место для aero.theme. Я даже включил CreateNoWindow в true, а затем он открывает персонализацию для изменения темы, но не закрыл ее автоматически.

+0

Покажите нам свой код. – Russ

ответ

0

Вам необходимо получить дескриптор окна по его названию, а затем отправить его тесное сообщение. Это не позволяет убить любые процессы. См. this article для получения информации о получении окон. См. this one для закрытия окон из ручки.

После просмотра кода и небольшого перекопа, вы можете выполнить это с помощью двух изменений реестра. Вы должны прочитать это article и просто попросите вашу программу отредактировать два раздела реестра.

+0

Я пробовал это, но он тоже не работает. Я также немного запутался со ссылкой на вторую статью, которую вы указали для закрытия окон из дескриптора. Спасибо за помощь. – Aryan

+0

Теперь, когда я вижу ваш код, я вижу, что у вас нет окна для закрытия. Поскольку вы запускаете из ассоциации файлов, а не какой-либо конкретный исполняемый файл, ваш процесс, вероятно, будет explorer.exe, который Windows защищает вас от убийства. Вероятно, вы должны изменить свою тему через реестр и не пытаться автоматизировать проводник Windows. –

2

Первое окно использование находкой, чтобы получить окно от их имени с помощью FindWindow ..

[DllImport("user32.dll")] 
    public static extern int FindWindow(string lpClassName,string lpWindowName); 

Он возвращает вам дескриптор окна, который вы хотите, теперь вы можете использовать отправить сообщение, чтобы закрыть его ..

[DllImport("User32.dll")] 
    public static extern int SendMessage(int hWnd, uint Msg, int wParam, int lParam); 
    public const int WM_SYSCOMMAND = 0x0112; 
    public const int SC_CLOSE = 0xF060; 
     private void closeWindow() 
     { 
      // retrieve the handler of the window 
      int iHandle = FindWindow("CabinetWClass", "Personalization"); 
      if (iHandle > 0) 
      { 
       SendMessage(iHandle, WM_SYSCOMMAND, SC_CLOSE, 0); 
      } 
      }