相关疑难解决方法(0)

好或坏 - 不同进程之间的SetParent()win32 API

SetParent函数采用子和新的父窗口句柄.当子窗口处于不同的Windows进程时,这似乎也有效.

我看到一篇帖子声称这不是官方支持的,但目前的文档不再提及此了.这是当前文档中的缺陷,还是这种行为发生了变化?

HWND WINAPI SetParent(
  __in      HWND hWndChild,
  __in_opt  HWND hWndNewParent
);
Run Code Online (Sandbox Code Playgroud)

windows winapi

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

使用winAPI修改另一个应用程序的Windows样式

我的应用程序启动了另一个应用 因此,我想删除使用c#启动的应用程序的标题栏.

我怎么能这样做,从下面的代码开始?

//Get current style
lCurStyle = GetWindowLong(hwnd, GWL_STYLE)

//remove titlebar elements
lCurStyle = lCurStyle And Not WS_CAPTION
lCurStyle = lCurStyle And Not WS_SYSMENU
lCurStyle = lCurStyle And Not WS_THICKFRAME
lCurStyle = lCurStyle And Not WS_MINIMIZE
lCurStyle = lCurStyle And Not WS_MAXIMIZEBOX

//apply new style
SetWindowLong hwnd, GWL_STYLE, lCurStyle

//reapply a 3d border
lCurStyle = GetWindowLong(hwnd, GWL_EXSTYLE)

SetWindowLong hwnd, GWL_EXSTYLE, lCurStyle Or WS_EX_DLGMODALFRAME

//redraw
SetWindowPos hwnd, 0, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE Or SWP_FRAMECHANGED
Run Code Online (Sandbox Code Playgroud)

c#

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

将窗口附加到另一个进程的窗口

我的WPF应用程序有多个窗口,我想将其中一些窗口附加到另一个进程的窗口.我的问题是,一旦我连接窗户,它就变得不可见了.

我正在尝试使用以下代码:

public static bool setParentWindow(IntPtr hWndChild, IntPtr hWndNewParent)
    {
    IntPtr previousParent = SetParent(hWndChild, hWndNewParent);
    return (previousParent == null ? false : true);
}

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

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

因此,上面的代码成功地附加了窗口,但不幸的是它使它不可见.

我这样做的原因是我试图通过为它构建"Widgets"来扩展应用程序,我的小部件将挂钩并向用户显示额外信息.

两个窗口都具有以下样式:WS_OVERLAPPEDWINDOW,WS_OVERLAPPED,WS_VISIBLE,WS_CLIPSIBLINGS,WS_CLIPCHILDREN.

c# wpf

4
推荐指数
1
解决办法
8048
查看次数

扩展另一个应用程序的标题栏

我工作的一个开源的.NET克隆的(GitHub的)DeskPins埃利亚斯Fotinis(直接下载谷歌关闭驱动器).它的主要功能是使其他窗户永远在顶部.当它们位于顶部时,标题栏中会添加一个图钉图标,如下所示:

在此输入图像描述

在拖放过程中,图钉图标随窗口移动,看起来就像是它的一部分.它甚至响应click事件,它会始终取消最高状态并从显示中删除图标.

题.是否有可能在C#中实现这样的东西(和p/invoke,我假设)?

研究

  1. 我试图运行这个项目.

这是一个WPF演示,它应该为标题栏添加一个自定义控件.似乎不适用于Windows 7 x64.不确定是操作系统还是其他操作系统.问题 - z顺序不一致,标题栏也出现在其他窗口的顶部,并且它不随窗口移动,它会尝试,但是很多视觉伪像和闪烁.

  1. 试图将此解决方案应用于#1:

基本上用这种模式替换对SetWindowLong的相关调用:

SetWindowLong(guestHandle, GWL_STYLE, GetWindowLong(guestHandle, GWL_STYLE) | WS_CHILD);
SetParent(guestHandle, hostHandle);
Run Code Online (Sandbox Code Playgroud)

此更改打破了所有内容,因此标题栏中未添加任何内容.可能是它不适用于标题栏,仅适用于表单的用户区域.

无论如何,如果有一个简单的解决方案,请分享你的智慧.如果没有,我将非常感谢任何提示和/或链接,以便我进一步调查该主题.

c# pinvoke titlebar winforms

2
推荐指数
1
解决办法
523
查看次数

标签 统计

c# ×3

pinvoke ×1

titlebar ×1

winapi ×1

windows ×1

winforms ×1

wpf ×1