【问题标题】:SetParent to hook, how do you unhook?SetParent to hook,你如何解开?
【发布时间】:2013-03-04 05:51:00
【问题描述】:

一旦应用程序现在用作父应用程序,您将如何从表单中取消挂钩?

[DllImport("user32.dll")]
public static extern int SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

[DllImport("coredll.dll", SetLastError = true)]
private static extern int GetWindowLong(IntPtr hWnd, int nIndex);

[DllImport("coredll.dll", SetLastError = true)]
private static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);

SetParent(setter, this.panel1.Handle);

解开我试过 SetParent(setter, setter);没有运气。

【问题讨论】:

  • 我对此并不熟悉,但我会尝试通过在设置新父之前存储它来设置旧父(无论是什么)。
  • 嗯抱歉我听不懂unhook an application from your form - 这是什么意思?就像你将 Chrome 标签页拖到它自己的应用程序中一样?请详细说明:)
  • msdn docs on SetParent 说将 parent 设置为 NULL 会将其挂接到桌面。不过没有任何经验
  • 异常,intptr 为 null 不可能,(IntPtr)null 没有结果
  • @ploxtic 尝试使用IntPtr.Zero 而不是.Net null

标签: c# winforms winapi release


【解决方案1】:

我知道这已经晚了,但我能够传入零以从父级解开:

SetParent(process.MainWindowHandle, IntPtr.Zero);

这会将桌面窗口设置为新的父窗口。

【讨论】:

    【解决方案2】:

    SetParent 返回上一个父窗口句柄。要“取消挂钩”窗口,您应该能够使用最初返回的句柄调用 SetParent。

    【讨论】:

    • 不。除非您还必须通过程序移动窗口,否则这不起作用..卡在表单/面板中
    • 如果以前的所有者是桌面,我不确定恢复父级是否会有任何明显的视觉效果,除非您移动其中一个参与的窗口或其他东西。
    • Chrome、记事本:两者都不会使用 IntPtr.Zero 或 -1、null 或它自己的句柄反弹到表单/面板之外。它对你有用吗?或者你认为哪个句柄“最初回来了”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-08
    • 1970-01-01
    • 1970-01-01
    • 2015-03-22
    相关资源
    最近更新 更多