|
在RMXP中複製事件時,產生的剪切板內容的格式編號為50380,格式名稱是RPGXP EVENT |
一派護法 十九級 |
|
一派護法 十九級 |
使用下面的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; }
|
|
一派護法 十九級 |
為了看看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; }
|
|
一派護法 十九級 |
運行程序後,輸出的文件內容如下:
|
|
一派護法 十九級 |
測試時,我複製的是RMXP中的一個空白事件:
|
|
一派護法 十九級 |
根據這一線索,可以用C++編寫一個程序,專門生成RMXP的各種事件,生成後粘貼到RMXP地圖上就行了。
|
|
一派護法 十九級 |
複製一個魔塔樣板中的老人事件: ![](//zh.purasbar.com/Files/TopicImages/2016-1/1_2016-1-12_051112_-4535751306.png) 其剪切板的內容如下: ![](//zh.purasbar.com/Files/TopicImages/2016-1/1_2016-1-12_051140_-5268-3-11261.png) 其中的中文已經亂碼。所以在編寫程序時要注意編碼的問題。
|
|
一派護法 十九級 |
根據一樓的程序運行結果的截圖,可以得出的結論是:在RMXP中複製事件時,只產生了50380着一種剪切板內容格式。
|
|
一派護法 十九級 |
在RMXP中複製顯示文章這一單條事件指令,產生的剪切板格式編號是50287,其名稱為RPGXP EVENT_COMMAND。 例如,複製顯示文章: \m[老人]注意:隱藏層不支持對話記錄! 對話記錄只支持固定數字的樓層。 其剪切板的內容為:
|
|
一派護法 十九級 |
為了修改剪切板中的內容,執行以下C++代碼: char *data = (char *)GlobalLock(hMem); memcpy(data + 59, "abcdef", 6); GlobalUnlock(hMem); SetClipboardData(50287, hMem); 執行這段代碼後,在RMXP事件編輯器中粘貼,可見其中一段內容已經成功改變:
|
|
一派護法 十九級 |
在修改剪切板內容這個例子中,把「意:」這兩個字改成了「abcdef」,後續內容正常顯示。我們可以初步推斷,在RMXP剪切板的內容中,一個漢
字是佔3個字節的,所採用的編碼很可能是UTF8(Unicode的一種存儲方式)
。在C++中,可以用WideCharToMultiByte函數把Unicode字符串(存儲方式為UCS2)轉換成UTF8格式。
|
|
一派護法 十九級 |
|
|
一派護法 十九級 |
可以用Visual Studio打開剛才生成的dat文件,查看其16進制內容。
|
|
一派護法 十九級 |
|
|
一派護法 十九級 |
不難看出,剪切板中前4個字節就是表示的整個內容的大小。 例如空顯示文章那條指令的內容中,整個剪切板內容大小為0x43位元組,這個數減去4就等於0x3e。所以前四個字節就是0x3e 0x00 0x00 0x00
|
|
一派護法 十九級 |
隨後0x04085b這三個字節是固定的,接下來的一個字節中,0x06表示顯示文章有一行文字,0x07表示有兩行,0x08表示有三行。
|
|
一派護法 十九級 |
不過我很驚訝的發現,Map002.rxdata文件和剪切板中的內容格式差不多! (註:要查看一個文件的16進制內容,可以將該文件的擴展名改為dat,然後用Visual Studio打開)
|
|