是否可以使用WinForms / C#执行以下操作?
参见例如(黑色形状将是WinForm窗口):
基本上我需要为程序创建一个工具栏,工具栏应该在同一个地方“捕捉”到该程序,而不管窗口的位置或大小。
答案 0 :(得分:2)
首先find the handle of the notepad window:
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
只需将第一个参数的null和窗口的标题(“记事本”?)作为第二个参数传递。
另一种方法是enumerate all windows并根据标题选择最佳匹配:
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深度时,可能会产生意外的影响。
与此同时,我怀疑这是一件好事;用户可以在叠加层“下方”键入并丢失光标/文本。
答案 1 :(得分:1)
FindWindow
)。SetParent
)。您的窗口将固定在记事本窗口的左上角。最小化将自动处理,但是当调整记事本窗口的大小(或最大化)时,您需要调整窗口大小。您可能还想移动记事本的编辑控件。
可以使用WinForms,但是你需要一些互操作。
我必须警告说这不是一个好主意。您的控件可能与主机进程窗口内的控件冲突,主机进程可能会以您不喜欢的方式重新排列控件,从而控制您的控件。一般来说,准备好在没有良好清洁解决方案的情况下解决许多问题,并接受在调整大小等时可能会出现故障。
另见: