自定義檔案雙擊開啟事件

2021-06-19 13:02:10 字數 3858 閱讀 2137

自定檔案雙擊開啟事件,需要在登錄檔中註冊檔案的圖示,檔案開啟的啟動軟體路徑。

首先,登錄檔中新增描述、圖示、啟動軟體路徑

**如下:為操作登錄檔的事件

using system;

using system.collections.generic;

using system.text;

using microsoft.win32;

namespace ultrauv

if (null == hkroot.opensubkey(strfiletype))

else

// 登錄檔中尚未關聯指定的檔案型別,註冊檔案型別並進行關聯

registrykey pgid = hkroot.createsubkey(strfiletype);

if (pgid == null)

// 檔案型別描述

pgid.setvalue("", strdescription, registryvaluekind.string);

// 關聯圖示

registrykey defaulticon = pgid.createsubkey("defaulticon");

if (defaulticon == null)

// 設定圖示

defaulticon.setvalue("", striconpath, registryvaluekind.string);

defaulticon.close();

// 關聯相關動作

// 建立shell子鍵

registrykey shell = pgid.createsubkey("shell");

if (shell == null)

// 建立開啟子鍵

registrykey open = shell.createsubkey("open");

if (open == null)

// 建立開啟子鍵

registrykey command = open.createsubkey("command");

if (command == null)

// 設定開啟程式

command.setvalue("", "\"" + stropenexe + "\" \"%1\"", registryvaluekind.string);

// 逐級關閉登錄檔

command.close();

open.close();

shell.close();

pgid.close();

hkroot.close();

}/**/

///

/// getfiletypereginfo 得到指定檔案型別關聯資訊

///

public static cfiletypereginfo getfiletypereginfo(string extendname)

cfiletypereginfo creginfo = new cfiletypereginfo(extendname);

string strrelationname = extendname.substring(1, extendname.length - 1).toupper() + "_filetype";

registrykey crelationkey = registry.classesroot.opensubkey(strrelationname);

creginfo.strdescription = crelationkey.getvalue("").tostring();

registrykey ciconkey = crelationkey.opensubkey("defaulticon");

creginfo.stricopath = ciconkey.getvalue("").tostring();

registrykey cshellkey = crelationkey.opensubkey("shell");

registrykey copenkey = cshellkey.opensubkey("open");

registrykey ccommandkey = copenkey.opensubkey("command");

string strtemp = ccommandkey.getvalue("").tostring();

creginfo.strexepath = strtemp.substring(0, strtemp.length - 3);

return creginfo;

}/**/

///

/// updatefiletypereginfo 更新指定檔案型別關聯資訊

///

public static bool updatefiletypereginfo(cfiletypereginfo reginfo)

string strextendname = reginfo.strextendname;

string strrelationname = strextendname.substring(1, strextendname.length - 1).toupper() + "_filetype";

registrykey crelationkey = registry.classesroot.opensubkey(strrelationname, true);

crelationkey.setvalue("", reginfo.strdescription);

registrykey ciconkey = crelationkey.opensubkey("defaulticon", true);

ciconkey.setvalue("", reginfo.stricopath);

registrykey cshellkey = crelationkey.opensubkey("shell");

registrykey copenkey = cshellkey.opensubkey("open");

registrykey ccommandkey = copenkey.opensubkey("command", true);

ccommandkey.setvalue("", reginfo.strexepath + " %1");

crelationkey.close();

return true;

}/**/

///

/// filetyperegistered 指定檔案型別是否已經註冊

///

public static bool filetyperegistered(string extendname)

return false;}}

}其次呼叫,登錄檔的操作事件,註冊登錄檔

圖示的排序是按照圖示在資源檔案的順序排列的,如下圖,0號圖示就為ultrauv project.ico.ico。

為了註冊完成後,自定義檔案的圖示能夠及時更新,使用api函式實現,在註冊完後呼叫shchangenotify()函式,更新圖示。

[system.runtime.interopservices.dllimport("shell32.dll")]

public static extern void shchangenotify(uint weventid, uint uflags, intptr dwitem1, intptr dwitem2);

shchangenotify(0x8000000, 0, intptr.zero, intptr.zero);

為了能夠找到圖示的位置,還需要設定專案中資源檔案路徑:

專案-->屬性-->應用程式-->資源檔案

自定義樹節點雙擊事件

1 最後一次觸發節點id 2var lastselectednodeid null 3 最後一次觸發時間 4var lastselecttime null 5 6 在這裡自定義雙擊需要實現的功能 7function doubliclick data 1011 clicknode單擊事件 12func...

雙擊事件無反應和chart自定義datatip

定義雙擊事件無反應 寫好了雙擊事件的解決方法 同事也監聽滑鼠的雙擊事件 但是雙擊的時候還是沒反應 看了乙個帖子說是預設是不支援雙擊事件的 需要把doubleclickenabled屬性設定為true 接下來是 http blog.csdn.net xiang08 archive 2009 04 24...

給自定義控制項新增單擊和雙擊事件

using system using system.collections.generic using system.linq using system.net using system.windows using system.windows.controls using system.windo...