有以下一段代码:Private Sub btnPasteName_Click()
' 声明一些需要的变量
Dim hwnd As Long ' 储存 FindWindow 函数返回的句柄
Dim pid As Long ' 储存进程标识符( Process Id )
Dim pHandle As Long ' 储存进程句柄' 首先取得目标窗口的句柄
hwnd = FindWindow(vbNullString, "计算器")
If (hwnd = 0) Then
MsgBox "Window not found!"
Exit Sub
End If' 取得进程标识符
GetWindowThreadProcessId hwnd, pid' 使用进程标识符取得进程句柄
pHandle = OpenProcess(PROCESS_ALL_ACCESS, False, pid)
If (pHandle = 0) Then
MsgBox "Couldn't get a process handle!"
Exit Sub
End If' 在内存地址中写入名字
WriteProcessMemory pHandle, &H40B181, "Beans", 5, 0&' 关闭进程句柄
CloseHandle hProcess
End Sub
说明:以上代码是关于外挂的初步知识。相信稍微研究过外挂的朋友都能看懂。由于小弟是菜鸟,特向大家请教。在此单击事件中,
为什么代码段:' 使用进程标识符取得进程句柄
pHandle = OpenProcess(PROCESS_ALL_ACCESS, False, pid)
If (pHandle = 0) Then
MsgBox "Couldn't get a process handle!"
Exit Sub
End If每次得到的pHandle都为0,以在致于无法继续执行下面的程序。
在下已经完全按照文章要求进行操作(比如相关API声明、各控件初始化等):
为了让大家更能在下的意思,特把原文附上:[用VB制作修改器教程]
http://blog.csdn.net/paullbm/articles/806716.aspx

解决方案 »

  1.   

    windows 自带计算器的进程名是“calc.exe"
      

  2.   

    hwnd = FindWindow(vbNullString, "计算器")
    里的“计算器”是正确的。如果改成别的,就算打开计算器,都会出现“Window not found!"、
      

  3.   

    而且该参数并不是要求是进程名,而是WINDOW窗口标题。
      

  4.   

    Const PROCESS_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED Or SYNCHRONIZE Or &HFFF
      

  5.   

    TO:vbman2003(家人)
    Const PROCESS_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED Or SYNCHRONIZE Or &HFFF=====================================
    加入此行在程序编译时有错误,错误提示是“要求是常数表达式”
      

  6.   

    Public Const STANDARD_RIGHTS_REQUIRED = &HF0000
    Public Const SYNCHRONIZE = &H100000
    Public Const PROCESS_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED Or SYNCHRONIZE Or &HFFF
      

  7.   

    Option ExplicitPrivate Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
    Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
    Private Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
    Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As LongPrivate Const STANDARD_RIGHTS_REQUIRED = &HF0000
    Private Const SYNCHRONIZE = &H100000
    Private Const PROCESS_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED Or SYNCHRONIZE Or &HFFFPrivate Sub btnPasteName_Click()
        ' 声明一些需要的变量
        Dim hwnd As Long ' 储存 FindWindow 函数返回的句柄
        Dim pid As Long ' 储存进程标识符( Process Id )
        Dim pHandle As Long ' 储存进程句柄
        
        ' 首先取得目标窗口的句柄
        hwnd = FindWindow(vbNullString, "计算器")
        If (hwnd = 0) Then
            MsgBox "Window not found!"
            Exit Sub
        End If
        
        ' 取得进程标识符
        GetWindowThreadProcessId hwnd, pid
        
        ' 使用进程标识符取得进程句柄
        pHandle = OpenProcess(PROCESS_ALL_ACCESS, False, pid)
        If (pHandle = 0) Then
            MsgBox "Couldn't get a process handle!"
            Exit Sub
        End If
        
        ' 在内存地址中写入名字
        WriteProcessMemory pHandle, &H40B181, "Beans", 5, 0&
        
        ' 关闭进程句柄
        CloseHandle pHandle
    End Sub
      

  8.   

    因为看不到你声明常数的代码,所以试着解答了一下。junki(『.NET技术争霸天下』)的是完整的了。
      

  9.   

    别这么说,楼上各位,我提点建议,我觉得在对其他进程内存操作时,一般都应该想着《WINDOWS核心编程》里面一段关于内存保护的某些话。
    楼主没什么错的,那个程序我粗略的看了看,和我写的一个内存修改器好象刷的是差不多的代码,但是是否应该把你的程序权限提升呢。
    我认为你的问题就出在权限不够高。
    这是我刷的一部分代码'======================提升进程权限的API函数常数定义=====================
    Const STANDARD_RIGHTS_REQUIRED = &HF0000
    Const TOKEN_ASSIGN_PRIMARY = &H1
    Const TOKEN_DUPLICATE = (&H2)
    Const TOKEN_IMPERSONATE = (&H4)
    Const TOKEN_QUERY = (&H8)
    Const TOKEN_QUERY_SOURCE = (&H10)
    Const TOKEN_ADJUST_PRIVILEGES = (&H20)
    Const TOKEN_ADJUST_GROUPS = (&H40)
    Const TOKEN_ADJUST_DEFAULT = (&H80)
    Const TOKEN_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED Or TOKEN_ASSIGN_PRIMARY Or _
    TOKEN_DUPLICATE Or TOKEN_IMPERSONATE Or TOKEN_QUERY Or TOKEN_QUERY_SOURCE Or _
    TOKEN_ADJUST_PRIVILEGES Or TOKEN_ADJUST_GROUPS Or TOKEN_ADJUST_DEFAULT)
    Const SE_PRIVILEGE_ENABLED = &H2
    Const ANYSIZE_ARRAY = 1
    Private Type LUID
    lowpart As Long
    highpart As Long
    End Type
    Private Type LUID_AND_ATTRIBUTES
    pLuid As LUID
    Attributes As Long
    End Type
    Private Type TOKEN_PRIVILEGES
    PrivilegeCount As Long
    Privileges(ANYSIZE_ARRAY) As LUID_AND_ATTRIBUTES
    End Type
    Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
    Private Declare Function LookupPrivilegeValue Lib "advapi32.dll" Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, ByVal lpName As String, lpLuid As LUID) As Long
    Private Declare Function AdjustTokenPrivileges Lib "advapi32.dll" (ByVal TokenHandle As Long, ByVal DisableAllPrivileges As Long, NewState As TOKEN_PRIVILEGES, ByVal BufferLength As Long, PreviousState As TOKEN_PRIVILEGES, ReturnLength As Long) As Long
    Private Declare Function OpenProcessToken Lib "advapi32.dll" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As Long) As Long'这个函数用于在WIN2000/XP/03/NT4+系统中,本进程提升权限
    Sub AdjustTokenPrivileges2000()
    Dim hdlProcessHandle As Long
    Dim hdlTokenHandle As Long
    Dim tmpLuid As LUID
    Dim tkp As TOKEN_PRIVILEGES
    Dim tkpNewButIgnored As TOKEN_PRIVILEGES
    Dim lBufferNeeded As Long
    Dim lP As Long
    hdlProcessHandle = GetCurrentProcess()
    lP = OpenProcessToken(hdlProcessHandle, TOKEN_ALL_ACCESS, hdlTokenHandle)
    lP = LookupPrivilegeValue("", "SeDebugPrivilege", tmpLuid)
    tkp.PrivilegeCount = 1
    tkp.Privileges(0).pLuid = tmpLuid
    tkp.Privileges(0).Attributes = SE_PRIVILEGE_ENABLED
    lP = AdjustTokenPrivileges(hdlTokenHandle, False, tkp, Len(tkpNewButIgnored), tkpNewButIgnored, lBufferNeeded)
    End SubOK,问题解决?