Wix按钮将文本复制到剪贴板,使用自定义操作,不工作

时间:2013-11-24 16:19:06

标签: c# wix

我正在学习Wix来构建安装程序。

在自定义对话框中,我有一个Control,其类型是Text,我有一个Button。 我想单击按钮将文本复制到剪贴板中。

以下是代码。 首先是控制。

<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;
    }
}
}

问题是,每次我点击按钮,我的安装程序都没有说什么。我的剪贴板中没有任何反应。 我怎样才能做到这一点?

1 个答案:

答案 0 :(得分: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);
        }
    }