【问题标题】:How to attach a windows forms application to a .exe process如何将 Windows 窗体应用程序附加到 .exe 进程
【发布时间】:2017-01-01 23:53:26
【问题描述】:

我再一次需要你的帮助。 相信我,我已经搜索了数十次,但找不到太多有用的信息。

所以我正在做的这个项目背后的想法是将我的 vb.net windows 窗体应用程序附加到一个名为“反恐精英全球攻势”的游戏中,这不是作弊!

我的意图基本上是一些我可以在玩时查看的有用工具,例如时间等...

[问题] 我看过一些视频,其中已经完成,但相反,这意味着他们将现有进程附加到他们的 Windows 窗体,例如。我看到一个视频,其中一个人将 calc.exe 附加到他的 windows 窗体应用程序中,正如你所理解的,我想要相反的,我想将我的 windows 窗体附加到现有的应用程序中。

[我尝试过的事情] 所以我所做的就是复制他的 C# 代码,将其翻译到 vb.net 并混合使用,结果我搞砸了:D

当我运行我的项目时,它会启动每个进程(游戏和应用程序)的至少 200 个实例,我必须重新启动我的电脑才能关闭它们:D

Imports System.Windows.Forms
Imports System.Threading
Imports System.Diagnostics
Imports System.Runtime.InteropServices

Partial Public Class CubicCheat
    Inherits Form
    Public Sub New()
        InitializeComponent()
    End Sub

    <DllImport("USER32.DLL")> _
    Private Shared Function SetParent(hwc As IntPtr, hwp As IntPtr) As IntPtr
    End Function

    Private Sub CubicCheat_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        HookCsgo()
    End Sub

    Function HookCsgo()
        Dim csgo As Process = Process.Start("C:\Program Files (x86)\Steam\steamapps\common\Counter-Strike Global Offensive\csgo.exe")
        Dim cubic As Process = Process.Start("C:\Users\redfa_000\Documents\Visual Studio 2012\Projects\C++ Projekter\Crazy Tutorials\CubicHook\CubicHook\bin\Debug\CubicHook.exe")
        Thread.Sleep(500)
        cubic.WaitForInputIdle()
        SetParent(cubic.MainWindowHandle, csgo.Handle)
        Dispose()
    End Function

End Class

【问题讨论】:

  • 您尝试执行的操作可能无法实现,因为像 CS:GO 这样的游戏不包含标准窗口消息循环,或者它以不同方式忽略/处理某些消息。可以通过 DirectX 和挂钩将内容渲染到游戏屏幕上(注意 Valve 反作弊系统! - 也称为 VAC) 但这也意味着您必须自己进行命中测试和点击识别。
  • 是的,我听说过一些关于 hooking 和诸如 ImGUI、DirectX 和 OpenGL 之类的东西,但那不是一些 c# c++ 的东西吗?我可以告诉你一个事实,我不擅长这些语言 :D 我几乎不懂 vb.net :D:D
  • DirectX 主要是 C++,但也有 .NET 包装器,例如 SlimDX 或 SharpDX,它们都适用于 C# 和 VB.NET。

标签: vb.net forms attachment


【解决方案1】:

我希望您的代码看起来更像这样:

    Dim csgo As Process
    Dim csgoFileName As String = "C:\Program Files (x86)\Steam\steamapps\common\Counter-Strike Global Offensive\csgo.exe"
    Dim csgoMatches As Process() = Process.GetProcessesByName(System.IO.Path.GetFileNameWithoutExtension(csgoFileName))
    If csgoMatches.Length = 0 Then
        csgo = Process.Start(csgoFileName)
        csgo.WaitForInputIdle()
    Else
        csgo = csgoMatches(0)
    End If

    Dim cubic As Process
    Dim cubicFileName As String = "C:\Users\redfa_000\Documents\Visual Studio 2012\Projects\C++ Projekter\Crazy Tutorials\CubicHook\CubicHook\bin\Debug\CubicHook.exe"
    Dim cubicMatches() As Process = Process.GetProcessesByName(System.IO.Path.GetFileNameWithoutExtension(cubicFileName))
    If cubicMatches.Length = 0 Then
        cubic = Process.Start(cubicFileName)
        cubic.WaitForInputIdle()
    Else
        cubic = cubicMatches(0)
    End If

    SetParent(cubic.MainWindowHandle, csgo.MainWindowHandle)

请注意,在 SetParent() 调用中,我们在 两个 地方都使用了MainWindowHandle。你不能在那里使用 Handle,因为它意味着完全不同的东西。

【讨论】:

  • 您好 Idle_Mind,谢谢您的回复,感谢您的指正!
  • 您好 Idle_Mind,谢谢您的回复,感谢您的指正!这似乎并没有解决问题,但它确实改变了一些东西,至少它现在没有启动 200 个实例:D 虽然我的主要问题是将我的 vb.net 表单保留在游戏中,但你改写的代码启动了这两个进程,但作为单一进程,这意味着我可以将我的窗口窗体移出游戏,这不是目的,你有什么知识或任何来源我可以查看并学习吗?
猜你喜欢
  • 1970-01-01
  • 2018-04-24
  • 1970-01-01
  • 2012-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多