是否可以使用WinForms/C#执行以下操作?
例如,查看(黑色形状将是WinForm窗口):

本质上,我需要为一个程序创建一个工具栏,而工具栏应该在相同的位置“按下”到该程序,而不管窗口的位置或大小如何。
发布于 2014-09-17 05:43:37
第一找到记事本窗口的手柄
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);只需对第一个参数和标题(“记事本”)传递null?作为第二个参数的窗口。
另一种选择是使用枚举所有窗口并根据标题选择最佳匹配:
using System.Runtime.InteropServices;
public delegate bool CallBackPtr(int hwnd, int lParam);
private CallBackPtr callBackPtr;
public class EnumReport
{
[DllImport("user32.dll")]
private static extern int EnumWindows(CallBackPtr callPtr, int lPar);
public static bool Report(int hwnd, int lParam)
{
Console.WriteLine("Window handle is "+hwnd);
return true;
}
}
static void Main()
{
// note in other situations, it is important to keep
// callBackPtr as a member variable so it doesnt GC while you're calling EnumWindows
callBackPtr = new CallBackPtr(EnumReport.Report);
EnumReport.EnumWindows(callBackPtr, 0);
}然后向其附加一个WndProc:
HwndSource src = HwndSource.FromHwnd(windowHandle);
src.AddHook(new HwndSourceHook(WndProc));在WndProc中,响应窗口的大小调整和移动。
我不确定是否将工具栏设置为记事本窗口的子窗口;当记事本尝试管理工具栏并排序其z深度时,可能会产生意想不到的效果。
同时,我怀疑这是一件好事;用户将能够键入‘下面’的覆盖,并失去他的光标/文本。
发布于 2014-09-17 05:42:26
FindWindow)。SetParent)的子窗口。您的窗口将被锚定在记事本窗口的左上角。最小化将自动处理,但当记事本的窗口被调整(或最大化)时,您需要调整窗口的大小。您还可以移动记事本的编辑控件。
可以使用WinForms,但是您需要一些互操作调用。
我必须警告,这不是一个很好的主意。您的控件可能与主机进程窗口中的控件冲突,主机进程可能会以您不喜欢的方式重新排列控件,绘制控件。一般来说,在没有一个好的清洁解决方案的情况下,要准备好与众多的问题作斗争,并且接受当调整大小时可能会出现故障等。
另请参阅:
https://stackoverflow.com/questions/25882904
复制相似问题