解决 交互图形绘制在另一个过程窗口上

sbondo1234

成员
已加入
2020年1月21日
留言内容
8
编程经验
1-3
我的主要目标是能够移动不带边框的窗口,该窗口用于不同的进程,而该进程不是使用相同的c#脚本编写的。如果这是错误的解决方法,请告知。

是否可以在可交互的其他过程窗口上绘制图形?

当我说“可交互”时,我主要是指用户能够通过使用绘制的图形来移动窗口。

编辑(找到了一些有帮助的代码):

这段代码不断在桌面上绘制一个盒子:

C#:
[DllImport("User32.dll")]
public static extern IntPtr GetDC(IntPtr hwnd);

[DllImport("User32.dll")]
public static extern void ReleaseDC(IntPtr hwnd, IntPtr dc);

while (true)
{
    IntPtr desktopPtr = GetDC(IntPtr.Zero);
    Graphics g = Graphics.FromHdc(desktopPtr);

    SolidBrush b = new SolidBrush(Color.Red);
    g.FillRectangle(b, new Rectangle(0, 0, 192, 108));

    g.Dispose();
    ReleaseDC(IntPtr.Zero, desktopPtr);
}

有没有办法使它在窗口上绘制,而不是直接在桌面上绘制?

更重要的是,有没有一种方法可以检查用户是否单击/拖动图形,然后在发生这种情况时调用另一个函数?
 
Last edited:

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,524
地点
悉尼,澳大利亚
编程经验
10+
我从来没有画过自己的应用程序,但GDI +只是屏幕上的像素。没有可交互的对象。我确实编写了一些代码,允许用户拖动GDI +绘图,但是它依赖于绘制对象所引发的事件。如果您无法从其他应用程序获得有关鼠标交互的反馈,那么您可能不走运,但是,如果可以的话,绘图可能根本就没有价值。
 

sbondo1234

成员
已加入
2020年1月21日
留言内容
8
编程经验
1-3
我从来没有画过自己的应用程序,但GDI +只是屏幕上的像素。没有可交互的对象。我确实编写了一些代码,允许用户拖动GDI +绘图,但是它依赖于绘制对象所引发的事件。如果您无法从其他应用程序获得有关鼠标交互的反馈,那么您可能不走运,但是,如果可以的话,绘图可能根本就没有价值。
好的,谢谢。我可能会调查事件以检查用户的鼠标拖动到了哪里。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,928
地点
英国
编程经验
10+
是否可以在可交互的其他过程窗口上绘制图形?
您出于什么原因想要这样做?即使它极不可能对您有任何用处。
当我说“可交互”时,我主要是指用户能够通过使用绘制的图形来移动窗口。
我认为那是不可能的。也不会单独进行这项工作。您可能需要在某个时候调用pinvoke,并且要真正实现您想要做的事情,可能将需要一个全新的应用程序。
我可能会调查事件以检查用户的鼠标拖动到了哪里。
这不是您需要关注的事件。您可以将注意力集中在pinvoke调用上,以获取所有所需的输入,例如鼠标单击,鼠标位置以及设置窗口位置等。所有这些都可以在pinvoke.net上查找。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,928
地点
英国
编程经验
10+
一起使用GDi,您可以在屏幕上绘制对象,然后单击这些对象,它就可以移动您获取其手柄的窗口并将其放置在您想要放置的任何位置。看起来可能还需要注入一些DLL。众所周知,这不是具有1-3年经验的最容易完成的任务。
 

sbondo1234

成员
已加入
2020年1月21日
留言内容
8
编程经验
1-3
一起使用GDi,您可以在屏幕上绘制对象,然后单击这些对象,它就可以移动您获取其手柄的窗口并将其放置在您想要放置的任何位置。看起来可能还需要注入一些DLL。众所周知,这不是具有1-3年经验的最容易完成的任务。

好的,我决定只在代码本身中移动窗口,而没有在代码运行时移动窗口的选项。

得到了这篇文章的帮助: pinvoke.net:movewindow(user32)
 
最佳 底部