本人做一个程序,已在程序中利用注册表给系统右键菜单中增加了一项"发送到网盘",现想给这个选项绑定一个程序上的事件函数,不知道可否这样做?当然程序关闭时这个选项也会用注册表删除.请各高手指教,小弟将非常感激,谢谢~RegistryKey reg;
reg = Registry.ClassesRoot;
reg=reg.CreateSubKey(@"*\shell\myApp");
//创建新项myApp
reg.SetValue("","发送到网盘");
//设置项值
reg = Registry.ClassesRoot;
reg.CreateSubKey(@"*\shell\myApp\command");
//创建新项command
reg.SetValue("",Application.ExecutablePath+" %1"); //现只能给它执行一个程序了,想要让它触发程序中的一个事件
//设置command的值
reg.Close();
解决方案 »
- hyblusea领分吧
- 微软企业库调用oracle存储过程如何返回 【多个】 数据集?
- 帮忙看看,谢谢!
- iframe问题请教
- 请问varchar类型的默认值是什么???
- 小问题:想确认一下是不是两个DateTime相减后的就是经过的时间?
- 如何使DataGrid的最后会自动增加的那一行不显示?
- 如何用程序实现“关闭'系统还原'”的功能
- 求DataGrid中加HyperLink的例程,WinForm方面的,谢谢!
- 哪位老兄能提供一些报表打印的资料么?
- CSLA.Net 3.5 我在看测试程序PTWeb 当我保存中文之后数据库数据变成“?”英文没事,如何设置呢,还有CSLA的本地化是如何使用呢
- C# sql插入语句,操作都没有错,就是数据没插进去,什么回事啊?
1.指向另外一个程序,那个程序启动,收到参数后。查找你主程序并发送自定义消息,WPARAM传递一个字符串。你的主程序响应消息。就可以了。
2.还是启动主程序,但启动起来后,检查是否有其他实例运行了。如果有,同样的作为自定义消息,发送给主程序的另一个实例。
class Program
{
static void Main(string[] argv)
{
if(argv.Length > 0 )
{
string filename = argv[0]; // argv[0] == "%1" == the file name you right clicked
CopyToMyDrive( filename );
}
else
{
RegisterContextMenu();
Console.Read(); // press enter to unregister and exit.
UnRegisterContextMenu();
}
}
static void CopyToMyDrive( string filename )
{
// todo
}
}
当前程序(WinForm形式的)正在运行的时候,argv值获得了,可是我应该怎么让当前的程序窗体(Application.Run(new ShareFile());)激发,并执行窗体ShareFile的事件呢,如果能够如此,解决也就解决了!请高手再支招~
ShareFile sf = new ShareFile();
sf.SetCopyFileSource( filename ); //<---- for example
Application.Run( sf );class ShareFile : Form
{
public ShareFile()
{
InitializeComponent();
CopyToMyDrive( filename )
}
...
}
using System.Collections.Generic;
using System.Windows.Forms;
using System.Runtime.InteropServices;namespace TryFile
{
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread] static void Main(string[] argv)
{
Controls.ClassForms forms = new TryFile.Controls.ClassForms();
Boolean createdNew; //返回是否赋予了使用线程的互斥体初始所属权
System.Threading.Mutex instance = new System.Threading.Mutex(true, "MutexName", out createdNew); //同步基元变量
if (createdNew) //赋予了线程初始所属权,也就是首次使用互斥体
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new ShareFile());
instance.ReleaseMutex();
}
else
{
string filename = null;
string username = null;
string str=null;
if (argv.Length > 1)
{
filename = argv[0]; //从右键菜单获得的文件名路径
username = argv[1]; //网络发送的用户名,如aa;
str = "收到信息:" + filename + "和" + username;
}
//测试
MessageBox.Show("已经启动了一个程序,请先退出! " + str, "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
//***********************如下为设法找到当前运行窗体,并激活,但forms还不成功
foreach (System.Windows.Forms.Form form in forms)
{
if (form.Text.ToString() == "456")
{
ShareFile f = (form as ShareFile);
f.label1.Text = "OK";
f.Activate();
return;
}
}
//**************************************************
Application.Exit();
}
}
}
}
(第一次运行后,可以在"开始"->"运行" 中输入"E:\TryFile\TryFile\bin\Debug\TryFile.exe mydoc.doc aa)" 进行测试)希望高手再次指点,十分感激~加分~
2、用其他通讯机制,像.NET Remoting
3、还是直接在当前实例处理最方便,注册实例别碰需要的资源就可以了。
问题得到解决,参考:
C#用WM_COPYDATA消息来实现两个进程之间传递数据
http://www.iisol.cn/article.asp?id=105
http://bruce.in/p/324现做一个DLL类注入到explorer.exe进程里,在点击右键菜单时即用DLL进行进程之间的数据传递,从而在主窗体执行CopyToMyDrive(filename,user)操作,哈哈,感谢各位支持,一起探讨,共同进步~