2014-10-09 21 views
0

我正在尋找一種方法來將一個exe和/或快捷方式固定到Windows 8.1任務欄(不在StartMenu中)而不依賴於動詞名稱。另一種方法將exe文件固定到Windows任務欄?

我做了一個研究,我唯一能找到的代碼示例樣this一點不工作,因爲他們是動詞名語言相關的,這意味着它會檢查標題爲「鎖定到任務欄」,然後調用它動詞,但該動詞不存在與其他語言的英文名稱,例如在西班牙語'引腳到任務欄'被翻譯爲'Anclar a la barra de tareas',我真的希望調用動詞解析其動詞 - 名稱不是執行此任務的唯一方式。

然後我想知道微軟的WindowsAPICodePack庫是否可以提供一種以更有效的方式執行此操作的方式,或者至少是以真正可行的方式執行此操作。

或者可能使用Windows API SendMessage函數?

任何想法?

+6

請記住,應用程序不應該這樣做。如果用戶自己不這樣做,那麼決定是否應該固定您的應用程序並不取決於您。 – 2014-10-09 02:40:24

+0

@哈里約翰斯頓謝謝你的建議,但我想要開發一個我個人使用的迷你工具,它應該通過OpenFile-Dialog來鎖定/取消固定選擇所需應用程序的外部應用程序,以管理我的環境。感謝您的評論 – ElektroStudios 2014-10-09 02:59:46

+0

