吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 220|回复: 2
收起左侧

[求助] C#如何拖动嵌入的第三方窗体

[复制链接]
zhanglei1371 发表于 2024-2-25 09:01
本帖最后由 zhanglei1371 于 2024-2-25 10:00 编辑

各位好!
我现在能用api将一个第三方Exe嵌入窗体的panel1里,但是当我拖动窗体时,里面的嵌入窗体却不能随之移动,不知该怎样修改,能实现:
当我拖动当前窗体时,panel1里的符号窗体也能动态的随之改变?
另外还有个问题,就是打开第三方应用时,我发现使用ZLhwnd = process.Handle;获取到的句柄并不是真正的窗体句柄,而Findwindow找到的才是。这两个为何不同?
谢谢!!!
private void button1_Click(object sender, EventArgs e)
        {
            Process process = new Process();
            process.StartInfo.FileName = Application.StartupPath + @"\QQPYFace.exe";
            process.StartInfo.UseShellExecute = true;
            process.Start();
            process.WaitForInputIdle();
            Thread.Sleep(300);
            // 获取窗口标题
            ZLhwnd = process.Handle;
            ZLhwnd = FindWindow("Tencent_QQPYFace_CLASS_F779A4FF-2139-4A44-918D-2B8BF1AAD80", "符号输入器");
        }

        private void button2_Click(object sender, EventArgs e)
        { 
            //嵌入到Panel1中;
            SetParent(ZLhwnd,panel1.Handle);
            t
        private void 窗体内嵌test_Move(object sender, EventArgs e)
        {
            //窗体移动事件;设置第三方exe窗口的left和top为panel1的:
            MoveWindow(ZLhwnd, panel1.Left, panel1.Top, panel1.Width, panel1.Height, 1);

        }
【注意】这个第三方exe是比较特殊的一个(非常不一般,不要用普通简单的逻辑去应对),普通的记事本是没有任何问题的,所以ChatGPT的答案就不要粘贴了,可以自己下载附件测试下!

附件:
https://wwi.lanzoup.com/iVoyr1payqah

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

lbh3925695 发表于 2024-2-25 09:18
要在窗体的 Move 事件中更新第三方 EXE 窗体的位置。你的代码已经部分实现了这一点,但是需要一些调整。
首先,确保在窗体的 Move 事件中,获取的是窗体在屏幕上的实际位置,而不是相对于父容器的位置。然后,需要考虑 panel1 的位置相对于窗体的位置,以确保 EXE 窗体正确地嵌入到 panel1 中。
private void button1_Click(object sender, EventArgs e)
{
Process process = new Process();
process.StartInfo.FileName = Application.StartupPath + @"\QQPYFace.exe";
process.StartInfo.UseShellExecute = true;
process.Start();
process.WaitForInputIdle();
Thread.Sleep(300);
// 获取窗口标题
ZLhwnd = process.Handle;
ZLhwnd = FindWindow(null, "符号输入器"); // 假设窗口标题是“符号输入器”
}
private void button2_Click(object sender, EventArgs e)
{
// 嵌入到Panel1中;
SetParent(ZLhwnd, panel1.Handle);
// 更新EXE窗体的位置和大小
UpdateExeWindowPosition();
}
private void UpdateExeWindowPosition()
{
if (ZLhwnd != IntPtr.Zero)
{
// 获取panel1在屏幕上的位置
Rectangle panelRect = panel1.RectangleToScreen(panel1.ClientRectangle);
// 移动和调整EXE窗体的大小
MoveWindow(ZLhwnd, panelRect.Left, panelRect.Top, panelRect.Width, panelRect.Height, true);
}
}
private void 窗体内嵌test_Move(object sender, EventArgs e)
{
// 当窗体移动时,更新第三方EXE窗口的位置
UpdateExeWindowPosition();
}

请注意,FindWindow 的第一个参数从类名更改为 null,因为通常使用窗口标题来查找窗口,而不是类名。确保窗口标题正确无误。
另外,在调用 MoveWindow 之前,ZLhwnd 不为 IntPtr.Zero,以避免无效的窗口句柄操作。
这样修改后,当您拖动窗体时,panel1 里的 EXE 窗体应该会正确地随之移动。
flyer_2001 发表于 2024-2-26 13:54
这个程序可以不用FindWindow
ZLhwnd = process.MainWindowHandle;
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止回复与主题无关非技术内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-4 12:55

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表