我正在学习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;
}
}
}
问题是,每次我点击按钮,我的安装程序都没有说什么。我的剪贴板中没有任何反应。 我怎样才能做到这一点?
答案 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);
}
}