儘管我使用的是WiX安裝程序,但遇到了同樣的需求。最後我放棄了,讓用戶做出決定。只是以爲我會分享[我的2美分的WiX上下文和事件,你可以追蹤註冊表項等](http://windows-installer-xml-wix-toolset.687559.n2.nabble.com/使用-Wix-to-pin-to-taskbar-and-pin-to-start-menu-td5518811.html)(也許退出進程監視器)。 – 2014-10-09 03:08:35

回答

0

就我所知,沒有官方的方式將應用程序固定到任務欄上(因爲我知道,所以我認爲你需要依靠這種冒險的方式和動詞)。但是你不需要(不應該)硬編碼它們;他們可以從shell32.dll庫資源字符串表中讀取。前段時間我爲Inno Setup寫了a script,可以安裝應用程序。通過使用這些動詞到任務欄(基於this thread)。該代碼的一部分是從shell32.dll庫中讀取必要的動詞,這就是我試圖轉換爲VB的東西(這是我第一次使用VB.NET,因此請拿下面的代碼來證明概念) :

Module Module1 

    Const SHELL32_STRING_ID_PIN_TO_TASKBAR As Int32 = 5386 
    Const SHELL32_STRING_ID_UNPIN_FROM_TASKBAR As Int32 = 5387 

    Private Declare Auto Function LoadLibrary Lib "kernel32.dll" (_ 
     ByVal lpLibFileName As String _ 
    ) As IntPtr 

    Private Declare Function FreeLibrary Lib "kernel32.dll" (_ 
     ByVal hLibModule As IntPtr _ 
    ) As Boolean 

    Private Declare Auto Function LoadString Lib "user32.dll" (_ 
     ByVal hInstance As IntPtr, _ 
     ByVal uID As Int32, _ 
     ByVal lpBuffer As String, _ 
     ByVal nBufferMax As Int32 _ 
    ) As Int32 

    Public Function TryGetVerbName(ByVal ID As Int32, ByRef VerbName As String) As Boolean 
     Dim Handle As IntPtr 
     Dim BufLen As Int32 
     Dim Buffer As String = Space(255) 

     Handle = LoadLibrary("shell32.dll") 
     If Not Handle.Equals(IntPtr.Zero) Then 
      Try 
       BufLen = LoadString(Handle, ID, Buffer, Buffer.Length) 
       If BufLen <> 0 Then 
        VerbName = String.Copy(Buffer) 
        Return True 
       End If 
      Finally 
       FreeLibrary(Handle) 
      End Try 
     End If 

     Return False 
    End Function 

    Sub Main() 
     Dim VerbName As String = String.Empty 

     If TryGetVerbName(SHELL32_STRING_ID_PIN_TO_TASKBAR, VerbName) Then 
      Console.WriteLine("Verb name for pin to taskbar: " + VerbName) 
     End If 

     If TryGetVerbName(SHELL32_STRING_ID_UNPIN_FROM_TASKBAR, VerbName) Then 
      Console.WriteLine("Verb name for unpin from taskbar: " + VerbName) 
     End If 

     Console.ReadLine() 
    End Sub 

End Module 
0

在您鏈接到的代碼示例中,可以查看動詞名稱& k,這是用於固定到任務欄的鍵盤快捷鍵。這不會改變不同的語言(我相信)。

所以在代碼示例更改此:

If (verb.Name = "Pin to Tas&kbar") _ 

這樣:

If (InStr(verb.name,"&k")>0) _ 

或類似的規定。

+1

西班牙語語言'Taskbar'單詞被翻譯爲'Barra de tareas',任何'K'字符,並且加速鍵'&'出現在'Barra'的'B'字符之前。我清楚地解釋說,我正在尋找一種替代方法來將一個元素固定到TaskBar中,而不是依賴於動詞的語言本地化。反正謝謝你。 – ElektroStudios 2014-10-09 02:55:53

2

Why is there no programmatic access to the Start menu pin list?

在Windows XP中,我們故意沒有給在開始菜單(以下簡稱「銷單」)的頂級編程訪問項目的 大膽的列表。 引腳列表供用戶放置自己喜歡的圖標。它不是地方 一個程序單方面決定,「我很酷,我是你的 最喜歡的圖標,我只知道它,所以我會把自己放在那裏,因爲,我很好, 。

因爲我們知道,當我們讓人們混淆針列表的時候,每個人都會將自己安裝進去,它會變成 毫無意義(和煩人)。

有什麼特別的磨損是有效的方案,作爲其一部分的 安裝,決定他們是太酷了,他們想成爲到處 確保您不會錯過最酷最驚人的計劃曾經 寫在人類的歷史,所以他們進入開始菜單, 進入快速項目,進入桌面,進入快速啓動,到您的收藏夾 ,接管作爲您的默認自動播放處理程序,甚至 掛出作爲一個圖標下一步到任務欄上的時鐘,以防萬一你錯過了所有這些其他地方 - 並且每次運行它們時,他們都會去,並重新創建這些圖標和設置,以防萬一你在使用 「意外丟失了他們」。

我討厭那些節目。


看起來是可能與Win7和上面的微軟Windows的外殼程序安裝:TaskbarLinks

你確實是關於動詞是特定語言正確,這裏是文檔,說明此Pin Items to the Start Menu or Windows 7 Taskbar via Script

每個動作的動詞都必須在腳本中改變,以便與其他語言一起使用。

對於自動部署,其中一些項目也可以通過在Windows Vista和更高的應答文件配置 。 Windows 7 提供了一個unattend.xml設置,最多可配置三個任務欄 固定項目(請參閱 自動安裝工具包文檔中的Microsoft-Windows-Shell-Setup中的任務欄鏈接)。 Windows Vista和 Windows 7都提供unattend.xml設置,以在「開始」菜單(StartPanelLinks的 Microsoft-Windows-Shell-Setup)中配置多達5個 「最近打開的程序」。但是,在 unattend.xml中都未提供將項目固定到「開始」菜單的方法。

+1

我不是要求開始菜單引腳列表,我要求TASKBAR引腳/取消引腳,您是否閱讀我的問題? – ElektroStudios 2014-10-09 03:15:34

+0

是的,我讀了它,並試圖刪除我的答案一分鐘前,因爲它的開始菜單(非任務欄)集中。我只是將你的問題歸零。不幸的是@ JohnRah的方法是我唯一知道的方法,而且他認爲'verb.Name'是語言中立的。 – 2014-10-09 03:33:30

+0

對不起,我錯過了你提到的@ JohnRa的方法,它在哪裏,你能把它鏈接嗎? PS:verb.name不是中性的,但也許可以通過中性名稱訪問/使用它們,這可能是一個很好的解決方案,我不知道。感謝您的幫助 – ElektroStudios 2014-10-09 03:40:51

相關問題