实现拖动窗口选项

时间:2009-07-16 10:08:57

标签: c# .net winforms visual-studio-2008

注意:

  • 使用Windows窗体
  • 最好是C#.NET

问题:

  • 实施 拖动窗口工具的最佳方法,与process explorer中的功能类似(或相同),获取< / b>与所选窗口
  • 对应的进程ID

1 个答案:

答案 0 :(得分:1)

我认为最简单的方法是对表单进行控制,作为起点;在那里按下鼠标按钮,然后在按下按钮的同时将其移动到屏幕上,并选择您指向的任何进程ID。我的例子我使用了一个面板(称为_aim)。

首先我们设置鼠标事件:

private void Panel_MouseDown(object sender, MouseEventArgs e)
{
     // make all mouse events being raised in the _aim panel
     // regardless of whether the mouse is within the control's
     // bounds or not
    _aim.Capture = true;
}

private void Panel_MouseMove(object sender, MouseEventArgs e)
{
    if (_aim.Capture)
    {   
        // get the process id only if we have mouse capture 
        uint processId = GetProcessIdFromPoint(
            _aim.PointToScreen(e.Location)).ToString();
        // do something with processId (store it for remembering the 
        // last processId seen, to be used as MouseUp for instance)
    }
}
private void Panel_MouseUp(object sender, MouseEventArgs e)
{
    if (_aim.Capture)
    {
        // release capture if we have it
        _aim.Capture = false;
        // perhaps do something more (fetch info about last seen
        // process id, if we stored it during MouseMove, for instance)
    }
}

GetProcessIdFromPoint方法如下所示:

private uint GetProcessIdFromPoint(Point point)
{
    uint procId;
    WinApi.GetWindowThreadProcessId(WinApi.WindowFromPoint(point), out procId);
    return procId;
}

最后是windows API的东西(来自pinvoke.net):

public static class WinApi
{
    [StructLayout(LayoutKind.Sequential)]
    public struct POINT
    {
        public int X;
        public int Y;

        public POINT(int x, int y)
        {
            this.X = x;
            this.Y = y;
        }

        public static implicit operator System.Drawing.Point(POINT p)
        {
            return new System.Drawing.Point(p.X, p.Y);
        }

        public static implicit operator POINT(System.Drawing.Point p)
        {
            return new POINT(p.X, p.Y);
        }
    }

    [DllImport("user32.dll")]
    public static extern IntPtr WindowFromPoint(POINT Point);

    [DllImport("user32.dll", SetLastError = true)]
    public static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);
}