以编程方式编辑外部exe的资源表?

时间:2014-12-20 19:24:16

标签: c# .net vb.net winforms portable-executable

  

SCENARIO

我使用的是 WinAmp 音乐播放器,它是用 C / C ++ 编写的,它带有一些可编辑的默认键盘快捷键(加速键)使用资源编辑器的示例。

  

问题

我想写一个非常简单的Winforms GUI来在winamp.exe文件上建立暂停/恢复密钥。

但我想念开始尝试这个的基本概念,我不知道从哪里开始搜索,读取或写入必要的字节来查找,识别和修改加速器表键。

PS:Winamp.exe有5个不同的加速器表。

这样的东西就是我想要重现的东西:

enter image description here

...能够编辑所需的密钥并保存流中的更改。

  

问题

有人可以指导我如何开始根据我的需求修改资源吗?

我也同意使用第三方(免费)图书馆,由于我对资源的基本知识,可以帮我完成这项工作。

VirtualKeys翻译/表示不是问题,我遇到的问题是找到资源表以识别程序中的当前VirtualKey代码,然后编辑它们并将更改保存在表中。

  

更新

我已经尝试了建议的 Vestris ResourceLib 解决方案,但它似乎没有完成编辑加速键的任务,这是我在VB.Net中所做的下面针对C#公开的相同示例:https://github.com/dblock/resourcelib/blob/master/Docs/Accelerator.md

Imports Vestris.ResourceLib
Imports System.IO

Public Class Form1

    Private Sub Test() Handles MyBase.Shown

        Dim filename As String = "C:\winamp - copy.exe"

        Using rcInfo As New ResourceInfo()

            rcInfo.Load(filename)

            Dim accList As List(Of AcceleratorResource) =
                rcInfo(Kernel32.ResourceTypes.RT_ACCELERATOR).
                ConvertAll(Of AcceleratorResource)(Function(item As Resource) CType(item, AcceleratorResource))

            For Each rc As AcceleratorResource In accList

                Console.WriteLine(String.Format("Name: {0}, TypeName: {1}", rc.Name, rc.TypeName))

                For Each acc As Accelerator In rc.Accelerators

                    Console.WriteLine(acc.ToString)

                    If acc.Key = "B"c Then

                        ' Here change the "B" key to an "M", for example.
                        Dim newAcc As New Accelerator
                        ' ...

                    End If

                Next acc

            Next rc

        End Using ' rcInfo

    End Sub

End Class

0 个答案:

没有答案