相关疑难解决方法(0)

将表单窗口附加到C#中的另一个窗口

我想将一个表单附加到另一个窗口(另一个进程).我试着通过使用来做到这一点

[DllImport("user32.dll", SetLastError = true)]
private static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

setParentWindow(myWindowHwnd, newParentHwnd);
Run Code Online (Sandbox Code Playgroud)

这样做我的表格变得紧密,但也是看不见的.问题"附加窗口.."解决了WPF窗口的这个问题,基本上是通过使用

HwndSourceParameters parameters = new HwndSourceParameters();
...
HwndSource src = new HwndSource(parameters);
Run Code Online (Sandbox Code Playgroud)

我试图将它转移到我的表单,但我无法这样做(例如如何处理src.RootVisual = (Visual)window.Content;? - > 完整的源代码).

另一条评论说,我需要修改windows风格:

出于兼容性原因,SetParent不会修改其父级正在更改的窗口的WS_CHILD或WS_POPUP窗口样式.因此,如果hWndNewParent为NULL,则还应清除WS_CHILD位并在调用SetParent后设置WS_POPUP样式.相反,如果hWndNewParent不为NULL且窗口以前是桌面的子窗口,则应在调用SetParent之前清除WS_POPUP样式并设置WS_CHILD样式.

在这里,我错过了相应的API,我可以直接从C#中进行,还是让我DllImport再次使用另一个?

好或坏 - 不同进程之间的SetParent()win32 API建议不要在不同进程中附加窗口,但至少我想尝试.

题:

要使表单窗口可见,我需要做什么?如果方法WS_Child是正确的,我将如何设置它?或者WPF方法是否可行,但我如何将其应用于Windows窗体?

- 调查结果(后来添加) -

使用winAPI修改另一个应用程序的Windows样式显示如何从C#/ PInvoke修改样式

在这里找到所有窗口样式,底部是C#语法.

- 与Alan讨论的调查结果 -

我确实在Win XP上运行我的程序进行交叉检查(参见下面的Alan的回答和评论).至少我现在看到的东西.由于我已经添加了Alan的例子中的坐标,当我移动到左上角附近的另一个窗口时,我的窗口现在在记事本中闪耀.您仍然可以在记事本中看到键入的文本作为叠加层.在Win 7(32)下,我什么也看不见.

  1. 现在我需要找出是否可以以稳定的方式编写,也出现在Win 7上. …

c# pinvoke winforms

16
推荐指数
1
解决办法
3万
查看次数

在第7方应用程序中托管的WPF子窗口在Windows 7 Aero主题上不可见

我有一个WPF窗口,它必须表现为第三方正在运行的应用程序中窗口的叠加.我的WPF窗口必须大部分是透明的,带有一些可见的控件,总是位于z顺序的另一个窗口的顶部,随之移动等等.简而言之:我希望它的行为就像一个子窗口.

我已经回顾了这里提供的技术(WPF HwndSource技术)和这里(WPF SetParent技术).HwndSource技术根本不起作用.SetParent技术适用于Windows 7,但仅适用于基本主题.使用Windows 7 Aero主题时,它不起作用:我的子窗口是不可见的.

我正在寻找一个适用于所有Windows 7主题的解决方案.

我的测试应用程序创建一个测试窗口并调用SetParent使其成为记事本窗口(硬编码的HWND)的子窗口.

在基本主题下,它看起来像这样:

基本主题

在Windows 7主题下,我没有看到它:

航空主题

子窗口XAML:

<Window x:Class="WpfApplication22.TestWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="TestWindow" Height="300" Width="300" Background="#63000000" ShowInTaskbar="False" WindowStyle="None" Initialized="Window_Initialized" Loaded="Window_Loaded" AllowsTransparency="True">
    <Grid>
        <Ellipse Height="87" HorizontalAlignment="Left" Margin="12,12,0,0" Name="ellipse1" Stroke="Black" VerticalAlignment="Top" Width="167" Fill="#FFBE3A3A" />
    </Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)

子窗口表单加载处理程序代码:

    var parentHwnd = new IntPtr(0x01DE0DFC); // Running Notepad
    var guestHandle = new WindowInteropHelper(this).Handle;

    var style = WS_VISIBLE | WS_CLIPSIBLINGS | WS_CHILD | WS_POPUP;
    SetWindowLong(guestHandle, GWL_STYLE, (int)(style));
    SetParent(guestHandle, …
Run Code Online (Sandbox Code Playgroud)

wpf winapi aero childwindow windows-7

6
推荐指数
1
解决办法
1252
查看次数

标签 统计

aero ×1

c# ×1

childwindow ×1

pinvoke ×1

winapi ×1

windows-7 ×1

winforms ×1

wpf ×1