gpt4 book ai didi

c# - WPF、WinForms、ActiveX 控件和我正在消失的理智(调用 DragMove() 以响应 WinForms 控件的 MouseDown 事件)

转载 作者:太空宇宙 更新时间:2023-11-03 11:38:51 27 4
gpt4 key购买 nike

正如您可能从这篇文章的标题中了解到的那样,我快崩溃了。

好的,就是这样:我有一个 WPF 窗口,它承载着一个 WinForms 窗体,而窗体又承载着一个 ActiveX 控件。这都是由于遗留组件和想要为透明 WPF 窗口的不透明度设置动画。难道你还不能感受到乐趣吗?!

...所以,我希望能够通过在窗口的各个区域按下鼠标调用 DragMove 来拖动我的透明 WPF 窗口。这工作正常,我可以接受当前的行为,但如果我也可以通过我的 WinForms 组件生成的 MouseDown 事件拖动窗口,那就太好了。所以,我采取了显而易见的方法:

void Init()
{
MyWinForm form = new MyWinForm();
form.SomeControl.MouseDown = form_MouseDown;
}

void form_MouseDown( object sender, MouseEventArgs e )
{
if( e.Button == MouseButtons.Left )
{
DragMove();
}
}

但是,我的应用程序崩溃并显示以下消息:

Can only call DragMove when primary mouse button is down.

是的,正确的,除了左(主)按钮 被按下的按钮(我意识到这对于左撇子鼠标来说可能有问题,但我们暂时避免这种情况)。因此,对于 System.Windows.Forms.Control,适用于 WPF 控件生成的鼠标事件的简单代码再次失败。有人对此有经验吗?提前感谢您提供的任何建议。

TLDR;从 System.Windows.Controls.MouseDown 事件内部调用 DragMove() 会使应用程序崩溃。此时我愿意接受任何解决方法。

最佳答案

查看使用反射器的 DragMove() 代码,我得出了这个解决方案:我们可以编写或拥有 DragMove(IntPtr hWnd),它不执行按钮状态检查,但我们必须在 MouseDown 事件处理程序中显式释放鼠标捕获。

public static class Utility
{
[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern IntPtr SendMessage(IntPtr h, int msg, IntPtr lp, IntPtr wp);

public static void DragMove(IntPtr hwnd)
{
const int WM_SYSCOMMAND = 0x112;
const int WM_LBUTTONUP = 0x202;

SendMessage(hwnd, WM_SYSCOMMAND, (IntPtr)0xf012, IntPtr.Zero);
SendMessage(hwnd, WM_LBUTTONUP, IntPtr.Zero, IntPtr.Zero);
}
}

稍微更改一下您的 MouseDown 处理程序:

void form_MouseDown( object sender, MouseEventArgs e )
{
if( e.Button == MouseButtons.Left )
{
// it is necessary to release mouse capture, so that
// WPF window will be able to capture mouse input
((Control)sender).Capture = false;
// use helper to acquire window handle
var helper = new System.Windows.Interop.WindowInteropHelper(
your_window_reference_goes_here);
Utility.DragMove(helper.Handle);
}
}

我没有用 ActiveX 控件测试它,但它可以与简单的 WinForms 控件一起使用,至少在 Win7 Ultimate x64 上托管在 WindowsFormsControlHost 中。

关于c# - WPF、WinForms、ActiveX 控件和我正在消失的理智(调用 DragMove() 以响应 WinForms 控件的 MouseDown 事件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5347875/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com