Pretty sure kInitAppMsg is always called, you’re just not seeing it. Try making a sample with this code
//-----------------------------------------------------------------------------
//----- acrxEntryPoint.cpp
//-----------------------------------------------------------------------------
#include "StdAfx.h"
#include "resource.h"
//----------------------------------------------------------------------------
#define szRDS _RXST("")
//-----------------------------------------------------------------------------
//----- ObjectARX EntryPoint
class ArxTemplate : public AcRxArxApp
{
public:
ArxTemplate() : AcRxArxApp()
{
}
virtual AcRx::AppRetCode On_kInitAppMsg(void* pkt)
{
AcRx::AppRetCode retCode = AcRxArxApp::On_kInitAppMsg(pkt);
acedRegisterOnIdleWinMsg(OnIdle);
return (retCode);
}
virtual AcRx::AppRetCode On_kUnloadAppMsg(void* pkt)
{
AcRx::AppRetCode retCode = AcRxArxApp::On_kUnloadAppMsg(pkt);
acedRemoveOnIdleWinMsg(OnIdle);
return (retCode);
}
virtual AcRx::AppRetCode On_kLoadDwgMsg(void* pkt) override
{
AcRx::AppRetCode retCode = AcRxDbxApp::On_kLoadDwgMsg(pkt);
return retCode;
}
virtual void RegisterServerComponents()
{
}
static void OnIdle()
{
static bool initOnce = false;
if (!initOnce)
{
acedAlert(_T("\init once"));
initOnce = true;
}
}
static void ArxTemplate_doit(void)
{
}
};
//-----------------------------------------------------------------------------
#pragma warning( disable: 4838 ) //prevents a cast compiler warning,
IMPLEMENT_ARX_ENTRYPOINT(ArxTemplate)
ACED_ARXCOMMAND_ENTRY_AUTO(ArxTemplate, ArxTemplate, _doit, doit, ACRX_CMD_TRANSPARENT, NULL)
#pragma warning( pop )
Python for AutoCAD, Python wrappers for ARX https://github.com/CEXT-Dan/PyRx