admin管理员组文章数量:1561851
本文转载自:http://79100812.blog.51cto/2689556/1413486 作者:leslies2
非常感谢博主的不辞辛苦,图文并举,很详尽的一篇关于C#程序与注册表的介绍。
C#综合揭秘——通过修改注册表建立Windows自定义协议 2014-05-19 11:16:36 标签: 注册表 自定义协议 安装程序
属性 | 说明 |
---|---|
ClassesRoot | 定义文档的类型(或类)以及与那些类型关联的属性。该字段读取 Windows 注册表基项 HKEY_CLASSES_ROOT。 |
CurrentConfig | 包含有关非用户特定的硬件的配置信息。该字段读取 Windows 注册表基项 HKEY_CURRENT_CONFIG。 |
CurrentUser | 包含有关当前用户首选项的信息。该字段读取 Windows 注册表基项 HKEY_CURRENT_USER |
DynData | 已过时。包含动态注册表数据。该字段读取 Windows 注册表基项 HKEY_DYN_DATA。 |
LocalMachine | 包含本地计算机的配置数据。该字段读取 Windows 注册表基项 HKEY_LOCAL_MACHINE。 |
PerformanceData | 包含软件组件的性能信息。该字段读取 Windows 注册表基项 HKEY_PERFORMANCE_DATA。 |
Users | 包含有关默认用户配置的信息。该字段读取 Windows 注册表基项 HKEY_USERS。 |
方法 | 说明 |
---|---|
GetValue (String, String, Object) | 检索与指定的注册表项中的指定名称关联的值。如果在指定的项中未找到该名称,则返回您提供的默认值;或者,如果指定的项不存在,则返回 null。 |
SetValue(String, String, Object) | 设置指定的注册表项的指定名称/值对。如果指定的项不存在,则创建该项。 |
SetValue(String, String, Object, RegistryValueKind) | 通过使用指定的注册表数据类型,设置该指定的注册表项的名称/值对。如果指定的项不存在,则创建该项。 |
属性 | 说明 |
---|---|
Handle | 获取一个 SafeRegistryHandle 对象,该对象表示当前 RegistryKey 对象封装的注册表项。 |
Name | 检索项的名称。 |
SubKeyCount | 检索当前项的子项数目。 |
ValueCount | 检索项中值的计数。 |
View | 获取用于创建注册表项的视图。 |
方法 | 说明 |
---|---|
Close() | 关闭该项,如果该项的内容已修改,则将该项刷新到磁盘。 |
CreateSubKey(String) | 创建一个新子项或打开一个现有子项以进行写访问。 |
CreateSubKey(String, RegistryKeyPermissionCheck) | 使用指定的权限检查选项创建一个新子项或打开一个现有子项以进行写访问。 |
CreateSubKey(String, RegistryKeyPermissionCheck, RegistryOptions) | 使用指定的权限检查和注册表选项,创建或打开一个用于写访问的子项。 |
CreateSubKey(String, RegistryKeyPermissionCheck, RegistrySecurity) | 使用指定的权限检查选项和注册表安全性创建一个新子项或打开一个现有子项以进行写访问。 |
CreateSubKey(String, RegistryKeyPermissionCheck, RegistryOptions, RegistrySecurity) | 使用指定的权限检查选项、注册表选项和注册表安全性,创建或打开一个用于写访问的子项。 |
DeleteSubKey(String) | 删除指定的子项。 |
DeleteSubKey(String, Boolean) | 删除指定的子项,并指定在找不到该子项时是否引发异常。 |
DeleteSubKeyTree(String) | 递归删除子项和任何子级子项。 |
DeleteSubKeyTree(String, Boolean) | 以递归方式删除指定的子项和任何子级子项,并指定在找不到子项时是否引发异常。 |
DeleteValue(String) | 从此项中删除指定值。 |
DeleteValue(String, Boolean) | 从此项中删除指定的值,并指定在找不到该值时是否引发异常。 |
Flush() | 将指定的打开注册表项的全部特性写到注册表中。 |
GetSubKeyNames() | 检索包含所有子项名称的字符串数组。 |
GetValue(String) | 检索与指定名称关联的值。如果注册表中不存在名称/值对,则返回null。 |
GetValue(String, Object) | 检索与指定名称关联的值。如果未找到名称,则返回您提供的默认值。 |
GetValue(String, Object, RegistryValueOptions) | 检索与指定的名称和检索选项关联的值。如果未找到名称,则返回您提供的默认值。 |
SetValue(String, Object) | 设置指定的名称/值对。 |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
static
void
Main(
string
[] args)
{
//获取Machine根项
RegistryKey machine = Registry.LocalMachine;
//打开SOFTWARE项
RegistryKey software = machine.OpenSubKey(
"SOFTWARE"
,
true
);
//新项MyApplication项
RegistryKey myApplication = software.CreateSubKey(
"MyApplication"
);
RegistryKey subkey = myApplication.CreateSubKey(
"Path"
);
//新建键值,当键值名称为空时,将被设置为默认值
subkey.SetValue(
null
, Application.StartupPath);
subkey.SetValue(
"AppPath"
, Application.UserAppDataPath);
}
|
1 2 3 4 5 6 7 8 |
static
void
Main(
string
[] args)
{
//打开注册表子项
RegistryKey key = Registry.LocalMachine
.OpenSubKey(
"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"
,
true
);
//增加开机启动项
key.SetValue(
"Cmd"
,
"C:\\Windows\\System32\\cmd.exe"
);
}
|
1 2 3 4 5 |
static
void
Main(
string
[] args)
{
Console.WriteLine(
"Hello World"
);
Console.ReadKey();
}
|
-
1、在HKEY_CLASSES_ROOT下添加项MyApplication.
-
2、修改MyApplication项下的默认值输入"URL:(可为空)"。
-
3、在MyApplication项下再添加一个键值"URL Protocol"。(必要健,否则在IE浏览器中可能无法运行)
-
4、在MyApplication项下新建项"shell"
-
5、在shell项下新建项"open"
-
6、在open项下新建项"command"
-
7、修改command项的默认键值为MyApplication应用程序的路径 "D:\C# Projects\MyApplication.exe" "%1"
1 2 3 4 5 6 7 8 |
<
html
xmlns
=
"http://www.w3/1999/xhtml"
>
<
head
>
......
</
head
>
<
body
>
<
a
href
=
"MyApplication://command"
>Hello World</
a
>
</
body
>
</
html
>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
[DataContract]
public
class
Person
{
[DataMember]
public
int
ID;
[DataMember]
public
string
Name;
[DataMember]
public
int
Age;
}
class
Program
{
static
void
Main(
string
[] args)
{
if
(args !=
null
)
{
//获取输入参数
string
data = args[0].Split(
'&'
)[1];
//把JSON转换成Person对象
Person person = GetPerson(data);
//数据显示
Console.WriteLine(person.Name +
"'s age is:"
+ person.Age);
Console.ReadKey();
}
}
//数据转换
static
Person GetPerson(
string
data)
{
DataContractJsonSerializer serializer =
new
DataContractJsonSerializer(
typeof
(Person));
MemoryStream stream =
new
MemoryStream(Encoding.Unicode.GetBytes(data));
Person person = (Person)serializer.ReadObject(stream);
stream.Close();
return
person;
}
}
|
方法 | 说明 |
---|---|
Commit | 在派生类中重写时,完成安装事务。 |
Install | 在派生类中被重写时,执行安装。 |
OnAfterInstall | 引发 AfterInstall 事件。 |
OnAfterRollback | 引发 AfterRollback 事件。 |
OnAfterUninstall | 引发 AfterUninstall 事件。 |
OnBeforeInstall | 引发 BeforeInstall 事件。 |
OnBeforeRollback | 引发 BeforeRollback 事件。 |
OnBeforeUninstall | 引发 BeforeUninstall 事件。 |
OnCommitted | 引发 Committed 事件。 |
OnCommitting | 引发 Committing 事件。 |
Rollback | 在派生类中重写时,还原计算机的安装前状态。 |
Uninstall | 在派生类中重写时,移除安装。 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
[RunInstaller(
true
)]
public
partial
class
MyInstaller : Installer
{
public
MyInstaller()
:
base
()
{
//绑定完成安装事件的处理方法
this
.AfterInstall +=
new
InstallEventHandler(OnAfterInstall);
}
/// 加入安装完成后的处理方法
protected
override
void
OnAfterInstall(
object
sender, InstallEventArgs e)
{
CreateSn();
}
//在完成安装后建立一个sn文件,对该应用程序进行标识
private
void
CreateSn()
{
var
regKey = Registry.ClassesRoot.OpenSubKey(
"MyApplication"
,
true
);
if
(regKey !=
null
)
{
//根据注册表中的Path键值,获取系统在客户端的安装路径
string
path = regKey.GetValue(
"Path"
).ToString();
//建立sn文件
string
snPath = path +
"sn"
;
StreamWriter writer =
new
StreamWriter(snPath,
true
, Encoding.Unicode);
writer.Write(Guid.NewGuid().ToString());
writer.Close();
}
}
/// 重写安装过程方法
public
override
void
Install(IDictionary stateSaver)
{
base
.Install(stateSaver);
}
/// 重写卸载方法
public
override
void
Uninstall(IDictionary savedState)
{
base
.Uninstall(savedState);
}
/// 重写回滚方法
public
override
void
Rollback(IDictionary savedState)
{
base
.Rollback(savedState);
}
//重写提交方法
public
override
void
Commit(IDictionary savedState)
{
base
.Commit(savedState);
}
}
|
1 2 3 4 5 6 7 8 |
<
body
>
<
script
type
=
"text/javascript"
>
window.onload = function () {
var link = "MyApplication://command&{'ID':'1','Name':'Rose','Age':'26'}";
location.href = link;
}
</
script
>
</
body
>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
[DataContract]
public
class
Person
{
public
Person(
int
id,
string
name,
int
age)
{
ID = id;
Name = name;
Age = age;
}
[DataMember]
public
int
ID;
[DataMember]
public
string
Name;
[DataMember]
public
int
Age;
}
public
class
MyHandler : IHttpHandler
{
public
bool
IsReusable
{
get
{
return
true
; }
}
public
void
ProcessRequest(HttpContext context)
{
//通过QueryString获取id
string
data = context.Request.QueryString[
"id"
];
if
(data !=
null
)
{
int
id =
int
.Parse(data);
//根据id进行数据查找
foreach
(
var
person
in
DataSource())
{
if
(person.ID == id)
{
//把Person对象转化为JSON数据
string
json = ConvertToJson(person);
//输出自定义协议路径
context.Response.Write(GetUrl(json));
}
}
}
}
//获取自定义协议路径
private
string
GetUrl(
string
json)
{
return
"MyApplication://command&"
+ json;
}
//把Person对象转化为JSON
private
string
ConvertToJson(Person person)
{
DataContractJsonSerializer serializer =
new
DataContractJsonSerializer(
typeof
(Person));
MemoryStream stream =
new
MemoryStream();
serializer.WriteObject(stream, person);
byte
[] bytes = stream.ToArray();
stream.Close();
return
Encoding.ASCII.GetString(bytes);
}
//模拟数据源
private
IList<Person> DataSource()
{
IList<Person> list =
new
List<Person>();
Person person1 =
new
Person(1,
"Rose"
, 34);
list.Add(person1);
......
return
list;
}
}
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<
head
>
<
title
></
title
>
<
script
src
=
"Scripts/jquery-1.8.2.min.js"
type
=
"text/javascript"
></
script
>
</
head
>
<
body
>
<
a
name
=
"send"
id
=
"send"
href
=
"#"
>GetPerson</
a
>
<
script
type
=
"text/javascript"
>
$(function () {
$('#send').click(function () {
$.ajax({
type: "GET",
url: "MyHandler.ashx?id=1",
data: null,
dataType: null,
success: function (data) {
location.href = data;
}
});
});
});
</
script
>
</
body
>
</
html
>
|
版权声明:本文标题:C#综合揭秘——通过修改注册表建立Windows自定义协议 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dongtai/1727468695a1115982.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论