Re: Dragonfly macro/script recorder




Besides fixing other bugs, combining some keystrokes on the same
line, and sending the script to the clipboard... a mouse click with
no movement at start of script records correctly. The right mouse
button double-click does not record correctly, if it matters.





Mouse("right:1/10")+
Mouse("[673,671],right:1/10")+
Mouse("left:1/10")+
Mouse("[711,455],left:1/10")+
Key("s-n,o,w,space,i,s,space,t,h,e,space,t,i,m,e,s-1/5")+
Key("enter/5")+
Key("1,2,3,4,5,6,7,8,9,0/5")+
Key("enter/5")+
Key("s-1,s-2,s-3,s-4,s-5,s-6,s-7,s-8,s-9,s-0/5")+
Key("enter/5")+
Key("tab/5")+
Key("backspace/5")+
Key("left/5")+
Key("up/5")+
Key("right/5")+
Key("down/5")+

(printable part of that)
Now is the time!
1234567890
!@#$%^&*()






FILE*stream;
HHOOK g_hHookKey=NULL;
HHOOK g_hHookMouse=NULL;
HWND handle;
INPUT input[16];
POINT UpPtrPos;
POINT DnPtrPos;
bool AfterFirstUpstroke=false;
bool StandAlone=false;
bool Continued=false;
bool PtrMovB4Down=false;
bool Recording=false;
bool DiffPtrPos=false;
bool SkipMouseAction=false;
bool Modifier=false;
char MouseAction[16]={0};
char KeyAction[64]={0};
char DebugOut[64]={0};
char KeyDownPoint[64]={0};
char LastKeyAction[64]={0};
char Script[10240]={0};
char StringOut[128]={0};
char KeyUpPoint[64]={0};
int Repetition=0;
////condense title bar
//bool Marked=false;
//char CpyTtlName[256];
//char FileName[320]={0};
//char FilePath[512]={0};
//char TtlName[256];
//int Place1=0,Place2=0;
#pragma data_seg()
LRESULT CALLBACK KeyHook(int nCode,WPARAM wParam,LPARAM lParam)
{//DLL KEYBOARD MESSAGE
if(UnknownAction)
{//UNUSEABLE KEYBOARD MESSAGE
return::CallNextHookEx(g_hHookKey,nCode,wParam,lParam);
}//UNUSEABLE KEYBOARD MESSAGE
if(Recording)
{//K-REC
if(Upstroke)
{//K-REC-UP
//
//a line is recorded on the first upstroke
//the first upstroke will be a non-modifier key
//any further upstrokes are immediately returned
//
if(AfterFirstUpstroke)
return::CallNextHookEx(g_hHookKey,nCode,wParam,lParam);
AfterFirstUpstroke=true;
if(wParam==Pad_5)
{//K-REC-UP-KP5-stop recording script
Recording=false;
if(OpenClipboard(NULL))
{//place script in clipboard
HGLOBAL clipbuffer;
char * buffer;
EmptyClipboard();
clipbuffer = GlobalAlloc(GMEM_DDESHARE,strlen(Script)+1);
buffer = (char*)GlobalLock(clipbuffer);
strcpy(buffer,Script);
GlobalUnlock(clipbuffer);
SetClipboardData(CF_TEXT,clipbuffer);
CloseClipboard();
PlaySound("C:\\Program Files\\VoiceWorks\\doedit1.wav",NULL,SND_FILENAME);
return 1;
}//place script in clipboard
else
{//error opening clipboard
PlaySound("C:\\Program Files\\VoiceWorks\\vuut1.wav",NULL,SND_FILENAME);
return 1;
}//error opening clipboard
//if((stream=fopen("C:\\Program Files\\VoiceWorks\\vscript.txt","w"))==NULL)
//{//K-REC-UP-EXT-KP5-WR_FI--error opening file
// PlaySound("C:\\Program Files\\VoiceWorks\\vuut1.wav",NULL,SND_FILENAME);
// return 1;
//}//K-REC-UP-EXT-KP5-WR_FI--error opening file
//fputs(Script,stream);
//if(fclose(stream))
//{//K-REC-UP-EXT-KP5-WR_FI--error closing file
// PlaySound("C:\\Program Files\\VoiceWorks\\vuut1.wav",NULL,SND_FILENAME);
// return 1;
//}//K-REC-UP-EXT-KP5-WR_FI--error closing file
////get recorded script
//ZeroMemory(input,sizeof(input));
//ShellExecute(handle,"open","C:\\Program Files\\VoiceWorks\\vscript.txt",NULL,NULL,SW_SHOWNORMAL) ;
//Sleep(500);
////select all
//input[0].type=input[1].type=input[2].type=input[3].type=INPUT_KEYBOARD;
//input[0].ki.wVk=input[3].ki.wVk=0x11;
//input[1].ki.wVk=input[2].ki.wVk=0x41;
//input[2].ki.dwFlags=input[3].ki.dwFlags=KEYEVENTF_KEYUP;
//SendInput(4,input,sizeof(INPUT));
//Sleep(100);
////copy
//input[0].type=input[1].type=input[2].type=input[3].type=INPUT_KEYBOARD;
//input[0].ki.wVk=input[3].ki.wVk=0x11;
//input[1].ki.wVk=input[2].ki.wVk=0x43;
//input[2].ki.dwFlags=input[3].ki.dwFlags=KEYEVENTF_KEYUP;
//SendInput(4,input,sizeof(INPUT));
//Sleep(100);
////close script file
//input[0].type=input[1].type=input[2].type=input[3].type=INPUT_KEYBOARD;
//input[0].ki.wVk=input[3].ki.wVk=0x12;
//input[1].ki.wVk=input[2].ki.wVk=0x73;
//input[2].ki.dwFlags=input[3].ki.dwFlags=KEYEVENTF_KEYUP;
//SendInput(4,input,sizeof(INPUT));
//Sleep(100);
////script copied to clipboard
//PlaySound("C:\\Program Files\\VoiceWorks\\doedit1.wav",NULL,SND_FILENAME);
//return 1;
}//K-REC-UP-KP5-stop recording script
*KeyAction='\0';
StandAlone=false;
Modifier=false;
::GetCursorPos(&UpPtrPos);
if(::GetKeyState(VK_CONTROL)&0x8000)
{//K-REC-UP-add control key modifier
Modifier=true;
StandAlone=true;
strcat(KeyAction,"c");
}//K-REC-UP-add control key modifier
if(::GetKeyState(VK_MENU)&0x8000)
{//K-REC-UP-add alt key modifier
Modifier=true;
StandAlone=true;
strcat(KeyAction,"a");
}//K-REC-UP-add alt key modifier
if(::GetKeyState(VK_SHIFT)&0x8000)
{//K-REC-UP-add shift key modifier
Modifier=true;
strcat(KeyAction,"s");
}//K-REC-UP-add shift key modifier
if(Modifier)
{//K-REC-UP-add the hyphen
Modifier=false;
strcat(KeyAction,"-");
}//K-REC-UP-add the hyphen
switch(wParam)
{//K-REC-UP-search for nonmodifier keys
case 0x08://backspace key
{
strcat(KeyAction,"backspace");
StandAlone=true;
break;
}
case 0x09://tab key
{
strcat(KeyAction,"tab");
StandAlone=true;
break;
}
case 0x0D://enter key
{
strcat(KeyAction,"enter");
StandAlone=true;
break;
}
case 0x1B://escape key
{
strcat(KeyAction,"escape");
StandAlone=true;
break;
}
case 0x20://space key
{
strcat(KeyAction,"space");
break;
}
case 0x21://page up key
{
if(Extended)
{//K-REC-UP-EXT
strcat(KeyAction,"pgup");
StandAlone=true;
break;
}//K-REC-UP-EXT
return 1;
}
case 0x22://page down key
{
if(Extended)
{//K-REC-UP-EXT
strcat(KeyAction,"pgdown");
StandAlone=true;
break;
}//K-REC-UP-EXT
strcat(Script,"Pause(\"100\")+\n");
return 1;
}
case 0x23://end key
{
if(Extended)
{//K-REC-UP-EXT
strcat(KeyAction,"end");
StandAlone=true;
break;
}//K-REC-UP-EXT
strcat(Script,"Pause(\"25\")+\n");
return 1;
}
case 0x24://home key
{
if(Extended)
{//K-REC-UP-EXT
strcat(KeyAction,"home");
StandAlone=true;
break;
}//K-REC-UP-EXT
return 1;
}
case 0x25://left arrow key
{
if(Extended)
{//K-REC-UP-EXT
strcat(KeyAction,"left");
StandAlone=true;
break;
}//K-REC-UP-EXT
strcat(Script,"Pause(\"400\")+\n");
return 1;
}
case 0x26://up arrow key
{
if(Extended)
{//K-REC-UP-EXT
strcat(KeyAction,"up");
StandAlone=true;
break;
}//K-REC-UP-EXT
return 1;
}
case 0x27://right arrow key
{
if(Extended)
{//K-REC-UP-EXT
strcat(KeyAction,"right");
StandAlone=true;
break;
}//K-REC-UP-EXT
return 1;
}
case 0x28://down arrow key
{
if(Extended)
{//K-REC-UP-EXT
strcat(KeyAction,"down");
StandAlone=true;
break;
}//K-REC-UP-EXT
strcat(Script,"Pause(\"50\")+\n");
return 1;
}
case 0x2D://insert key
{
strcat(KeyAction,"insert");
StandAlone=true;
break;
}
case 0x2E://delete key
{
strcat(KeyAction,"delete");
StandAlone=true;
break;
}
case 0x30://0 key
{
strcat(KeyAction,"0");
break;
}
case 0x31://1 key
{
strcat(KeyAction,"1");
break;
}
case 0x32://2 key
{
strcat(KeyAction,"2");
break;
}
case 0x33://3 key
{
strcat(KeyAction,"3");
break;
}
case 0x34://4 key
{
strcat(KeyAction,"4");
break;
}
case 0x35://5 key
{
strcat(KeyAction,"5");
break;
}
case 0x36://6 key
{
strcat(KeyAction,"6");
break;
}
case 0x37://7 key
{
strcat(KeyAction,"7");
break;
}
case 0x38://8 key
{
strcat(KeyAction,"8");
break;
}
case 0x39://9 key
{
strcat(KeyAction,"9");
break;
}
case 0x41://a key
{
strcat(KeyAction,"a");
break;
}
case 0x42://b key
{
strcat(KeyAction,"b");
break;
}
case 0x43://c key
{
strcat(KeyAction,"c");
break;
}
case 0x44://d key
{
strcat(KeyAction,"d");
break;
}
case 0x45://e key
{
strcat(KeyAction,"e");
break;
}
case 0x46://f key
{
strcat(KeyAction,"f");
break;
}
case 0x47://g key
{
strcat(KeyAction,"g");
break;
}
case 0x48://h key
{
strcat(KeyAction,"h");
break;
}
case 0x49://i key
{
strcat(KeyAction,"i");
break;
}
case 0x4A://j key
{
strcat(KeyAction,"j");
break;
}
case 0x4B://k key
{
strcat(KeyAction,"k");
break;
}
case 0x4C://l key
{
strcat(KeyAction,"l");
break;
}
case 0x4D://m key
{
strcat(KeyAction,"m");
break;
}
case 0x4E://n key
{
strcat(KeyAction,"n");
break;
}
case 0x4F://o key
{
strcat(KeyAction,"o");
break;
}
case 0x50://p key
{
strcat(KeyAction,"p");
break;
}
case 0x51://q key
{
strcat(KeyAction,"q");
break;
}
case 0x52://r key
{
strcat(KeyAction,"r");
break;
}
case 0x53://s key
{
strcat(KeyAction,"s");
break;
}
case 0x54://t key
{
strcat(KeyAction,"t");
break;
}
case 0x55://u key
{
strcat(KeyAction,"u");
break;
}
case 0x56://v key
{
strcat(KeyAction,"v");
break;
}
case 0x57://w key
{
strcat(KeyAction,"w");
break;
}
case 0x58://x key
{
strcat(KeyAction,"x");
break;
}
case 0x59://y key
{
strcat(KeyAction,"y");
break;
}
case 0x5A://z key
{
strcat(KeyAction,"z");
break;
}
case 0x60://keypad key
{
strcat(KeyAction,"np0");
StandAlone=true;
break;
}
case 0x61://keypad key
{
strcat(KeyAction,"np1");
StandAlone=true;
break;
}
case 0x62://keypad key
{
strcat(KeyAction,"np2");
StandAlone=true;
break;
}
case 0x63://keypad key
{
strcat(KeyAction,"np3");
StandAlone=true;
break;
}
case 0x64://keypad key
{
strcat(KeyAction,"np4");
StandAlone=true;
break;
}
case 0x66://keypad key
{
strcat(KeyAction,"np6");
StandAlone=true;
break;
}
case 0x67://keypad key
{
strcat(KeyAction,"np7");
StandAlone=true;
break;
}
case 0x68://keypad key
{
strcat(KeyAction,"np8");
StandAlone=true;
break;
}
case 0x69://keypad key
{
strcat(KeyAction,"np9");
StandAlone=true;
break;
}
case 0x70://function key

{
strcat(KeyAction,"f1");
StandAlone=true;
break;
}
case 0x71://function key

{
strcat(KeyAction,"f2");
StandAlone=true;
break;
}
case 0x72://function key
{
strcat(KeyAction,"f3");
StandAlone=true;
break;
}
case 0x73://function key
{
strcat(KeyAction,"f4");
StandAlone=true;
break;
}
case 0x74://function key
{
strcat(KeyAction,"f5");
StandAlone=true;
break;
}
case 0x75://function key
{
strcat(KeyAction,"f6");
StandAlone=true;
break;
}
case 0x76://function key
{
strcat(KeyAction,"f7");
StandAlone=true;
break;
}
case 0x77://function key
{
strcat(KeyAction,"f8");
StandAlone=true;
break;
}
case 0x78://function key
{
strcat(KeyAction,"f9");
StandAlone=true;
break;
}
case 0x79://function key
{
strcat(KeyAction,"f10");
StandAlone=true;
break;
}
case 0x7A://function key
{
strcat(KeyAction,"f11");
StandAlone=true;
break;
}
case 0x7B://function key
{
strcat(KeyAction,"f12");
StandAlone=true;
break;
}
case 0xBA://semicolon key
{
strcat(KeyAction,"semicolon");
break;
}
case 0xBB://equals key
{
strcat(KeyAction,"equal");
break;
}
case 0xBC://comma key
{
strcat(KeyAction,"comma");
break;
}
case 0xBD://hyphen key
{
strcat(KeyAction,"hyphen");
break;
}
case 0xBE://period key
{
strcat(KeyAction,"dot");
break;
}
case 0xBF://slash key
{
strcat(KeyAction,"slash");
break;
}
case 0xC0://left quote key
{
strcat(KeyAction,"backtick");
break;
}
case 0xDB://left bracket key
{
strcat(KeyAction,"lbracket");
break;
}
case 0xDC://backslash key
{
strcat(KeyAction,"backslash");
break;
}
case 0xDD://right bracket key
{
strcat(KeyAction,"rbracket");
break;
}
case 0xDE://apostrophe
{
strcat(KeyAction,"squote");
break;
}
default:
{//K-REC-UP-SW-modifier or unknown
return::CallNextHookEx(g_hHookKey,nCode,wParam,lParam);
}//K-REC-UP-SW-modifier or unknown
}//K-REC-UP-search for nonmodifier keys
if(!StandAlone)
{//K-REC-UP-LINE-combinable
if(Continued)
{//K-REC-UP-LINE-combinable-continued, overwrite characters
Script[strlen(Script)-6]='\0';
strcat(Script,",");
}//K-REC-UP-LINE-combinable-continued, overwrite characters
else
{//K-REC-UP-LINE-combinable-first action
Continued=true;
strcat(Script,"Key(\"");
}//K-REC-UP-LINE-combinable-first action
}//K-REC-UP-LINE-combinable
else
{//K-REC-UP-LINE-stand alone
Continued=false;
strcat(Script,"Key(\"");
}//K-REC-UP-LINE-stand alone
//later, use a variable for timing
strcat(Script,KeyAction);
strcat(Script,"/5\")+\n");
return::CallNextHookEx(g_hHookKey,nCode,wParam,lParam);
}//K-REC-UP
AfterFirstUpstroke=false;
if(KeyWasDown)
{//K-REC-REP-eat all repeat keys while recording
return 1;
}//K-REC-REP-eat all repeat keys while recording
if(Extended)
{//K-REC-DN-EXT, extended keys returned, keypad keys aren't
return::CallNextHookEx(g_hHookKey,nCode,wParam,lParam);
}//K-REC-DN-EXT, extended keys returned, keypad keys aren't
switch(wParam)
{//K-REC-DN-search for keypad key
case Pad_1:
case Pad_2:
case Pad_3:
case Pad_4:
case Pad_5:
case Pad_6:
case Pad_7:
case Pad_8:
case Pad_9:
{//K-REC-DN-PAD-eat keypad key downstroke
return 1;
}//K-REC-DN-PAD-eat keypad key downstroke
}//K-REC-DN-search for keypad key
return::CallNextHookEx(g_hHookKey,nCode,wParam,lParam);
}//K-REC
if(wParam==Pad_5)
{//K-DOR-KP5, this is the only key of concern while dormant
if(Upstroke)
{//K-DOR-KP5-UP-start recording script

Recording=true;
Continued=false;
*Script='\0';
::GetCursorPos(&UpPtrPos);
// *TtlName='\0';
// *CpyTtlName='\0';
// Marked=false;
// Place1=0;Place2=0;
// //condense title bar
// ::GetWindowText(::GetForegroundWindow(),TtlName,255);
// while(TtlName[Place1]!='\0')
// {//EXE-WH_TB
// while(isalnum(TtlName[Place1]))
// {//EXE-WH_TB-WH_NRML
// CpyTtlName[Place2]=TtlName[Place1];
// Place1++;Place2++;
// }//EXE-WH_TB-WH_NRML
// while((TtlName[Place1]!='\0')&&(!isalnum(TtlName[Place1])))
// {//EXE-WH_TB-WH_ODD
// if(Marked)
// {//EXE-WH_TB-WH_ODD-IF_MRKD
// Place1++;
// }//EXE-WH_TB-WH_ODD-IF_MRKD
// else
// {//EXE-WH_TB-WH_ODD-EL_MRK
// CpyTtlName[Place2]=' ';
// Marked=true;
// Place1++;Place2++;
// }//EXE-WH_TB-WH_ODD-EL_MRK
// }//EXE-WH_TB-WH_ODD
// Marked=false;
// }//EXE-WH_TB
// if(CpyTtlName[Place2-1]==' ')
// {//EXE-terminate over space character
// CpyTtlName[Place2-1]='\0';
// }//EXE-terminate over space character
// else
// {//EXE-terminate the string
// CpyTtlName[Place2]='\0';
// }//EXE-terminate the string
//strcpy(FileName,CpyTtlName);
//strcpy(FilePath,FileName);
//strcat(FilePath,"\n");
//strcat(Script,FilePath);
if(::GetKeyState(VK_CONTROL)&0x8000)
{//K-DOR-KP5-UP-MOD, start recording repetitive script
//obsolete code removed
PlaySound("C:\\Program Files\\VoiceWorks\\titatoo1.wav",NULL,SND_FILENAME);
return 1;
}//K-DOR-KP5-UP-MOD, start recording repetitive script
//start recording script
PlaySound("C:\\Program Files\\VoiceWorks\\titatoo1.wav",NULL,SND_FILENAME);
return 1;
}//K-DOR-KP5-UP-start recording script
return 1;
}//K-DOR-KP5, this is the only key of concern while dormant
return::CallNextHookEx(g_hHookKey,nCode,wParam,lParam);
}//DLL KEYBOARD MESSAGE
LRESULT CALLBACK MouseHook(int nCode,WPARAM wParam,LPARAM lParam)
{//DLL MOUSE MESSAGE
if((wParam==WM_MOUSEMOVE)||(wParam==WM_NCMOUSEMOVE))
{//reject mouse movement
return::CallNextHookEx(g_hHookMouse,nCode,wParam,lParam);
}//reject mouse movement
if(Recording)
{//M-RECORDING
if(UnknownAction)
{//M-REC-unusable mouse message
return::CallNextHookEx(g_hHookKey,nCode,wParam,lParam);
}//M-REC-unusable mouse message
//M-REC-UP-finish last keystroke line if necessary
if(wParam==WM_LBUTTONDBLCLK)
{//M-REC-double click
Script[strlen(Script)-20]='\0';
strcat(Script,"Mouse(\"left:2/20\")+\n");
SkipMouseAction=true;
return::CallNextHookEx(g_hHookMouse,nCode,wParam,lParam);
}//M-REC-double click
if((wParam==WM_NCLBUTTONDOWN)||(wParam==WM_LBUTTONDOWN)||
(wParam==WM_NCRBUTTONDOWN)||(wParam==WM_RBUTTONDOWN))
{//M-REC-USE-BTN_DN
::GetCursorPos(&DnPtrPos);
if(((DiffPtrPos)||(abs(UpPtrPos.x-DnPtrPos.x)>5)||(abs(UpPtrPos.y-DnPtrPos.y)>5)))
{//M-REC-USE-BTN_DN-will record pointer location
PtrMovB4Down=true;
}//M-REC-USE-BTN_DN-will record pointer location
return::CallNextHookEx(g_hHookMouse,nCode,wParam,lParam);
}//M-REC-USE-BTN_DN
DiffPtrPos=false;
if(!PtrMovB4Down)
{//M-REC-USE-BTN_UP-no movement prior to this click
if((wParam==WM_NCLBUTTONUP)||(wParam==WM_LBUTTONUP))
{//M-REC-USE-LT_BTN_UP-NO_MOV-left click at current location
if(SkipMouseAction)
{//button up after double click message
SkipMouseAction=false;
return::CallNextHookEx(g_hHookMouse,nCode,wParam,lParam);
}//button up after double click message
strcat(Script,"Mouse(\"left:1/10\")+\n");
return::CallNextHookEx(g_hHookMouse,nCode,wParam,lParam);
}//M-REC-USE-LT_BTN_UP-NO_MOV-left click at current location
else
{//M-REC-USE-RT_BTN_UP-NO_MOV-right click at current location
strcat(Script,"Mouse(\"right:1/10\")+\n");
}//M-REC-USE-RT_BTN_UP-NO_MOV-right click at current location
return::CallNextHookEx(g_hHookMouse,nCode,wParam,lParam);
}//M-REC-USE-BTN_UP-no movement prior to this click
PtrMovB4Down=false;
::GetCursorPos(&UpPtrPos);
strcpy(KeyDownPoint,_ltoa(DnPtrPos.x,MouseAction,10));
strcat(KeyDownPoint,",");
strcat(KeyDownPoint,_ltoa(DnPtrPos.y,MouseAction,10));
strcpy(KeyUpPoint,_ltoa(UpPtrPos.x,MouseAction,10));
strcat(KeyUpPoint,",");
strcat(KeyUpPoint,_ltoa(UpPtrPos.y,MouseAction,10));
if((wParam==WM_NCLBUTTONUP)||(wParam==WM_LBUTTONUP))
{//M-REC-USE-LT_BTN_UP
if((abs(UpPtrPos.x-DnPtrPos.x)>5)||(abs(UpPtrPos.y-DnPtrPos.y)>5))
{//M-REC-USE-LT_BTN_UP-point and drag
strcat(Script,"Mouse(\"[");
strcat(Script,KeyDownPoint);
strcat(Script,"],left:down/10\")+\n");
strcat(Script,"Mouse(\"[");
strcat(Script,KeyUpPoint);
strcat(Script,"],left:up/10\")+\n");
return::CallNextHookEx(g_hHookMouse,nCode,wParam,lParam);
}//M-REC-USE-LT_BTN_UP-point and drag
//M-REC-USE-LT_BTN_UP-point and click
DiffPtrPos=false;
strcat(Script,"Mouse(\"[");
strcat(Script,KeyUpPoint);
strcat(Script,"],left:1/10\")+\n");
return::CallNextHookEx(g_hHookMouse,nCode,wParam,lParam);
//M-REC-USE-LT_BTN_UP-point and click
}//M-REC-USE-LT_BTN_UP
if((wParam==WM_NCRBUTTONUP)||(wParam==WM_RBUTTONUP))
{//M-REC-USE-RT_BTN_UP
if((abs(UpPtrPos.x-DnPtrPos.x)>5)||(abs(UpPtrPos.y-DnPtrPos.y)>5))
{//M-REC-USE-RT_BTN_UP-point and drag
return::CallNextHookEx(g_hHookMouse,nCode,wParam,lParam);
}//M-REC-USE-RT_BTN_UP-point and drag
//M-REC-USE-RT_BTN_UP-point and click
strcat(Script,"Mouse(\"[");
strcat(Script,KeyUpPoint);
strcat(Script,"],right:1/10\")+\n");
return::CallNextHookEx(g_hHookMouse,nCode,wParam,lParam);
//M-REC-USE-RT_BTN_UP-point and click
}//M-REC-USE-RT_BTN_UP
}//M-RECORDING
return::CallNextHookEx(g_hHookMouse,nCode,wParam,lParam);
}//DLL MOUSE MESSAGE
.