我有许多我无法修改的应用程序(没有源代码),它们被硬编码为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
答案 0 :(得分:1)
这可能有点矫枉过正,但是如果它真的想让你完全控制,你总是可以通过在目标进程中挂钩CreateWindow,CreateWindowEx并在传递控制权之前更改XY坐标来使用API挂钩拦截Window创建。到系统。
热门API挂钩库包括:Microsoft Detours,Madshi'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”,这会自动调整工作区域的大小。