OSDN Git Service

[Release] Ver.2.1.1
[dokopop/dokopop.git] / DCHookTest / DCHookMain.cpp
index 9b33e2f..0d40c3b 100644 (file)
@@ -64,6 +64,7 @@ bool DdePoke( TDdeClientConv *dde, AnsiString Item, AnsiString Data );
 #ifdef USE_UNICODE
 // Unicode\82Å\93n\82·\8fê\8d\87
 bool DdePoke( TDdeClientConv *dde, AnsiString Item, const wchar_t *Data );
+bool DdeRequest( TDdeClientConv *dde, AnsiString Item, char *Data, int &inoutDataLen );
 #endif;
 void GetGroupList(TMyIni &ini, TStringList &list);
 
@@ -74,6 +75,7 @@ __fastcall TDCHookMainForm::TDCHookMainForm(TComponent* Owner)
        hDll = NULL;
        EnablePopup = true;
 
+#if 0
        WindowsNT = false;
 
        OSVERSIONINFO VersionInfo;
@@ -84,6 +86,7 @@ __fastcall TDCHookMainForm::TDCHookMainForm(TComponent* Owner)
                        WindowsNT = true;
                        break;
        }
+#endif
        CheckWOW64();
        BootUp = true;
        Capturing = false;
@@ -943,8 +946,27 @@ bool DdePoke( TDdeClientConv *dde, AnsiString Item, const wchar_t *Data )
                                DdeFreeDataHandle( hdata );
                }
        }
+       DdeFreeStringHandle(ddeMgr->DdeInstId, hszItem);
+       return r;
+}
+bool DdeRequest( TDdeClientConv *dde, AnsiString Item, char *Data, int &ioDataLen )
+{
+       const int ddeFmt = /*dde->DdeFmt*/CF_UNICODETEXT;
+       HSZ hszItem = DdeCreateStringHandle(ddeMgr->DdeInstId, Item.c_str(), CP_WINANSI );
+       if ( !hszItem ) return false;
+       bool r = false;
+       HDDEDATA hdata = DdeClientTransaction( NULL, 0, (HCONV)dde->Conv, hszItem, ddeFmt, XTYP_REQUEST, 10000, NULL);
+       if (hdata || DdeGetLastError(ddeMgr->DdeInstId) != DMLERR_NO_ERROR){
+               r = true;
+               if (hdata){
+                       ioDataLen = DdeGetData(hdata, (LPBYTE)Data, ioDataLen, 0);
+                       DdeFreeDataHandle( hdata );
+               } else {
+                       Data[0] = '0';
+                       ioDataLen = 0;
+               }
        }
-       DdeFreeStringHandle (ddeMgr->DdeInstId, hszItem);
+       DdeFreeStringHandle(ddeMgr->DdeInstId, hszItem);
        return r;
 }
 #endif
@@ -1015,6 +1037,32 @@ void TDCHookMainForm::ClosePdic( TDdeClientConv *dde )
        dde->CloseLink();
        delete dde;
 }
+// XX.XX.XXXX (hex) 1+1+2 byte\8d\\90¬
+int TDCHookMainForm::GetPdicVersion()
+{
+       TDdeClientConv *PdicDde = OpenPdic("PDIC");
+       if (!PdicDde) return 0;
+       int version = 0;
+#ifdef USE_UNICODE
+       char buf[40];
+       int size = sizeof(buf);
+       if (DdeRequest(PdicDde, "GetVersion", buf, size)){
+               wchar_t *str = (wchar_t*)buf;
+               version = _wtoi( str ) << 24;
+               const wchar_t *p = wcschr( str, '.' );
+               if (p){
+                       version |= _wtoi( p+1 ) << 16;
+                       p = wcschr( p+1, '.' );
+                       if (p){
+                               version |= _wtoi( p+1 );
+                       }
+               }
+               //DBW("version: %X", version);
+       }
+#endif
+       ClosePdic( PdicDde );
+       return version;
+}
 // click_pos: mouse click\82³\82ê\82½text\8fã\82Ì\95\8e\9a\88Ê\92u(text\90æ\93ª\82©\82ç\82Ìoffset)
 bool TDCHookMainForm::DoPopup( const tchar *text, int click_pos, const tchar *prevtext, bool movesend )
 {
@@ -1215,13 +1263,16 @@ void TDCHookMainForm::EvPopup(TMessage &msg)
        if (!msg.LParam)
                return;
 
+       int pdicVer = GetPdicVersion();
+       const int numPrev = pdicVer >= 0x050A0018 ? 2 : 1;      // ver.5.10.24\88È\8fã
+               
        tchar *text = (tchar*)msg.LParam;
        int loc = msg.WParam & ~FLG_MOVESEND;
        bool movesend = msg.WParam & FLG_MOVESEND ? true : false;
        
        int start, end;
        int prevstart;
-       if ( !GetWord( text, loc, start, end, prevstart, true, 10, true, IgnoreJ ) ){
+       if ( !GetWord( text, loc, start, end, prevstart, true, 10, true, IgnoreJ, numPrev ) ){
                // no words
                delete[] text;
                return;
@@ -1345,6 +1396,8 @@ void TDCHookMainForm::SetupConfig2()
                cfg.ScaleX = Ini->ReadInteger(PFS_CONFIG, PFS_SCALE, 0);
        }
        cfg.ScaleY = cfg.ScaleX;
+       cfg.UseNumPrev = 1;
+       cfg.NumPrevWords = 2;
        hDll->Config2(&cfg);
 }
 void TDCHookMainForm::SetupAMODI()