C# WSTO窗口焦点问题的解决办法

原文地址:https://www.cnblogs.com/cplemom/p/11514668.html,感谢原作者,让我少走不少弯路。
写插件弹窗是肯定要有的,有弹窗才有展示功能的页面啊!
记录一下前段时间遇到的一些弹窗方面的坑,一个个踩过来也是收获颇丰啊!

1、WPF弹窗

最简单的弹窗方式,new一个窗体,然后调用Show方法。

Window window = new Window();
window.Show();

然后根据需求的不一样,就有一些东西要调整了,简单一些的比如是否在任务栏显示,是否允许最大最小化,是否运行拖拽等等

window.ShowInTaskbar = false;
window.ResizeMode = ResizeMode.NoResize;
window.AllowDrop = false;

像上面那样一顿噼里哗啦操作。确实,弹窗出来了~但是点击起来就有点不对劲了。每次点击或焦点切换到主窗体的时候,弹窗都会被主窗体盖住。
马上想到了有一个解决方法,设置弹窗为最顶层就ok了啊!就不用担心被盖住了。

window.Topmost = true;

果然达到了预期,哪怕焦点切换了,弹窗也还是显示在最上面。emmmm,这么大个问题解决了,偷偷摸个鱼不过分吧!愉快的tab切换摸鱼模式。可是,什么鬼!为啥这个弹窗还跟过来了啊!原来不只是插件页面置顶了,全部软件都置顶啊!

正确解决方法如下:

Window window = new Window();
window.Title = "我是WPF弹窗!!!!";
new System.Windows.Interop.WindowInteropHelper(window) { Owner = new IntPtr(Globals.ThisAddIn.Application.HWND) };
window.Show();

在这里插入图片描述
这时候就可以看到,焦点在主窗口时,弹窗也不会被遮盖,并且最小化主窗口的时候,弹窗也会被收起来,切换到别的软件时,会正常盖住弹窗!

2、Winform弹窗

Winform的弹窗肯定和WPF的差不多,毕竟也是先有的Winform才有的WPF。一样两句话弹个窗,但是问题也和上面的一样!

Form form = new Form();
form.Show();

细心一点可以发现,在输入Show方法的时候,其实是有一个重载方法的,需要传入一个IWin32Window对象。并且IWin32Window其实是一个接口类,内部只有一个返回句柄的属性。

//owner:任何实现 System.Windows.Forms.IWin32Window 并表示将拥有此窗体的顶级窗口的对象。
public void Show(IWin32Window owner);

public interface IWin32Window
{
    //获取表示由实现者的窗口句柄。
    IntPtr Handle { get; }
}

尝试一下,建一个类继承IWin32Window接口,然后根据主页面的句柄去new一下这个类,并作为参数传入到Show方法里面。

public class WinWrap : IWin32Window
{
    private IntPtr m_Handle;
    public IntPtr Handle
    {
        get { return m_Handle; }
    }
    //构造函数,参数是父窗口的句柄
    public WinWrap(int handle)
    {
        this.m_Handle = new IntPtr(handle);
    }
}

Form form = new Form();
form.Text = "这是Winform弹窗!!!";
WinWrap owner = new WinWrap(Globals.ThisAddIn.Application.HWND);
form.Show(owner);

在这里插入图片描述

3、Winform弹窗内嵌入WPF控件

由于一些接口只允许传入Winform窗体或控件,所以需要将WPF控件包装一下

var toolControl = new Controls.ToolControl();//WPF控件
var form = new System.Windows.Forms.UserControl();//Winform控件
System.Windows.Forms.Integration.ElementHost elementHost = new System.Windows.Forms.Integration.ElementHost();
elementHost.Child = toolControl;
elementHost.Dock = System.Windows.Forms.DockStyle.Fill;
form.Controls.Add(elementHost);      
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
function copy-data([int]$startrow, [int]$startcol, [int]$endrow, [int]$endcol, [string]$pat, [string]$file, [int]$sheetfrom, [int]$sheetto) { $excel = New-Object -ComObject Excel.Application $excel.Visible = $false $wb = $excel.Workbooks.Open($file) $wsfrom = $wb.Sheets.Item($sheetfrom) $wsto = $wb.Sheets.Item($sheetto) $sr = $wsfrom.Range($wsfrom.Cells.Item($startrow, $startcol), $wsfrom.Cells.Item($endrow, $endcol)) $fc = $sr.Find($pat) if ($fc -ne $null) { $rown = $fc.Row $dsr = $wsto.Range($wsto.Cells.Item($rown, $startcol), $wsto.Cells.Item($rown + ($endrow - $startrow), $endcol)) $dsr = $dsr.Resize($sr.Rows.Count, $sr.Columns.Count) $sr.Copy() $dsr.PasteSpecial(-4104) } $excel.DisplayAlerts = $false $wb.Close($true) [Runtime.Interopservices.Marshal]::ReleaseComObject($excel) | Out-Null } $path = $PWD.Path $file = "$path\a.xlsx" # 将sheet1第1行到第4行、第2列到第9列的数据复制到sheet2 copy-data -startrow 1 -startcol 2 -endrow 4 -endcol 9 -pat 1009 -file $file -sheetfrom 1 -sheetto 2 # 将sheet1第6行到第8行、第2列到第9列的数据复制到sheet2 copy-data -startrow 6 -startcol 2 -endrow 8 -endcol 9 -pat 1018 -file $file -sheetfrom 1 -sheetto 2 # 将sheet1第10行到第11行、第2列到第9列的数据复制到sheet2 copy-data -startrow 10 -startcol 2 -endrow 11 -endcol 9 -pat 1023 -file $file -sheetfrom 1 -sheetto 2 这个是搜索sheet1关键词吗,我现在要搜索sheet2关键词 得到行信息后再把sheet1指定内容复制到sheet2指定区域,怎么修改呢
最新发布
05-19

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值