2013-11-24 28 views
1

我正在學習Wix來構建安裝程序。Wix按鈕將文本複製到剪貼板,使用自定義操作,不工作

在自定義對話框中,我有一個控件,其類型是文本,並且我有一個按鈕。 我想單擊按鈕將文本複製到剪貼板中。

這裏是代碼。 首先是控件。

<Control Id="AboutUsInfo" Type="Text" Property="AboutUsText" 
        X="150" Y="20" Width="140" Height="150"> 
       <Text SourceFile="sample\info2.txt" /> 
      </Control> 
<Control Id="CopyAboutUsButton" Type="PushButton" Text="Copy to the clipboard" 
        X="100" Y="180" Width="80" Height="17"> 
       <Publish Event="DoAction" Value="CopyAboutUsAction"></Publish> 
      </Control> 

<Binary Id="Customactions" SourceFile="sample\CustomAction1.CA.dll"></Binary> 

這裏是CustomAction。

<CustomAction Id="CopyAboutUsAction" BinaryKey="Customactions" DllEntry="CopyToClipboard" Return="ignore"> 
    </CustomAction> 

現在的C#代碼

namespace CustomAction1 
{ 
public class CustomActions 
{ 
    [CustomAction] 
    public static ActionResult CopyToClipboard(Session session) 
    { 
     session.Log("Begin Copy"); 
     String s=session["AboutUsText"]; 
     Clipboard.SetText("this is copy"); 
     return ActionResult.Success; 
    } 
} 
} 

的問題是,每次我按一下按鈕,我的安裝什麼都不說。我的剪貼板中沒有任何反應。 我該如何做這項工作?

+0

很可能它無法找到DLL或無法加載它。使用日誌記錄運行安裝:'msiexec/i package.msi/l * v package.log'。你應該明白爲什麼在'package.log'文件中中止安裝。 –

+0

這就是問題所在,它說什麼都沒有!沒有錯,沒有錯,只是執行的自定義操作,並返回值1.它甚至沒有一個名爲「Begin Copy」的項,它在CustomAction函數中定義。總習慣不起作用。我將返回屬性設置爲忽略,現在它不會因錯誤而退出。 – cdytoby

+0

通過按下按鈕,在安裝過程中將某些內容複製到剪貼板的要求聽起來很奇怪......您是否考慮過任何替代方案?也許,最好只使用MSI屬性來傳遞數據? –

回答

0

我已經解決了這個問題。我需要啓動一個新線程,以便該線程是STA。它的工作。謝謝所有添加了評論的人。

public class CustomActions 
{ 
    [CustomAction] 
    public static ActionResult CopyToClipboard(Session session) 
    { 
     ActionResult ar=ActionResult.Success; 
     session.Log("Begin CopyToClipboard"); 
     //MessageBox.Show("Begin Copy"); 
     string str="abcde"; 
     MessageBox.Show(" "+str); 
     try 
     { 
      Thread th=new Thread(new ParameterizedThreadStart(ClipboardThread)); 
      th.SetApartmentState(ApartmentState.STA); 
      th.Start(str); 
      th.Join(); 
     } 
     catch(Exception ex) 
     { 
      MessageBox.Show(ex.Message+" \n"+ex.StackTrace); 
      ar=ActionResult.Failure; 
     } 
     //MessageBox.Show("End Copy"); 
     return ar; 
    } 

    static void ClipboardThread(object s) 
    { 
     try 
     { 
      Clipboard.SetText(s.ToString()); 
     } 
     catch(Exception ex) 
     { 
      MessageBox.Show(ex.Message+" \n"+ex.StackTrace); 
     } 
    } 
相關問題