Snap WinForm程序

时间:2014-09-17 05:27:48

标签: c# .net winforms

是否可以使用WinForms / C#执行以下操作?

  1. 动态检测正在运行的程序的窗口大小和位置(例如Notepad.exe)?
  2. 将WinForm捕捉到Notepad.exe中的特定位置?
  3. 使用其他进程最小化和最大化WinForm窗口(所以当记事本最小化时,WinForm窗口也是如此)?
  4. 参见例如(黑色形状将是WinForm窗口):

    基本上我需要为程序创建一个工具栏,工具栏应该在同一个地方“捕捉”到该程序,而不管窗口的位置或大小。

2 个答案:

答案 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)

  1. 查找记事本的窗口(FindWindow)。
  2. 创建无边框的窗口。
  3. 将您的窗口设置为记事本窗口的子窗口(SetParent)。
  4. 您的窗口将固定在记事本窗口的左上角。最小化将自动处理,但是当调整记事本窗口的大小(或最大化)时,您需要调整窗口大小。您可能还想移动记事本的编辑控件。

    可以使用WinForms,但是你需要一些互操作。

    我必须警告说这不是一个好主意。您的控件可能与主机进程窗口内的控件冲突,主机进程可能会以您不喜欢的方式重新排列控件,从而控制您的控件。一般来说,准备好在没有良好清洁解决方案的情况下解决许多问题,并接受在调整大小等时可能会出现故障。

    另见: