Maybe it helps:
As I read in the MSDN, the owner window of the button gets with WM_COMMAND message, if a button is pushed (BN_PUSHED) or released (BN_UNPUSH).
if so in your App, you could
BN_PUSHED:
nLastTick=GetTickCount();
BN_UNPUSHED:
if ((GetTickCount()-nLastTick)>3000 /*time in ms*/){
StartTheOtherDialog();
};
I hope I could help a bit
set/reset a bool to find out whether is still pressed an at the time of each pushing get tic
Greetings Andreas