是否可以修改显示的来源? (win32)中

时间:2011-02-28 23:59:58

标签: c++ winapi gdi

我有许多我无法修改的应用程序(没有源代码),它们被硬编码为0,0绘制。通常这不是问题,但是我需要在这些应用程序外部绘制一个边界的新项目(kiosk)。我正在寻找一种方法来改变显示范围:

X: 0 to 1200
Y: 0 to 900

类似于:

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

我在MSDN上看到了一些像SetViewportExtEx,SetWorldTransform这样的函数,但是如果我正确理解它们,它们就不会对系统进行全局更改。它们仅适用于当前流程。

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

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

编辑1:窗口位置硬编码为0,0

3 个答案:

答案 0 :(得分:1)

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

热门API挂钩库包括:Microsoft DetoursMadshi's madCodeHook和免费的开源EasyHook

答案 1 :(得分:0)

我可能采取的路线是使用窗口创建一个shell应用程序,然后使用“SetParent”设置另一个的父项

例如,在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);

它在我的表单窗口中托管了记事本

所以,只需托管窗口,将主机大小调整为客户端大小+一点,将客户端放在主机窗口中,然后在外面绘制。

容易发生的事情:)

答案 2 :(得分:0)

你能澄清你的意思是'应用程序硬编码以0,0绘制'吗?这是否意味着他们的窗口位置设置为0,0,或者他们是否有代码绘制为0,0?

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

您需要做的就是根据需要枚举每个调用SetWindowPosition的HWNDS列表。

解决方案#2
将桌面的工作区域设置得更小。这应该会导致您的应用程序占用工作区域,而不是整个屏幕。然后,您可以自由地放置您需要的任何其他窗口,手动放置它们,并绘制边框。

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