c# windows程式設計基礎

qy的部落格發表於2016-12-20

windows程式設計

這篇文章是寫作業時整理的,只有基礎,僅當加深記憶。有錯請提出!

windows登錄檔
windows服務
windows動態庫


環境

windows 10
VS 2013

windows登錄檔

windows登錄檔的概念,這裡就不詳細說明,網路上很多。
修改登錄檔,首先要許可權

 1. 在登錄檔中,把當前使用者的許可權提升到可以修改,新增,刪除。或者直接完全控制就行
 2. 直接使用管理員開啟VS就行(ps : 你的管理員有許可權)。

使用的是Microsoft.Win32中的RegistryKey
我把使用登錄檔的時候需要的屬性封轉了一下

    /* 登錄檔操作        */
    class RegistryOperation
    {
        private RegistryKey rootKey;  // 登錄檔根鍵
        private string keyName;       // 子項名稱
        private string name;          // 項中值名稱
        private string value;         // 值的資料
        private RegistryValueKind type;  //  值資料的型別
    }

建立和開啟登錄檔項

/* 建立登錄檔項 並返回*/
public RegistryKey GetRegsitryKey()
{
    RegistryKey key;
    try{
        key = rootKey.OpenSubKey(this.keyName,true);
    }
    catch (System.ArgumentNullException)
    {
       key = rootKey.CreateSubKey(this.keyName);
    }
    return key;
} 

刪除登錄檔項的子項,這個沒有封轉(ps : 沒有需求)
函式:
RegistryKey.deleteSubKey(String);

設定,獲取,刪除 項中的值

public void setRegisteyValue(){
   RegistryKey key = this.getRegsitryKey();
key.SetValue(this.name,this.value,this.type);
   key.Flush();
   key.Close();
}
public string getRegistryValue()
{
   string info = "";
   RegistryKey key = this.getRegsitryKey();
   info = key.GetValue(this.name).ToString();
   key.Flush();
   key.Close();
   return info;
}
public void deleteRegistryValue()
{
   RegistryKey key = this.getRegsitryKey();
   key.DeleteValue(this.name);
   key.Flush();
   key.Close();
}

判斷子項是否存在

public bool isRegeditKeyExist()
{
   RegistryKey key = this.getRegsitryKey();
   string[] valuesNames = key.GetSubNames();
   foreach (string _value in valuesNames)
   {
      if (_value == this.name)
      {
          key.Close();
          return true;
      }
   }
   key.Close();
   return false;
}

判斷項中是否有某個值

public bool isRegeditValueExist()
{
   RegistryKey key = this.getRegsitryKey();
   string[] values =  key.GetValueNames();
   foreach (string _value in values)
   {
      if (_value == this.name)
      {
          key.Close();
          return true;
       }
    }
    key.Close();
    return false;
}

Demo : 設定登錄檔編輯器是否可用

/*  true : 可用,false: 禁止  */
public void registry_setRegeditEdit(bool ifEdit)
    string keyName = @"Software\Microsoft\Windows\CurrentVersion\Policies\System";
    string name = @"DisableRegistryTools";
    string value = ifEdit == true ? 1 : 0;
    RegistryKey rootKey = Registry.CurrentUser;
    RegistryOperation registry = new RegistryOperation(rootKey,keyName,name,value,RegistryValueKind.DWord);
    registry.setRegisteyValue();
    rootKey.Flush();
    rootKey.Close();
    return result;
}

windows服務

建立服務工程後,Service 繼承 ServiceBase
有2個繼承函式

  1. protected override void OnStart(string[] args)
    服務啟動的時候,執行
  2. protected override void OnStop()
    服務關閉的時候執行

安裝程式屬性設定

  1. WindowsService1
    Name : 名稱
    Description: 在服務安裝後顯示的簡介
    DisplayName:在服務安裝後顯示的名稱
    ServiceName : 之前建立的服務(Service : ServiceBase)
    StartType: 啟動型別 (一般:Automatic)
  2. serviceProcessinstaller1
    Name : 名稱
    Account : 賬戶 (一般 : localSystem),這個不設定正確,服務可以啟動不了

安裝服務

服務的安裝程式是.NET 提供的
位置:C:\Windows\Microsoft.NET\Framework\v4.0.30319
這個是我的電腦的.NET的位置(系統不一樣找找就好)
裡面有一個installUtil.exe 的程式就是我們想要的。
安裝之前先要把服務程式生成解決方案(生成exe程式)

安裝的時候需要管理員啟動DOS
命令如下 : C:\Windows\Microsoft.NET\Framework\v4.0.30319\installutil f:\dataspace\vs2013\WindowsService1\WindowsService1\bin\Debug\WindowsService1.exe
(這是我的程式的位置)

看起來特別麻煩
把C:\Windows\Microsoft.NET\Framework\v4.0.30319新增到環境變數的Path裡面就好了
installutil ..\..\WindowsService1.exe

解除安裝服務

命令: installutil /u .\..\WindowsService1.exe
注意是/u 不是 \u 。

windows動態庫

建立類庫工程,程式就和平常的一樣,生成解決方案就可以得到dll檔案

呼叫dll
在新建的工程中 新增 引用 找到之前的dll檔案
雙擊,就可以看到程式
using dll_name; 就可以使用了。

相關文章