Code: Select all
var oSys = AkelPad.SystemFunction();
WScript.Echo(DialogBoxIndirect(AkelPad.GetMainWnd(), "Dialog box", "OK"));
function DialogBoxIndirect(hWndParent, sCaption, sButton)
{
  var DT_UNICODE   = 1;
  var DT_DWORD     = 3;
  var DT_WORD      = 4;
  var hInstanceDLL = AkelPad.GetInstanceDll();
  var lpCallback   = oSys.RegisterCallback("DialogBoxIndirectCallback");
  var lpTemp       = AkelPad.MemAlloc(1024);
  var lpItem;
  var nRetVal;
  AkelPad.MemCopy(lpTemp,      0x90C80000, DT_DWORD);   //style (WS_POPUP|WS_VISIBLE|WS_CAPTION|WS_SYSMENU)
  AkelPad.MemCopy(lpTemp +  4, 0x00000000, DT_DWORD);   //dwExtendedStyle
  AkelPad.MemCopy(lpTemp +  8, 1,          DT_WORD);    //cdit
  AkelPad.MemCopy(lpTemp + 10, 200,        DT_WORD);    //x
  AkelPad.MemCopy(lpTemp + 12, 100,        DT_WORD);    //y
  AkelPad.MemCopy(lpTemp + 14, 300,        DT_WORD);    //cx
  AkelPad.MemCopy(lpTemp + 16, 150,        DT_WORD);    //cy
  AkelPad.MemCopy(lpTemp + 18, 0,          DT_WORD);    //menu (no menu)
  AkelPad.MemCopy(lpTemp + 20, 0,          DT_WORD);    //class (default)
  AkelPad.MemCopy(lpTemp + 22, sCaption,   DT_UNICODE); //title
  lpItem = lpTemp + 22 + (sCaption.length + 1) * 2;
  AkelPad.MemCopy(lpItem,      0x50010000, DT_DWORD);   //style (WS_CHILD|WS_VISIBLE|WS_TABSTOP)
  AkelPad.MemCopy(lpItem +  4, 0x00000000, DT_DWORD);   //dwExtendedStyle
  AkelPad.MemCopy(lpItem +  8, 30,         DT_WORD);    //x
  AkelPad.MemCopy(lpItem + 10, 30,         DT_WORD);    //y
  AkelPad.MemCopy(lpItem + 12, 80,         DT_WORD);    //cx
  AkelPad.MemCopy(lpItem + 14, 20,         DT_WORD);    //cy
  AkelPad.MemCopy(lpItem + 16, 3001,       DT_WORD);    //id
  AkelPad.MemCopy(lpItem + 18, 0xFFFF,     DT_WORD);    //class
  AkelPad.MemCopy(lpItem + 20, 0x0080,     DT_WORD);    //class ("Button")
  AkelPad.MemCopy(lpItem + 22, sButton,    DT_UNICODE); //title
  nRetVal = oSys.Call("user32::DialogBoxIndirect" + _TCHAR, hInstanceDLL, lpTemp, hWndParent, lpCallback);
  oSys.UnregisterCallback(lpCallback);
  AkelPad.MemFree(lpTemp);
  return nRetVal;
}
function DialogBoxIndirectCallback(hWnd, uMsg, wParam, lParam)
{
  switch (uMsg)
  {
    case 256 : //WM_KEYDOWN
      if (wParam == 13 /*VK_RETURN*/)
      {
        oSys.Call("user32::EndDialog", hWnd, 1);
        return 1;
      }
      else if (wParam == 27 /*VK_ESCAPE*/)
      {
        oSys.Call("user32::EndDialog", hWnd, 0);
        return 1;
      }
    case 273 : //WM_COMMAND
      if ((wParam & 0xFFFF) == 3001)
      {
        oSys.Call("user32::EndDialog", hWnd, 1);
        return 1;
      }
  }
  return 0;
}