lua学習の——有道辞典「画詞」の秘密
2895 ワード
***文章のタイトルはあまりにも斬新に見えますが、主にLuaでWindowsのクリップボードを取得し、修正するためです.辞書の「画語」の秘密は、クリップボードを通じてアルファベットが伝わることで、文章のタイトルが得られるからだ.まず、本明細書の結果を示します.
辞書で「划詞」(取詞ではありませんよ、取詞はhookで行います)操作があると、luaはその引かれたアルファベットをprintします.
exluaでcppでは主にコピーと貼り付けの機能を実現し、以下のように実現した.
次にluaを再コンパイルする.exeでいいです.今ではコピー&ペーストも持っていて、クリップボードの秘密も知っています.
辞書で「划詞」(取詞ではありませんよ、取詞はhookで行います)操作があると、luaはその引かれたアルファベットをprintします.
setClipBoard("");
while true do
str = getClipBoard()
if(str ~= "")then
print(str)
end
end
setClipBoardとgetClipBoardはluaの内蔵関数ではなくluaを修正する.cプラスしました.luaはC/C++の関数を追加する簡単な方法を提供しています.詳細は「luaプログラム設計」を参照してください.クリップボードに関連する2つの関数だけを説明します.luaエンジニアリングに追加:extlua.cppとextlua.h. exluaでcppでは主にコピーと貼り付けの機能を実現し、以下のように実現した.
#include <Windows.h>
#include "extlua.h"
bool SetClipBoard(const char * str)
{
if(!OpenClipboard(NULL) || !EmptyClipboard())
{
return 0;
}
HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, (strlen(str) + 1) * sizeof(char));
if(!hMem)
{
CloseClipboard();
return 0;
}
char* lpStr = (char*)GlobalLock(hMem);
memcpy(lpStr, str, (strlen(str)) * sizeof(char));
lpStr[strlen(str)] = 0;
GlobalUnlock(hMem);
SetClipboardData(CF_TEXT, hMem);
CloseClipboard();
return 1;
}
char * GetClipBoard()
{
char* lpStr;
if (!IsClipboardFormatAvailable(CF_TEXT) || !OpenClipboard(NULL))
{
return "";
}
HGLOBAL hMem = GetClipboardData(CF_TEXT);
if (hMem)
{
lpStr = (char*)GlobalLock(hMem);
if (lpStr)
{
GlobalUnlock(hMem);
}
}
//change "\r
" to "
"
int iStrip = 0;
for(int i = 0; i < strlen(lpStr) - 1; i ++)
{
if(lpStr[i] == 0);
else if(lpStr[i] == '\r' && lpStr[i + 1] == '
')
{
lpStr[i] = '
';
lpStr[i+1] = 0;
lpStr[i - iStrip] = lpStr[i];
iStrip += 1;
}
else
{
lpStr[i - iStrip] = lpStr[i];
}
}
CloseClipboard();
return lpStr;
}
extlua.hの実現は以下の通りである.extern char * GetClipBoard();
extern bool SetClipBoard(const char * str);
個人の好みにあって、私はluaをcはluaに変更されました.cppは、いくつかのlua関連ヘッダファイルをextern"C"{}に含めるだけです.そしてluaでcppに追加:static int ext_getClipBoard(lua_State *L)
{
lua_pushstring(L, GetClipBoard());
return 1;
}
static int ext_setClipBoard(lua_State *L)
{
const char * str = lua_tostring(L, 1);
lua_pushboolean(L, SetClipBoard(str));
return 1;
}
int pmain関数のluaL_Openlibsの下に追加します. lua_pushcfunction(L, ext_getClipBoard);
lua_setglobal(L, "getClipBoard");
lua_pushcfunction(L, ext_setClipBoard);
lua_setglobal(L, "setClipBoard");
次にluaを再コンパイルする.exeでいいです.今ではコピー&ペーストも持っていて、クリップボードの秘密も知っています.