日期:2014-05-20  浏览次数:21412 次

请问各位高手,如何在任意屏幕上打字 画线 画圈?包括正在播放的视频界面上?
这个问题很重要,在下可以给300分,只要答案正确就可以。
另外请低手不要急于抢答,这个问题不简单。我要求的是任意屏幕,
我想做的软件是这样的,显示当前时间在任何屏幕的前面,打成指针
或者时间都可以,但是要透明,要直接绘制。即使是全屏播放的视频
也不能挡住我,如果能半透明就更好了。请高手赐教。

值得注意的是,我还不能做一个窗口镂空了显示在前面,因为我不想
挡住后面程序的按键的正常操作。这个显示要像显示器的调节菜单一样
非常自然,没有拖拉和屏幕重绘的痕迹。

------解决方案--------------------
给你段代码参考参考

[DllImport( "user32.dll ", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern IntPtr GetDesktopWindow();
[DllImport( "user32.dll ", EntryPoint = "GetDCEx ", CharSet = CharSet.Auto, ExactSpelling = true)]
private static extern IntPtr GetDCEx(IntPtr hWnd, IntPtr hrgnClip, int flags);

private void button1_Click(object sender, EventArgs e)
{
IntPtr desk = GetDesktopWindow();
IntPtr deskDC = GetDCEx(desk, IntPtr.Zero, 0x403);
Graphics g = Graphics.FromHdc(deskDC);
g.FillEllipse(SystemBrushes.ControlText, 0, 0, 100, 100);
}
------解决方案--------------------
这个问题挺难的啊,我们都等一下吧!!
------解决方案--------------------
任意... 媒体播放里面调用的是很特殊的东西,感觉DX能实现...
------解决方案--------------------
在任意窗口上绘图就是获取窗口的Device Context,然后用Graphics画就可以了。

获取顶层的窗口使用GetForegroundWindow获取顶层桌面的handle

再GetWindowDc就可以得到顶层窗口的Device Context,然后你想怎么画就怎么画。

至于说一直保持最前面,最简单的方法是定时器,不停检查当前最顶层窗体,更换DC。

要考虑性能的话,那么监视windows消息,当窗口被置顶时,再更换DC。

注意用完以后ReleaseDC释放DC

------解决方案--------------------
DX太底层了,如果有DX高手可以问下能不能实现,一般的绘法除非你说的那样用个什么透明的东西绘上去...
------解决方案--------------------
所谓穿透就是设定鼠标的捕获窗体,如果当前窗体不捕获鼠标,那么就是穿透。

参见 SetCapture
------解决方案--------------------
to 值得注意的是,我还不能做一个窗口镂空了显示在前面,因为我不想
挡住后面程序的按键的正常操作。这个显示要像显示器的调节菜单一样
非常自然,没有拖拉和屏幕重绘的痕迹。

由于牵扯到视频播放,其实把一个窗口半透明显示在最前面是最简单的。至于其他细节,比如按键和鼠标可以用hook来完成传递,因此也不影响后面程序的正常操作,甚至透明的部分,系统已经帮你处理了,自己根本不需要做任何处理。