2011-02-28 81 views
4

我有一些我无法修改的应用程序(无源代码),它们被硬编码为0,0。通常这不是一个问题,但是一个新的项目(亭)已经出现,我需要在这些应用程序的外部绘制一个边界。我正在寻找一种方法来改变显示范围:是否可以修改显示器的原点? (win32)

X: 0 to 1200 
Y: 0 to 900 

喜欢的东西:

X: -100 to 1100 
Y: -100 to 800 

我见过一对夫妇的功能,像在MSDN上SetViewportExtEx,SetWorldTransform但是这符合需要的,如果我正确理解它们并不会对系统进行全面更改。它们仅适用于当前进程。

我使用C++进行编程,但是如果在注册表/控制面板/ etc中有设置也可以工作。

以前有没有其他人做过这样的事情?

编辑1:窗口位置使用“的setparent”

的是硬编码到0,0

+1

你不能使用全局钩子或其他东西注入一个提到的函数的调用吗? – erikkallen 2011-03-01 00:02:21

+0

您是否认为更改会立即生效,或者如果在确实说出SetWorldTransform调用之前应用程序已开始绘制,会出现计时问题? – 2011-03-01 00:06:47

+0

我认为只有显示驱动程序可以做到这一点。有一个函数来获取每个监视器的坐标,但没有设置它们。请参阅http://msdn.microsoft.com/en-us/library/dd145066.aspx – 2011-03-01 02:27:27

回答

1

这可能是矫枉过正的,但是如果它真的想完全控制,可以通过在目标进程中挂钩CreateWindow,CreateWindowEx并在传递控制权之前更改XY坐标来始终使用API​​挂钩来截取Window创建回到系统。

流行的API挂钩库包括:Microsoft Detours,Madshi's madCodeHook和免费的开源EasyHook

+0

我在想这是实现此目的的唯一方法。你觉得ApiHijack怎么样? http://www.codeproject.com/KB/DLL/apihijack.aspx – 2011-03-01 17:50:41

+0

我还没有使用它,但鉴于它是在10年前更新的,我会考虑一个更现代的解决方案。 – 2011-03-01 20:43:36

0

我可能会正在与窗口的外壳应用程序,然后设置其他的父路径例如,在C#我这样做...

var info = new ProcessStartInfo {FileName = "NotePad.exe", WindowStyle = ProcessWindowStyle.Normal}; 
var runProcess = Process.Start(info); 
Thread.Sleep(1000); // ugly, but more just proving a point 
SetParent(runProcess.MainWindowHandle, Handle); 

,并在我的形式窗口中承载的记事本

所以,只要申办窗口,调整你的主机给客户大小+一点点,把客户放在你想要的主窗口,然后在外面画。

易peasy :)

+0

这似乎有点奇怪,导致我的一个应用程序无法正常启动(查看原因)还有一些隐藏的应用程序自己(直到被告知不要)首先显示(在我的父窗口最好_闪烁,然后弹出到他们的正常位置 – 2011-03-01 02:02:06

0

你能澄清你的“应用程序是硬编码在0,0画”是什么意思?这是否意味着他们的窗口的位置被设置为0,0,或者他们有代码在0,0处绘制?

解决方案#1
一个可能的解决方案是使用SetWindowPosition简单地将每个应用程序移动到您想要的任何位置。

所有你需要做的是按需要枚举每个调用SetWindowPosition的HWNDS列表。

解决方案#2
设置桌面的工作区域变小。这会导致您的应用程序占用工作区域,而不是整个屏幕。然后,您可以随意放置任何需要的附加窗口,手动放置它们并绘制边框。

实际上,您可能会考虑将边框窗口注册为“应用栏”,这会自动调整工作区域的大小。

+0

窗口位置是0,0。应用程序可以自由创建其他窗口,这些窗口也将硬编码到位置0,0。我猜测的蛮力方法是迭代所有进程并每隔100 MS重置它们的窗口。我认为当这些应用程序打开一个新窗口时可能会出现闪烁或怪异现象 – 2011-03-01 00:17:38

+0

如果应用程序打开子窗口,你肯定会得到一些奇怪的UI效果 – Nathanael 2011-03-01 00:23:14

+0

我喜欢解决方案#2的想法,它看起来像我可以使用带有SPI_SETWORKAREA标志的SystemParametersInfo,谢谢! – 2011-03-01 00:33:41

相关问题