目前共有17篇帖子。 內容轉換:不轉換▼
 
點擊 回復
746 16
在RMXP中复制事件时,产生的剪切板内容的格式编号为50380,格式名称是RPGXP EVENT
一派護法 十九級
1樓 發表于:2016-1-12 12:51

一派護法 十九級
2樓 發表于:2016-1-12 12:51

使用下面的C++程序就可以查出来:
// RMXPClipboard.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <Windows.h>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    int i = 0;
    char name[100];
    OpenClipboard(NULL);
    while (i = EnumClipboardFormats(i))
    {
        GetClipboardFormatNameA(i, name, 100);
        cout << i << ": " << name << endl;
    }
    CloseClipboard();
    system("pause");
    return 0;
}
一派護法 十九級
3樓 發表于:2016-1-12 13:01

为了看看RMXP程序到底在剪切板中放了什么内容,可以写一个C++程序把剪切板的内容输出到文件中。
程序代码:
// RMXPClipboard.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <Windows.h>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    OpenClipboard(NULL);
    if (!IsClipboardFormatAvailable(50380))
        return 1;

    HGLOBAL hMem = GetClipboardData(50380);
    DWORD dwSize = GlobalSize(hMem);
    cout << "Size: " << dwSize << endl;

    LPVOID data = GlobalLock(hMem);

    FILE *fp;
    fopen_s(&fp, "clipboard.dat", "w");
    fwrite(data, dwSize, 1, fp);
    fclose(fp);

    CloseClipboard();
    system("pause");
    return 0;
}
一派護法 十九級
4樓 發表于:2016-1-12 13:03

运行程序后,输出的文件内容如下:
一派護法 十九級
5樓 發表于:2016-1-12 13:03

测试时,我复制的是RMXP中的一个空白事件:


一派護法 十九級
6樓 發表于:2016-1-12 13:08

根据这一线索,可以用C++编写一个程序,专门生成RMXP的各种事件,生成后粘贴到RMXP地图上就行了。
一派護法 十九級
7樓 發表于:2016-1-12 13:12

复制一个魔塔样板中的老人事件:


其剪切板的内容如下:

其中的中文已经乱码。所以在编写程序时要注意编码的问题。
一派護法 十九級
8樓 發表于:2016-1-12 13:13

根据一楼的程序运行结果的截图,可以得出的结论是:在RMXP中复制事件时,只产生了50380着一种剪切板内容格式。
一派護法 十九級
9樓 發表于:2016-1-12 13:18

在RMXP中复制显示文章这一单条事件指令,产生的剪切板格式编号是50287,其名称为RPGXP EVENT_COMMAND。
例如,复制显示文章:
\m[老人]注意:隐藏层不支持对话记录!
      对话记录只支持固定数字的楼层。
其剪切板的内容为:

一派護法 十九級
10樓 發表于:2016-1-12 13:26

为了修改剪切板中的内容,执行以下C++代码:
char *data = (char *)GlobalLock(hMem);
memcpy(data + 59, "abcdef", 6);
GlobalUnlock(hMem);
SetClipboardData(50287, hMem);
执行这段代码后,在RMXP事件编辑器中粘贴,可见其中一段内容已经成功改变:

一派護法 十九級
11樓 發表于:2016-1-12 13:30

在修改剪切板内容这个例子中,把“意:”这两个字改成了“abcdef”,后续内容正常显示。我们可以初步推断,在RMXP剪切板的内容中,一个汉 字是占3个字节的,所采用的编码很可能是UTF8(Unicode的一种存储方式) 。在C++中,可以用WideCharToMultiByte函数把Unicode字符串(存储方式为UCS2)转换成UTF8格式。

一派護法 十九級
12樓 發表于:2016-1-12 13:31

一派護法 十九級
13樓 發表于:2016-1-12 13:36

可以用Visual Studio打开刚才生成的dat文件,查看其16进制内容。

一派護法 十九級
14樓 發表于:2016-1-12 13:43

一派護法 十九級
15樓 發表于:2016-1-12 14:40

不难看出,剪切板中前4个字节就是表示的整个内容的大小。
例如空显示文章那条指令的内容中,整个剪切板内容大小为0x43字节,这个数减去4就等于0x3e。所以前四个字节就是0x3e 0x00 0x00 0x00
一派護法 十九級
16樓 發表于:2016-1-12 14:44

随后0x04085b这三个字节是固定的,接下来的一个字节中,0x06表示显示文章有一行文字,0x07表示有两行,0x08表示有三行。
一派護法 十九級
17樓 發表于:2016-1-12 14:50

不过我很惊讶的发现,Map002.rxdata文件和剪切板中的内容格式差不多!
(注:要查看一个文件的16进制内容,可以将该文件的扩展名改为dat,然后用Visual Studio打开)

回復帖子

內容:
用戶名: 您目前是匿名發表
驗證碼:
(快捷鍵:Ctrl+Enter)
 

本帖信息

點擊數:746 回複數:16
評論數: ?
作者: 巨大八爪鱼
最後回復:巨大八爪鱼
最後回復時間:2016-1-12 14:50
 
©2010-2024 Arslanbar Ver2.0
除非另有聲明,本站採用創用CC姓名標示-相同方式分享 3.0 Unported許可協議進行許可。