none
VB.Net或C#是否有辦法暫停(暫時凍結)外部程序? RRS feed

  • 問題

  • 程式內部可用suspend()暫停執行緒

    如果我要暫停外部程式該如何做?

    本人想要對Bluestacks上運作的單機遊戲進行畫面分析和操作

    由於遊戲是動態的,所以想把它暫停,不然等我的程式跑完,狀況早就變了

    順便問一下多點觸控相關的問題

    游標可以用user32.dll的api操作,那該如何達成一次點擊複數位置?還是有其他api可用?

    目前我查到的資料多半是分析使用者手勢,而沒有模擬操作方面的資料。

    希望有善心人士可幫我解答,感謝

    2016年5月28日 上午 05:26

解答

所有回覆

  • API 有,所以不是語言問題。

    先用一些 Process / Thread 工具試著暫停看看。

    大部分遊戲都有防機器人功能,減緩、凍結執行緒,通常會被防機器人功能識別成惡意行為。


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2016年5月28日 下午 03:29
  • Bluestacks是一款在Windows上運作的Android模擬器

    我想APP應該無法辨別是否是機器在操作虛擬機

    補充:

    我在資源監視器找到了我要的功能

    資源監視器>程序名>右鍵選單>暫停處理程序(S)

    您知道這個功能怎麼呼叫嗎?或是否有其他辦法可以達到類似效果

    2016/05/29 03:38 p.m.

    我找到相關Api了

    可使用kernel32.dll來凍結指定Process中的Thread


    Public Class Form Public Declare Function OpenThread Lib "kernel32.dll" (ByVal dwDesiredAccess As ThreadAccess, ByVal bInheritHandle As Boolean, ByVal dwThreadId As UInteger) As IntPtr Public Declare Function SuspendThread Lib "kernel32.dll" (ByVal hThread As IntPtr) As UInteger Public Declare Function ResumeThread Lib "kernel32.dll" (ByVal hThread As IntPtr) As UInteger Public Declare Function CloseHandle Lib "kernel32.dll" (ByVal hHandle As IntPtr) As Boolean Public Enum ThreadAccess As Integer TERMINATE = (&H1) SUSPEND_RESUME = (&H2) GET_CONTEXT = (&H8) SET_CONTEXT = (&H10) SET_INFORMATION = (&H20) QUERY_INFORMATION = (&H40) SET_THREAD_TOKEN = (&H80) IMPERSONATE = (&H100) DIRECT_IMPERSONATION = (&H200) End Enum Private Sub SuspendProcess(ByVal process As System.Diagnostics.Process) For Each thread As ProcessThread In process.Threads '暫停Process下所有執行緒 Dim opth As IntPtr opth = OpenThread(ThreadAccess.SUSPEND_RESUME, False, thread.Id) If opth <> IntPtr.Zero Then SuspendThread(opth) CloseHandle(opth) End If Next End Sub Private Sub ResumeProcess(ByVal process As System.Diagnostics.Process) For Each thread As ProcessThread In process.Threads Dim opth As IntPtr opth = OpenThread(ThreadAccess.SUSPEND_RESUME, False, thread.Id) If opth <> IntPtr.Zero Then ResumeThread(opth) CloseHandle(opth) End If Next End Sub Private Sub Pause(sender As Object, e As EventArgs) Handles Button1.Click

    '需要增加一個IF判斷P.count是否為零,否則當P()為Nothing時會出錯 Dim P As Process() = Process.GetProcessesByName("程序名") SuspendProcess(P(0))'P是一個集合 End Sub Private Sub Resume(sender As Object, e As EventArgs) Handles Button2.Click Dim P As Process() = Process.GetProcessesByName("程序名") ResumeProcess(P(0)) End Sub End Class




    • 已編輯 Otaku Li 2016年5月29日 上午 07:48
    2016年5月29日 上午 06:39
  • Process 查 OpenProcess(PROCESS_SUSPEND_RESUME, ...)

    https://msdn.microsoft.com/zh-tw/library/windows/desktop/ms684320(v=vs.85).aspx

    Thread 查 OpenThread(THREAD_SUSPEND_RESUME , ...)

    https://msdn.microsoft.com/zh-tw/library/windows/desktop/ms684335(v=vs.85).aspx

    Win8 以後,查 SuspendThread / Wow64SuspendThread

    https://msdn.microsoft.com/en-us/library/windows/desktop/ms686345(v=vs.85).aspx


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    • 已標示為解答 Otaku Li 2016年5月29日 上午 07:57
    2016年5月29日 上午 07:47