星期一, 11月 23, 2009

Shell.Applicatio Using C#

1,直接添加引用 %windir%\system32\Shell32.dll
Shell32.ShellClass sc = new Shell32.ShellClass();
sc.FileRun();
2,不用添加任何引用直接用反射 C#
//通过 ProgID 取得 com 对象类型
Type tShell =Type.GetTypeFromProgID("Shell.Application");
//实列对象
object oShell = Activator.CreateInstance(tShell);
//反射调用
tShell.InvokeMember("FileRun"
, BindingFlags.InvokeMethod | BindingFlags.Default
, null
, oShell
, null //如果有参数在这里 new object[]{参数一,参数二,参数三,....}
);

//释放对象
System.Runtime.InteropServices.Marshal.ReleaseComObject(oShell);

上面二個方式都可以實作,
不過比較起來的話,第一種的方法比較容易撰寫,
瞬間跟CCN大師請教一下就有了結果,
不過是神之手,不過還是記錄一下,避免忘記
以下是利用shell32控制網路連線自動連線方法,
不過只適用32位元以及繁體中文os,自已用的小工具就不考慮太多了XD,
用個timer就可以一直監控了!!
PS:記得加入參考  COM->Microsoft Shell Controls And Automation(SHELL32.dll)
/// <summary>
/// 保持連線
/// </summary>
/// <param name="connectionName">連線的裝置名稱</param>
void KeepConnection(string connectionName)
{
Shell32.ShellClass shell = new ShellClass();
//列出namespace代碼
//for (int i = 0; i < 100; i++)
//{
//    if (shell.NameSpace(i) != null)
//        this.listBox1.Items.Add("[" + i.ToString() + "]" + shell.NameSpace(i).Title);
//}

Folder applicationObj = shell.NameSpace(3);
//取得控制台清單
foreach (FolderItem fItem in applicationObj.Items())
{
//this.listBox1.Items.Add(fItem.Name);
if (fItem.Name == "網路連線")
{
if (fItem.IsFolder)
{
//這裡的轉換要注意一下
Folder network = (Folder)fItem.GetFolder;
//取得網路連線清單
foreach (FolderItem fItem2 in network.Items())
{
//this.listBox1.Items.Add(fItem2.Name);
if (fItem2.Name == connectionName)
{
//列出該項目右鍵選單
foreach (FolderItemVerb fivb in fItem2.Verbs())
{
//this.listBox1.Items.Add(fivb.Name);
if (fivb.Name.IndexOf("連線") > -1 && fivb.Name.IndexOf("預設") == -1 && fivb.Name.IndexOf("中斷") == -1)
fivb.DoIt();
}
}
}

}

}
}
}



以下是G大神提供的資料~
Reference:
C#调用dll文件中的函数的问题
minimizes all windows..
[VB.NET/ C#.Net / VC++.Net] 如何由程式開啟 IE 並進行會員登入
[C#][VB.NET]顯示桌面
C#怎么实现启用和禁用本地网卡?

沒有留言:

張貼留言

留個話吧:)

其他你感興趣的文章

Related Posts with Thumbnails