它具有DirectX Renderer的功能以及HTML / CSS样式 ,并且是开源的! 有太多的原因使这个小家伙比其他任何桌面应用程序解决方案都更好。
但是有时候做一些复杂的事情比看起来简单得多! 怎么样? 让我引用国王的话:
另外,为了将日志数据从本地应用程序打印到.NET GUI,请使用相同的方法添加PrintLog(string log_str)导出并在C ++中进行分配。
好的,现在进入您的窗口后端代码并添加函数的委托:
最后,是时候从C ++传递函数了。 首先,我们需要加载.NET GUI库,在全局对象中定义这些对象和值:
我们开始...现在构建您的应用程序和库并尝试一下。 如果您遇到错误或崩溃,请查看代码以获取更多详细信息...
如果您在应用程序中使用WPF UI,则不要在c ++宿主窗口上使用双重缓冲(WS_EX_COMPOSITED)功能,WPF使用DirectX渲染器并且已经具有双重缓冲,如果在宿主窗口中使用它会破坏WPF渲染。
做得好! 现在,您的非托管应用已连接到皮肤下的托管GUI。 现在也该在前端连接它们了!
还记得我从海森堡学到的基本知识吗? 好吧...开...
这是将您的WPF窗口变成一个孩子并将其完美地托管在本机窗口中的神奇代码:
如果用户调整了宿主窗口的大小,则我们的控件也需要调整大小,返回
HostWindowProc
回调并在HostWindowProc
添加resize事件和close事件:好的。 :)是时候构建应用程序和库了……接下来,您可以在C ++应用程序中拥有一个流畅而无闪烁的WPF UI。
如果您启动了EXE而只是冻结了,请不要慌张…… 这是完全自然的!
在某些情况下,例如控制台应用程序或独立应用程序 (其中的线程默认运行),WPF UI在同一线程中运行,并且其消息循环中断主应用程序线程。
在这种情况下,您应该使用多线程并为GUI创建一个单独的线程,这使您的应用程序可以在两个不同的线程Backend Thread和Frontend Thread中工作 。
作为复杂的应用程序,它变得更加安全和标准。 好的,进入您的Managed Bridge并将代码更改为此:
现在构建并重试...它正在工作! :)
好的,有些情况下,我们无法完全访问主机窗口的创建,例如,当我们想在某些本机插件中使用WPF UI来安装3ds Max,Photoshop,QT Apps等应用程序时。
作为一个插件,SDK允许您创建子Windows,面板,汇总,展示,自定义控件并返回其句柄,但在所有这些控件的下面都是Window!
在这种情况下,存在三个问题:
我们无权访问主机窗口WndProc回调
我们无权访问主机窗口句柄指针
在这种情况下,您需要在主机窗口上设置一个“ 窗口挂钩 ”以捕获其消息,如果您尝试在另一个进程窗口上使用它,则此方法具有安全副作用,因为这是键盘记录程序所做的,但在我们的情况下,它是一个插件而且它在同一进程中运行,因此...没问题,这样做没有任何问题,Windows Defender不会破坏您的工作。 :)
要在主机窗口上设置窗口挂钩,您只需要其句柄,大多数SDK会返回主机窗口/面板的句柄,我们通过
SetWindowSubclass
使用此句柄为主机窗口/面板设置备用消息捕获回调。在您的插件代码中创建相同的
HostWindowProc
,并在显示窗口/面板后添加以下代码:并且不要忘记在
WndProc
应用两个更改:做完了! 现在,您可以在任何类型的窗口和面板上处理大小调整和其他消息事件。
在这种情况下,您需要查询目标应用程序窗口并找到创建的主机窗口/面板以完成其余工作。 如果SDK没有给您提供句柄,则可以为它提供标题,您只需要按其标题进行查询和查找即可。
并使用此功能启动查询...
恭喜你! 您可以进入最后阶段...是时候开发我们的托管前端并使一切正常工作了...
在前端开发中,我们有两种不同的策略:
示例 : 在我的压缩器中,我可以使用按钮在后端C ++列表中添加文件,并在后面进行所有操作,而仅在WPF列表中显示数据,并使用按钮来调用压缩/解压缩功能,或者可以使用C#来管理文件,压缩和解压缩过程这节省了我很多时间!
这完全取决于您的决定,我们生活在一个自由的世界中,对吗? ;)
完成UI编程后,构建您的应用程序和库。 运行您的C ++应用程序。
现在您正在观看科学的魔力... :)
您可以使用一个很棒的免费应用程序“ Enigma Virtual Box” ,您可以从官方网站上获取它。
选择您的C ++ EXE,并将您的WPF GUI库.dll文件添加到虚拟框的根目录中,然后将您的EXE构建为一个,并在设置中使用压缩功能。
现在,您将获得一个干净,轻巧和单一文件的C ++应用程序,它具有漂亮,流畅,无闪烁的WPF用户界面。
为了保护非官方程序集的C ++ API指针,可以使用MD5或SHA哈希技术检查请求者是否已被修改。
让我向您介绍一个令人惊叹的库,它为您提供了一种完美的哈希方法,并且仅标头!
为了保护您的本机功能:
构建最终版本的GUI库后,DLL在MD5,SHA512,SHA1等中获取其哈希值。
记下它,并将哈希作为XOR模糊字符串 (或AES256)存储在您的主C ++应用程序中。
在使用
LoadLibrary
函数加载GUI库DLL之前,请再次获取其哈希值并将其与您之前生成的预先计算的哈希值进行比较,如果匹配,请继续进行处理...完成调试后,可以按照以下步骤将控制台应用程序转换为Windows SubSystem:
您可以从以下链接下载完整的源代码和最终二进制文件:
在我的文章系列的下一部分中,我将教您如何在C#托管应用程序中直接使用所有C ++内存和值,因此您不必构建新值,传递它们或分配更多的内存。
当您处理大量数据时,此技术是非常有用的帮助!
希望本教程对您有所帮助。 :)
另外,请随时在我的关注我正在开发的最新应用程序。
当然上边三个函数可以合成一个函数,因为他们方法是一样的,只是风格参数不同而已。
VB本身提供两种风格:Flat和3D,但是也许你想改变一下外观,比如让TextBox的边界介于Flat和3D之间那种效果,如图:
怎么做呢?在VC中我们在创建一个窗口对象时可以制定它的风格,但是在VB中,IDE已经按照它自己的想法给我创建好了,如果我们想要改变它只能把已经存在的进行修改,这时我们就需要借助的GetWindowLong和SetWindowLong兄弟的帮助来完成这个任务了。
‘首先将原始的窗口属性读出来
‘这个函数能为窗口指定一个新位置和状态。它也可改变窗口在内部窗口列表中的位置。该函数与DeferWindowPos函数相似,只是它的作用是立即表现出来的(在vb里使用:针对vb窗体,如它们在win32下屏蔽或最小化,则需重设最顶部状态。如有必要,请用一个子类处理模块来重设最顶部状态)
*当然上边的函数可以用在所有窗口对象上,只不够有些窗口对象不需要这么做。
如果窗体中有很多TextBox需要这样设置,而且不都是控件数组,那么可以在包装一下上面的函数:
VB 中可以设置TextBox中文本水平方向居左、居右、居中,但是不能设置垂直方向,也不能微调文本距离左边界的距离,但是我们还是可以借助API的帮助来完成这个需求:
'实现这个效果首先TextBox的MultiLine属性必须为True(多行文本,其实这个属性关系创建TextBox内部使用哪个类,因此一旦创建就不能修改这个属性,所以不能在代码中修改这个属性)
这样我们就达到了文本垂直居中的目的,其实只要用的熟了,找到切入点,还是很容易实现的。
如果你查看TextBox中常用的消息,你会发现有这样一对消息:EM_GETMARGINS 和EM_SETMARGINS,MSDN的解释是:获取和设置编辑控件的左、右边距(不得用于NT3.51)。具体是左还是右由该消息的参数决定。
看到这些也许你就知道我们可以用这两个消息完成我们的需求,好下面实际着手进行验证:
好经过测试目的达到,但是这样做有什么意义呢?有的时候如果你想在texebox中放入其他对象,而又不希望文本被覆盖掉,你就需要用到这个方法。
C#是一种编程语言,能够基于.NET平台的应用。程序员
2.一列数的规则以下: 一、一、二、三、五、八、1三、2一、中,配件的意思是?
答:程序集。(中间语言,源数据,资源,装配清单)
答:WS主要是可利用HTTP,穿透防火墙。而Remoting能够利用TCP/IP,二进制传
中经常使用的几种页面间传递参数的方法,并说出他们的优缺点。
cookie简单,但可能不支持,可能被伪造
url参数 简单,显示于地址栏,长度有限
数据库 稳定,安全,但性能相对弱
答:用户控件通常用在内容多为静态,或者少量会改变的状况下..用的比较大..类
似ASP中的中经常使用的对象有哪些?分别描述一下。
中全部的自定义用户控件都必须继承自________?
中全部可序列化的类都被标记为_____?
托管代码中咱们不用担忧内存漏洞,这是由于有了______?
中,类的错误处理机制是什么?
,直到找到匹配的Catch为止。
(C# or (C# or 下,.net引用了垃圾回收(GC)功能,它替代了程序员不过在C#中。
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。