Работа скриптов в автоматическом режиме
Posted: Sun Apr 24, 2011 4:21 pm
by Instructor
1. Примеры скриптов, которые после запуска останутся в памяти и будет реагировать на определенные события в AkelPad'е:
2. В командной строке запуска AkelPad'а или в ручном параметре "CmdLineBegin" добавляем следующую команду:
Code: Select all
//// Force turning on AECO_ENTIRENEWLINEDRAW setting for every edit window.
var hScript;
if ((hScript=AkelPad.ScriptHandle(WScript.ScriptName, 3 /*SH_FINDSCRIPT*/)) && AkelPad.ScriptHandle(hScript, 13 /*SH_GETMESSAGELOOP*/))
{
//Script is running, second call close it.
AkelPad.ScriptHandle(hScript, 33 /*SH_CLOSESCRIPT*/);
}
else
{
//Script initialized after empty tab is already created.
OnEditStart(AkelPad.GetEditWnd());
if (AkelPad.WindowSubClass(1 /*WSC_MAINPROC*/, MainCallback, 0x40B /*AKDN_EDIT_ONSTART*/))
{
//Allow other scripts running and unlock main thread from waiting this script.
AkelPad.ScriptNoMutex(0x3 /*ULT_UNLOCKSCRIPTSQUEUE|ULT_UNLOCKPROGRAMTHREAD*/);
//Message loop
AkelPad.WindowGetMessage();
AkelPad.WindowUnsubClass(1 /*WSC_MAINPROC*/);
}
}
function MainCallback(hWnd, uMsg, wParam, lParam)
{
if (uMsg == 0x40B /*AKDN_EDIT_ONSTART*/)
{
OnEditStart(wParam);
}
}
function OnEditStart(hWnd)
{
AkelPad.SendMessage(hWnd, 3228 /*AEM_SETOPTIONS*/, 2 /*AECOOP_OR*/, 0x8000 /*AECO_ENTIRENEWLINEDRAW*/);
}
Code: Select all
//// Turn on word wrap for .c, .cpp, .h files and turn off for others.
var hMainWnd=AkelPad.GetMainWnd();
var hScript;
if ((hScript=AkelPad.ScriptHandle(WScript.ScriptName, 3 /*SH_FINDSCRIPT*/)) && AkelPad.ScriptHandle(hScript, 13 /*SH_GETMESSAGELOOP*/))
{
//Script is running, second call close it.
AkelPad.ScriptHandle(hScript, 33 /*SH_CLOSESCRIPT*/);
}
else
{
//Script initialized after empty tab is already created.
OnEditStart(AkelPad.GetEditWnd());
if (AkelPad.WindowSubClass(1 /*WSC_MAINPROC*/, MainCallback, 0x40B /*AKDN_EDIT_ONSTART*/, 0x436 /*AKDN_OPENDOCUMENT_FINISH*/, 0x438 /*AKDN_SAVEDOCUMENT_FINISH*/))
{
//Allow other scripts running and unlock main thread from waiting this script.
AkelPad.ScriptNoMutex(0x3 /*ULT_UNLOCKSCRIPTSQUEUE|ULT_UNLOCKPROGRAMTHREAD*/);
//Message loop
AkelPad.WindowGetMessage();
AkelPad.WindowUnsubClass(1 /*WSC_MAINPROC*/);
}
}
function MainCallback(hWnd, uMsg, wParam, lParam)
{
if (uMsg == 0x40B /*AKDN_EDIT_ONSTART*/)
{
OnEditStart(wParam);
}
else if (uMsg == 0x436 /*AKDN_OPENDOCUMENT_FINISH*/ ||
uMsg == 0x438 /*AKDN_SAVEDOCUMENT_FINISH*/)
{
//Get current file extension
var pFile=AkelPad.GetEditFile(0);
var nExtPos=pFile.lastIndexOf(".");
var pExt="";
if (nExtPos != -1)
pExt=pFile.substr(nExtPos).toLowerCase();
if (pExt == ".c" || pExt == ".cpp" || pExt == ".h")
{
//Turn on word wrap for matched files
if (!AkelPad.SendMessage(hMainWnd, 1223 /*AKD_GETFRAMEINFO*/, 17 /*FI_WORDWRAP*/, 0))
AkelPad.Command(4209 /*IDM_VIEW_WORDWRAP*/);
}
}
}
function OnEditStart(hWnd)
{
//Turn off word wrap for any new window
if (AkelPad.SendMessage(hMainWnd, 1223 /*AKD_GETFRAMEINFO*/, 17 /*FI_WORDWRAP*/, 0))
AkelPad.Command(4209 /*IDM_VIEW_WORDWRAP*/);
}
Code: Select all
//// Open binary file in associated program, if user cancel opening in AkelPad.
var hMainWnd=AkelPad.GetMainWnd();
var oSys=AkelPad.SystemFunction();
var hScript;
var pOpenFile;
var lpOpenFilePtr;
if ((hScript=AkelPad.ScriptHandle(WScript.ScriptName, 3 /*SH_FINDSCRIPT*/)) && AkelPad.ScriptHandle(hScript, 13 /*SH_GETMESSAGELOOP*/))
{
//Script is running, second call close it.
AkelPad.ScriptHandle(hScript, 33 /*SH_CLOSESCRIPT*/);
}
else if (AkelPad.WindowSubClass(1 /*WSC_MAINPROC*/, MainCallback, 0x435 /*AKDN_OPENDOCUMENT_START*/, 0x436 /*AKDN_OPENDOCUMENT_FINISH*/))
{
//Allow other scripts running and unlock main thread from waiting this script.
AkelPad.ScriptNoMutex(0x3 /*ULT_UNLOCKSCRIPTSQUEUE|ULT_UNLOCKPROGRAMTHREAD*/);
AkelPad.WindowGetMessage();
AkelPad.WindowUnsubClass(1 /*WSC_MAINPROC*/);
}
function MainCallback(hWnd, uMsg, wParam, lParam)
{
if (uMsg == 0x435 /*AKDN_OPENDOCUMENT_START*/)
{
lpOpenFilePtr=AkelPad.MemRead(lParam + 0 /*offsetof(NOPENDOCUMENT, pFile)*/, 2 /*DT_QWORD*/);
pOpenFile=AkelPad.MemRead(lpOpenFilePtr, _TSTR);
}
else if (uMsg == 0x436 /*AKDN_OPENDOCUMENT_FINISH*/)
{
if (lParam == -22 /*EOD_MSGCANCELBINARY*/)
{
oSys.Call("shell32::ShellExecute" + _TCHAR, hMainWnd, "open", pOpenFile, 0, 0, 1 /*SW_SHOWNORMAL*/);
//Exit program, if file opened on program start
if (AkelPad.SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 90 /*MI_ONSTART*/, 0))
AkelPad.Command(4109 /*IDM_FILE_EXIT*/);
}
}
}
Code: Select all
//// Allows undo file reopen. Require flag 1 of manual parameter "EditStyle".
var hMainWnd=AkelPad.GetMainWnd();
var hWndEdit;
var oSys=AkelPad.SystemFunction();
var hScript;
var hUndoStack=0;
var lpdwFlags;
var dwFlags;
if ((hScript=AkelPad.ScriptHandle(WScript.ScriptName, 3 /*SH_FINDSCRIPT*/)) && AkelPad.ScriptHandle(hScript, 13 /*SH_GETMESSAGELOOP*/))
{
//Script is running, second call close it.
AkelPad.ScriptHandle(hScript, 33 /*SH_CLOSESCRIPT*/);
}
else
{
if (AkelPad.WindowSubClass(1 /*WSC_MAINPROC*/, MainCallback, 0x435 /*AKDN_OPENDOCUMENT_START*/, 0x436 /*AKDN_OPENDOCUMENT_FINISH*/))
{
//Allow other scripts running and unlock main thread from waiting this script.
AkelPad.ScriptNoMutex(0x3 /*ULT_UNLOCKSCRIPTSQUEUE|ULT_UNLOCKPROGRAMTHREAD*/);
//Message loop
AkelPad.WindowGetMessage();
AkelPad.WindowUnsubClass(1 /*WSC_MAINPROC*/);
}
}
function MainCallback(hWnd, uMsg, wParam, lParam)
{
if (uMsg == 0x435 /*AKDN_OPENDOCUMENT_START*/)
{
hWndEdit=AkelPad.SendMessage(hMainWnd, 1223 /*AKD_GETFRAMEINFO*/, 2 /*FI_WNDEDIT*/, wParam);
lpdwFlags=AkelPad.MemRead(lParam + (_X64?40:20) /*offsetof(NOPENDOCUMENT, dwFlags)*/, 3 /*DT_DWORD*/);
dwFlags=AkelPad.MemRead(lpdwFlags, 3 /*DT_DWORD*/);
if (dwFlags & 0x100 /*OD_REOPEN*/)
hUndoStack=AkelPad.SendMessage(hWndEdit, 3090 /*AEM_DETACHUNDO*/, 0, 0);
}
else if (uMsg == 0x436 /*AKDN_OPENDOCUMENT_FINISH*/)
{
if (hUndoStack)
{
hWndEdit=AkelPad.SendMessage(hMainWnd, 1223 /*AKD_GETFRAMEINFO*/, 2 /*FI_WNDEDIT*/, wParam);
if (lParam == 0 /*EOD_SUCCESS*/)
AkelPad.SendMessage(hWndEdit, 3091 /*AEM_ATTACHUNDO*/, 0, hUndoStack);
else
AkelPad.SendMessage(hWndEdit, 3079 /*AEM_EMPTYUNDOBUFFER*/, 0, hUndoStack);
hUndoStack=0;
}
}
}
Code: Select all
//// Add every opened file (with associated extension) to system recent documents.
var hMainWnd=AkelPad.GetMainWnd();
var oSys=AkelPad.SystemFunction();
var hScript;
if ((hScript=AkelPad.ScriptHandle(WScript.ScriptName, 3 /*SH_FINDSCRIPT*/)) && AkelPad.ScriptHandle(hScript, 13 /*SH_GETMESSAGELOOP*/))
{
//Script is running, second call close it.
AkelPad.ScriptHandle(hScript, 33 /*SH_CLOSESCRIPT*/);
}
else
{
if (AkelPad.WindowSubClass(1 /*WSC_MAINPROC*/, MainCallback, 0x436 /*AKDN_OPENDOCUMENT_FINISH*/))
{
//Allow other scripts running and unlock main thread from waiting this script.
AkelPad.ScriptNoMutex(0x3 /*ULT_UNLOCKSCRIPTSQUEUE|ULT_UNLOCKPROGRAMTHREAD*/);
//Message loop
AkelPad.WindowGetMessage();
AkelPad.WindowUnsubClass(1 /*WSC_MAINPROC*/);
}
}
function MainCallback(hWnd, uMsg, wParam, lParam)
{
if (uMsg == 0x436 /*AKDN_OPENDOCUMENT_FINISH*/)
{
oSys.Call("shell32::SHAddToRecentDocs", _TSTR?0x3 /*SHARD_PATHW*/:0x2 /*SHARD_PATHA*/, AkelPad.GetEditFile(0));
}
}
Code: Select all
//// "Find next" button сloses "Find" dialog.
var hMainWnd=AkelPad.GetMainWnd();
var oSys=AkelPad.SystemFunction();
var hScript;
var hWndModeless;
if ((hScript=AkelPad.ScriptHandle(WScript.ScriptName, 3 /*SH_FINDSCRIPT*/)) && AkelPad.ScriptHandle(hScript, 13 /*SH_GETMESSAGELOOP*/))
{
//Script is running, second call close it.
AkelPad.ScriptHandle(hScript, 33 /*SH_CLOSESCRIPT*/);
}
else
{
if (AkelPad.WindowSubClass(1 /*WSC_MAINPROC*/, MainCallback, 0x440 /*AKDN_INITDIALOGEND*/))
{
//Allow other scripts running and unlock main thread from waiting this script.
AkelPad.ScriptNoMutex(0x3 /*ULT_UNLOCKSCRIPTSQUEUE|ULT_UNLOCKPROGRAMTHREAD*/);
//Message loop
AkelPad.WindowGetMessage();
AkelPad.WindowUnsubClass(1 /*WSC_MAINPROC*/);
}
}
function MainCallback(hWnd, uMsg, wParam, lParam)
{
if (uMsg == 0x440 /*AKDN_INITDIALOGEND*/)
{
if (wParam == 6 /*IDT_FIND*/)
{
hWndModeless=AkelPad.MemRead(_PtrAdd(lParam, 0) /*offsetof(NINITDIALOG, hWnd)*/, 2 /*DT_QWORD*/);
//Subclass dialog
if (!AkelPad.WindowSubClass(hWndModeless, DialogCallback, 273 /*WM_COMMAND*/, 2 /*WM_DESTROY*/))
//Exit message loop
oSys.Call("user32::PostQuitMessage", 0);
}
}
}
function DialogCallback(hWnd, uMsg, wParam, lParam)
{
if (uMsg == 273) //WM_COMMAND
{
if (LOWORD(wParam) == 3065 /*IDC_SEARCH_FIND_BUTTON*/)
{
//Close dialog
oSys.Call("user32::PostMessage" + _TCHAR, hWnd, 273 /*WM_COMMAND*/, 2 /*IDCANCEL*/, 0);
}
}
else if (uMsg == 2) //WM_DESTROY
{
AkelPad.WindowUnsubClass(hWndModeless);
}
return 0;
}
function LOWORD(dwNumber)
{
return (dwNumber & 0xffff);
}
2. В командной строке запуска AkelPad'а или в ручном параметре "CmdLineBegin" добавляем следующую команду:
Code: Select all
/Call("Scripts::Main", 2, "AutoScript-Sample1.js")