lua学習の——有道辞典「画詞」の秘密

2895 ワード

***文章のタイトルはあまりにも斬新に見えますが、主にLuaでWindowsのクリップボードを取得し、修正するためです.辞書の「画語」の秘密は、クリップボードを通じてアルファベットが伝わることで、文章のタイトルが得られるからだ.まず、本明細書の結果を示します.
辞書で「划詞」(取詞ではありませんよ、取詞は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でいいです.今ではコピー&ペーストも持っていて、クリップボードの秘密も知っています.