1 //---------------------------------------------------------------------------
5 #include "DCHookMain.h"
9 #include "PopupConfig.h"
11 #include "DCHookLoader.h"
13 #include "MODINotifyDlg.h"
14 #include "prgconfig.h"
15 #include "OCRTextFrm.h"
16 #include "MonitorScale.h"
17 //---------------------------------------------------------------------------
18 #pragma package(smart_init)
20 /*------------------------------------------*/
22 /*------------------------------------------*/
23 // Popup
\82Ì
\82½
\82Ñ
\82ÉDLL
\82ðUnload/Load
\82·
\82é
24 //
\94½
\89\9e\82µ
\82È
\82
\82È
\82Á
\82½
\82Æ
\82«
\82Ì
\82½
\82ß
\82Ì
\91Î
\8fÇ
\97Ã
\96@
26 // inc.srch ON
\82Ì
\82Æ
\82«
\81AMoveSent
\82ª
\8fí
\82Éreset
\82³
\82ê
\82Ä
\82µ
\82Ü
\82¤
\82½
\82ß
\81A
27 // mouse
\82ªstill
\8fó
\91Ô
\82Å
\82 \82Á
\82Ä
\82à
\89½
\93x
\82àinc.srch
\82Ì
\83\8a\83N
\83G
\83X
\83g
\82ª
\82â
\82Á
\82Ä
\82
\82é
\81B
28 //
\82Ù
\82©
\81Apopup/inc.srch
\82ð
\82â
\82é
\82½
\82Ñ
\82ÉDLL
\93à
\82Ì
\95Ï
\90\94\82ªreset
\82³
\82ê
\82é
\82½
\82ß
\82±
\82ê
\82Í
\82æ
\82ë
\82µ
\82
\82È
\82¢
\81B
29 #define DETACHRELEASE 0
31 #define MIGROUP_INDEX 1 //
\8e«
\8f\91\83O
\83\8b\81[
\83v
\95Ï
\8dX
\83\81\83j
\83\85\81[
\82Ìindex
33 // PDIC
\8bN
\93®
\8cã
\82ÌOpenLink()
\8e¸
\94s
\8e\9e\82Ìretry
\82¨
\82æ
\82Ñwaittime
35 #define OPEN_WAITTIME 500 // [mSec]
37 #define DPI_DETECT 0 // DPI Detect in main (monitor
\82²
\82Æ
\82Ì
\90Ý
\92è
\82ª
\82Å
\82«
\82È
\82¢
\82½
\82ßdebug
\97p)
39 #define DEF_USE64 (fWow64)
41 /*------------------------------------------*/
43 /*------------------------------------------*/
44 #define URL_MODI_INSTALL "http://support.microsoft.com/kb/982760"
46 #define DEF_POPUPKEY (KF_CONTROL)
47 #define DEF_TOGGLEKEY (KF_CONTROL+KF_MENU)
49 #define WM_AMODI (WM_APP+0x400) // app communication message with AMODI
51 #define FLG_MOVESEND 0x40000000 // mouse move send
53 #pragma resource "*.dfm"
54 TDCHookMainForm *DCHookMainForm;
56 #define COMPANYNAME "Software\\DokoPopProject\\"
60 /*------------------------------------------*/
62 /*------------------------------------------*/
63 bool DdePoke( TDdeClientConv *dde, AnsiString Item, AnsiString Data );
65 // Unicode
\82Å
\93n
\82·
\8fê
\8d\87
66 bool DdePoke( TDdeClientConv *dde, AnsiString Item, const wchar_t *Data );
67 bool DdeRequest( TDdeClientConv *dde, AnsiString Item, char *Data, int &inoutDataLen );
69 void GetGroupList(TMyIni &ini, TStringList &list);
71 //---------------------------------------------------------------------------
72 __fastcall TDCHookMainForm::TDCHookMainForm(TComponent* Owner)
81 OSVERSIONINFO VersionInfo;
82 VersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
83 GetVersionEx(&VersionInfo);
84 switch (VersionInfo.dwPlatformId){
85 case VER_PLATFORM_WIN32_NT:
95 CaptureMode = CM_TEXT | CM_IMAGE;
99 //---------------------------------------------------------------------------
100 void __fastcall TDCHookMainForm::FormCreate(TObject *Sender)
102 Ini = new TMyIni( HKEY_CURRENT_USER, COMPANYNAME APPREGNAME, true );
103 // DBW("Handle=%08X",Handle);
106 Left = Ini->ReadInteger( PFS_MAIN, "Left", Left );
107 Top = Ini->ReadInteger( PFS_MAIN, "Top", Top );
108 Width = Ini->ReadInteger( PFS_MAIN, "Width", Width );
109 Height = Ini->ReadInteger( PFS_MAIN, "Height", Height );
112 GroupOpen = Ini->ReadInteger( PFS_CONFIG, PFS_GROUPOPEN, false );
113 GroupName = Ini->ReadString( PFS_CONFIG, PFS_GROUPNAME, "" );
114 CtrlClose = Ini->ReadInteger( PFS_CONFIG, PFS_CTRLCLOSE, false );
115 IgnoreJ = Ini->ReadInteger( PFS_CONFIG, PFS_IGNOREJ, true );
116 Banner = Ini->ReadInteger( PFS_CONFIG, PFS_BANNER, true );
119 BorderStyle = bsNone;
121 Memo->Visible = false;
122 Panel1->Visible = false;
123 Splitter1->Visible = false;
124 Menu->Items->Delete( 0 );
125 Image->Visible = true;
126 // Title->Caption = Title->Caption + " " + StrVersion;
127 // Title->Align = alBottom;
129 Title->Visible = true;
132 AnsiString bmp = ExtractFilePath( Application->ExeName );
134 if ( FileExists( bmp ) ){
135 Image->Picture->Bitmap->LoadFromFile( bmp );
138 Width = Image->Picture->Width;
139 Height = Image->Picture->Height;
142 Left += ( ( ( GetSystemMetrics( SM_CXSCREEN ) - ( Width ) ) / 2 + 4 ) & ~7 ) - Left;
143 Top += ( ( GetSystemMetrics( SM_CYSCREEN ) - ( Height ) ) / 2 ) - Top;
149 BootTimer->Interval = 100;
151 WindowState = wsNormal;
154 BootTimer->Interval = 10;
155 //
\82È
\82ñ
\82ÆVisible = false;
\82É
\82·
\82é
\82Æ
\81A
156 //
\83A
\83C
\83R
\83\93\89»
\82µ
\82½
\82Æ
\82«
\81E
\81E
\81E
\83A
\83C
\83R
\83\93\82ª
\95\
\8e¦
\82³
\82ê
\82é
157 //
\83A
\83C
\83R
\83\93\89»
\82µ
\82È
\82¢
\82Æ
\82«
\81E
\81E
\83A
\83C
\83R
\83\93\82Í
\8fo
\82Ä
\82±
\82È
\82¢
158 //
\95Ï
\82È
\8ed
\97l
\81H
159 //
\82Æ
\82¢
\82¤
\82í
\82¯
\82Å
\95\9d\82ð
\83[
\83\8d\82É
\82µ
\82ÄWindow
\82ð
\94ñ
\95\
\8e¦
\89»
\82Æ
\82¤
\82¢
\8e×
\93¹
\82È
\95û
\96@
160 //
\8dÅ
\8f\89\82©
\82ç
\82¸
\82Á
\82ÆVisible=false
\82Æ
\82¢
\82¤
\95û
\96@
\82à
\82 \82é
\82ª
\81A
161 // VCL
\82ªMainWindow
\82ð
\95K
\82¸visible
\82É
\82·
\82é
\8f\88\97\9d\82ð
\8ds
\82Á
\82Ä
\82¢
\82é
\82½
\82ß
\95s
\89Â
\94\
162 //
\82Ù
\82©
\82É
\82¢
\82¢
\95û
\96@
\82ª
\82 \82Á
\82½
\82æ
\82¤
\82È
\8bC
\82ª
\82·
\82é
\82ª
\81A
\81A
\81A
\81A
165 Visible = true; //
\8dÅ
\8f¬
\89»
\82Å
\8bN
\93®
\82·
\82é
\82Æ
\81A
\83A
\83C
\83R
\83\93\95\
\8e¦
\82ª
\8fÁ
\82¦
\82È
\82¢
\82½
\82ß
\81B
166 //
\82±
\82Ì
\95û
\96@
\82ª
\93K
\93\96\82Å
\82 \82é
\82©
\82Ç
\82¤
\82©
\90[
\82
\8dl
\82¦
\82Ä
\82¢
\82È
\82¢
\81E
\81E
167 // (
\82½
\82Ü
\82½
\82Ü
\82¤
\82Ü
\82
\93®
\82¢
\82½:-)
169 WindowState = wsNormal;
173 //TODO: default=ON
\82É
\82·
\82é
\82Æ
\95s
\88À
\92è
\82É
\82È
\82é
\82Ì
\82Å
\82µ
\82Î
\82ç
\82def=false
174 //MouseIncSrch = Ini->ReadInteger( PFS_CONFIG, PFS_INCSRCH, MouseIncSrch );
175 CaptureMode = Ini->ReadInteger( PFS_CONFIG, PFS_CAPTURE_MODE, CaptureMode );
177 btnOK->Left = (SavedWidth - btnOK->Width)>>1;
178 btnOK->Top = Height - btnOK->Height - 8;
179 lbVersion->Caption = StrVersion;
180 lbVersion->Left = btnOK->Left + btnOK->Width + 4;
181 lbVersion->Top = btnOK->Top;
183 BootTimer->Enabled = true;
185 if (!AMODIAvail && (CaptureMode & CM_IMAGE)){
186 tmMODINotify->Enabled = true;
189 // Application->OnIdle = IdleHandler;
191 //---------------------------------------------------------------------------
192 void __fastcall TDCHookMainForm::FormCloseQuery(TObject *Sender,
199 OCRTextForm->Visible = false;
203 RegisterTrayIcon( false );
206 wp.length = sizeof(WINDOWPLACEMENT);
207 GetWindowPlacement( Handle, &wp );
208 RECT &rc = wp.rcNormalPosition;
209 Ini->WriteInteger( PFS_MAIN, "Left", rc.left );
210 Ini->WriteInteger( PFS_MAIN, "Top", rc.top );
211 Ini->WriteInteger( PFS_MAIN, "Width", rc.right - rc.left );
212 Ini->WriteInteger( PFS_MAIN, "Height", rc.bottom - rc.top );
215 miUnhookClick( this );
223 //---------------------------------------------------------------------------
224 void __fastcall TDCHookMainForm::FormKeyPress(TObject *Sender, char &Key)
234 void __fastcall TDCHookMainForm::IdleHandler(TObject *sender, bool &done)
236 if (NotifyAMODIEnabled){
237 NotifyAMODIEnabled = false;
242 //---------------------------------------------------------------------------
244 //---------------------------------------------------------------------------
245 void __fastcall TDCHookMainForm::miDicGroup(TObject *Sender)
247 //
\8e«
\8f\91\83O
\83\8b\81[
\83v
248 AnsiString name = ((TMenuItem*)Sender)->Caption;
249 if ( name.Length() ){
250 OpenDicGroup( name.c_str() );
253 //---------------------------------------------------------------------------
254 void __fastcall TDCHookMainForm::miClickOnlyClick(TObject *Sender)
256 miClickOnly->Checked = !miClickOnly->Checked;
257 EnableClickOnly( miClickOnly->Checked );
260 //---------------------------------------------------------------------------
261 void __fastcall TDCHookMainForm::miIncSearchClick(TObject *Sender)
263 miIncSearch->Checked = !miIncSearch->Checked;
264 MouseIncSrch = miIncSearch->Checked;
265 Ini->WriteInteger( PFS_CONFIG, PFS_INCSRCH, MouseIncSrch );
268 HWND hwnd = FindPdic();
274 //---------------------------------------------------------------------------
275 #if 0 // change capture mode
276 if (!AMODIAvail && (CaptureMode & CM_IMAGE)){
287 //---------------------------------------------------------------------------
288 void __fastcall TDCHookMainForm::miEnablePopupClick(TObject *Sender)
290 if ( miEnablePopup->Checked ){
291 miUnhookClick( this );
299 //---------------------------------------------------------------------------
300 void __fastcall TDCHookMainForm::miOCRTextClick(TObject *Sender)
302 if (!OCRTextForm) OCRTextForm = new TOCRTextForm(this);
303 OCRTextForm->Visible = true;
305 //---------------------------------------------------------------------------
306 void __fastcall TDCHookMainForm::miOptionClick(TObject *Sender)
309 MoveToTop(PopupConfigDlg->Handle);
314 PopupConfigDlg = new TPopupConfigDlg( this );
315 PopupConfigDlg->cbGroupOpen->Checked = GroupOpen;
316 PopupConfigDlg->edGroupName->Text = GroupName;
317 PopupConfigDlg->SetPopupKey( Ini->ReadInteger( PFS_CONFIG, PFS_POPUPKEY, DEF_POPUPKEY ) );
318 PopupConfigDlg->SetToggleKey( Ini->ReadInteger( PFS_CONFIG, PFS_TOGGLEKEY, DEF_TOGGLEKEY ) );
319 PopupConfigDlg->cbCtrlClose->Checked = CtrlClose;
320 PopupConfigDlg->cbIgnoreJ->Checked = IgnoreJ;
321 PopupConfigDlg->cbBanner->Checked = Banner;
322 bool useAMODI = CaptureMode & CM_IMAGE ? true : false;
323 PopupConfigDlg->SetCaptureMode( CaptureMode );
324 PopupConfigDlg->SetScaler( Ini->ReadInteger(PFS_CONFIG, PFS_SCALE, 0) );
325 PopupConfigDlg->edAMODIPath->Text = AMODIPath;
326 PopupConfigDlg->SetMODIAvail( AMODIAvail );
327 bool use64 = Ini->ReadInteger(PFS_CONFIG, PFS_USE64, DEF_USE64);
328 PopupConfigDlg->cbUse64->Checked = use64;
329 SetForegroundWindow( PopupConfigDlg->Handle );
330 if ( PopupConfigDlg->ShowModal() == IDOK ){
331 GroupOpen = PopupConfigDlg->cbGroupOpen->Checked;
332 GroupName = PopupConfigDlg->edGroupName->Text;
333 CtrlClose = PopupConfigDlg->cbCtrlClose->Checked;
334 IgnoreJ = PopupConfigDlg->cbIgnoreJ->Checked;
335 Banner = PopupConfigDlg->cbBanner->Checked;
336 AMODIPath = PopupConfigDlg->edAMODIPath->Text;
337 Ini->WriteInteger( PFS_CONFIG, PFS_POPUPKEY,
338 PopupConfigDlg->GetPopupKey() );
339 Ini->WriteInteger( PFS_CONFIG, PFS_TOGGLEKEY,
340 PopupConfigDlg->GetToggleKey() );
341 CaptureMode = PopupConfigDlg->GetCaptureMode();
342 Ini->WriteInteger( PFS_CONFIG, PFS_CAPTURE_MODE, CaptureMode );
343 Ini->WriteInteger( PFS_CONFIG, PFS_SCALE, PopupConfigDlg->GetScaler() );
344 Ini->WriteString(PFS_CONFIG, PFS_AMODIPATH, AMODIPath.c_str());
345 Ini->WriteInteger(PFS_CONFIG, PFS_USE64, PopupConfigDlg->cbUse64->Checked);
348 tmReInit->Enabled = false;
349 if (!useAMODI && (CaptureMode & CM_IMAGE) && !AMODIAvail){
350 // AMODI off->ON
\82©
\82Â AMODI
\82ª
\82¢
\82È
\82¢
\8fê
\8d\87
353 if (PopupConfigDlg->cbUse64->Checked != use64){
354 // 64bit hook
\95Ï
\8dX
\8e\9e
359 delete PopupConfigDlg;
360 PopupConfigDlg = NULL;
362 void __fastcall TDCHookMainForm::miReadMeClick(TObject *Sender)
366 //---------------------------------------------------------------------------
367 void __fastcall TDCHookMainForm::miAboutClick(TObject *Sender)
369 // show version dialog
372 btnOK->Visible = true;
376 VersionDlg = new TVersionDlg( this );
377 VersionDlg->ShowModal();
381 //---------------------------------------------------------------------------
382 void __fastcall TDCHookMainForm::miCheckLatestClick(TObject *Sender)
386 //---------------------------------------------------------------------------
387 void __fastcall TDCHookMainForm::miCloseClick(TObject *Sender)
391 //---------------------------------------------------------------------------
392 void __fastcall TDCHookMainForm::miReloadClick(TObject *Sender)
399 //---------------------------------------------------------------------------
400 void __fastcall TDCHookMainForm::miHookClick(TObject *Sender)
403 Application->MessageBox( "DLL
\82ð
\8f\89\8aú
\89»
\82·
\82é
\82±
\82Æ
\82ª
\82Å
\82«
\82Ü
\82¹
\82ñ\r
\8fI
\97¹
\82µ
\82Ü
\82·", APPNAME, MB_OK );
407 //---------------------------------------------------------------------------
408 void __fastcall TDCHookMainForm::miUnhookClick(TObject *Sender)
412 //---------------------------------------------------------------------------
413 void __fastcall TDCHookMainForm::miConfigClick(TObject *Sender)
415 miOptionClick(Sender);
417 //---------------------------------------------------------------------------
418 void __fastcall TDCHookMainForm::miDdeTestClick(TObject *Sender)
421 DoPopup( _t("test"), 0, NULL, false );
424 //---------------------------------------------------------------------------
425 void __fastcall TDCHookMainForm::miTestClick(TObject *Sender)
429 hDll->Init32(Handle);
435 miIncSearchClick(Sender);
444 //---------------------------------------------------------------------------
445 void __fastcall TDCHookMainForm::miExitClick(TObject *Sender)
449 //---------------------------------------------------------------------------
450 // Popup on tray icon //
451 void __fastcall TDCHookMainForm::pmTrayIconPopup(TObject *Sender)
453 // Add group names to menu
459 int sel = ini.ReadInteger( PFS_COMMON, PFS_GRPSEL, -1 );
461 TStringList *strs = new TStringList;
462 TMenuItem *sub = pmTrayIcon->Items->Items[MIGROUP_INDEX];
466 GetGroupList(ini, *strs);
468 for ( int i=0;i<strs->Count;i++ ){
469 AnsiString name = strs->Strings[i];
470 if (name.IsEmpty() || name.AnsiPos("::")==1){
471 continue; // Ignore the group.
473 TMenuItem *item = new TMenuItem( this );
474 item->Caption = name;
475 item->OnClick = miDicGroup;
477 // Check current group name //
479 item->Checked = true;
484 miGroup->Visible = sub->Count != 0;
485 // Check enable popup item //
486 miIncSearch->Checked = MouseIncSrch;
487 miEnablePopup->Checked = EnablePopup;
489 miOCRText->Visible = CaptureMode & CM_IMAGE ? true : false;
491 //---------------------------------------------------------------------------
492 void __fastcall TDCHookMainForm::btnOKClick(TObject *Sender)
499 //---------------------------------------------------------------------------
501 //---------------------------------------------------------------------------
502 void __fastcall TDCHookMainForm::TestTimerTimer(TObject *Sender)
507 char *p = (char*)DCDebug( );
508 if ( memcmp( share, p, COMPSIZE ) ){
510 for ( int i=0;i<COMPSIZE;i++ ){
511 DBW("[%02X:%02X]", (unsigned char)share[i],(unsigned char)p[i]);
513 memcpy( share, p, COMPSIZE );
519 //---------------------------------------------------------------------------
520 void __fastcall TDCHookMainForm::BootTimerTimer(TObject *Sender)
524 //---------------------------------------------------------------------------
525 //
\82±
\82ê
\82ð
\82â
\82ç
\82È
\82¢
\82Æ
\81A
\81h
\83\81\83j
\83\85\81[
\82ð
\95Â
\82¶
\82é
\81h
\82ð
\8eÀ
\8ds
\8cã
\81A
526 //
\83A
\83C
\83R
\83\93\82ª
\83^
\83X
\83N
\83o
\81[
\82É
\8ec
\82Á
\82Ä
\82µ
\82Ü
\82¤
\81B
\82È
\82º
\81H
\81H
527 void __fastcall TDCHookMainForm::tmMenuCloseTimer(TObject *Sender)
531 ShowWindow( Application->Handle, SW_HIDE );
532 tmMenuClose->Enabled = false;
534 //---------------------------------------------------------------------------
535 void __fastcall TDCHookMainForm::tmNotifyTimer(TObject *Sender)
538 tmNotify->Enabled = false;
543 //---------------------------------------------------------------------------
544 void __fastcall TDCHookMainForm::tmPopupTimer(TObject *Sender)
546 PostMessage( Handle, WM_POPUP, PopupLoc | (PopupMoveSend ? FLG_MOVESEND : 0), (LPARAM)PopupText );
547 PopupText = NULL; // release ownership
548 tmPopup->Enabled = false; // stop timer
550 //---------------------------------------------------------------------------
551 void __fastcall TDCHookMainForm::tmMouseMoveTimer(TObject *Sender)
553 tmMouseMove->Enabled = false;
558 hDll->CaptureAsync();
560 //---------------------------------------------------------------------------
561 void __fastcall TDCHookMainForm::tmMODIInstallCheckTimer(TObject *Sender)
563 if (MODIInstalled()){
567 //
\8dÅ
\8f\89\82Ìpopup
\82Å
\97\8e\82¿
\82Ä
\82µ
\82Ü
\82¤
\81H
568 if (!AMODIAvail && (CaptureMode & CM_IMAGE)){
577 //---------------------------------------------------------------------------
578 void __fastcall TDCHookMainForm::tmMODINotifyTimer(TObject *Sender)
580 tmMODINotify->Enabled = false;
581 if (!AMODIRunable()){
585 //---------------------------------------------------------------------------
586 void __fastcall TDCHookMainForm::tmReInitTimer(TObject *Sender)
588 // amodi.exe
\82Ìlaunch
\82É
\94ñ
\8fí
\82É
\8e\9e\8aÔ
\82ª
\82©
\82©
\82é
\8fê
\8d\87\82ª
\82 \82é
589 // ex.
\8cÃ
\82¢PC
\82Åstartup
\82É
\93o
\98^
\82µ
\82Ä
\82¢
\82é
\8fê
\8d\87
590 //
\81¨input idle
\82É
\82È
\82Á
\82Ä
\82àmain window
\82Ì
\90¶
\90¬
\82É
\8e\9e\8aÔ
\82ª
\82©
\82©
\82Á
\82Ä
\82¢
\82é
\82Ì
\82©
\82à
\82µ
\82ê
\82È
\82¢
591 // AMODIAvail
\82ªtrue
\82É
\82È
\82é
\82Ü
\82Å
\8f\89\8aú
\89»
\82ð
\91±
\82¯
\82é
592 tmReInit->Enabled = false;
598 //---------------------------------------------------------------------------
600 //---------------------------------------------------------------------------
601 void __fastcall TDCHookMainForm::ImageMouseDown(TObject *Sender,
602 TMouseButton Button, TShiftState Shift, int X, int Y)
604 if ( BootUp ) return;
606 SetCapture( Handle );
610 //---------------------------------------------------------------------------
611 void __fastcall TDCHookMainForm::ImageMouseMove(TObject *Sender,
612 TShiftState Shift, int X, int Y)
617 Left = pt.x - CapPoint.x;
618 Top = pt.y - CapPoint.y;
621 //---------------------------------------------------------------------------
622 void __fastcall TDCHookMainForm::ImageMouseUp(TObject *Sender,
623 TMouseButton Button, TShiftState Shift, int X, int Y)
629 //---------------------------------------------------------------------------
631 //---------------------------------------------------------------------------
632 void TDCHookMainForm::InitAMODI()
634 AMODIPath = Ini->ReadString(PFS_CONFIG, PFS_AMODIPATH, AMODIPath.c_str());
637 void TDCHookMainForm::Start()
639 BootTimer->Enabled = false;
641 ShowWindow( Application->Handle, SW_HIDE );
646 RegisterTrayIcon( true );
651 //---------------------------------------------------------------------------
652 bool TDCHookMainForm::Hook()
655 DBW("Already hooked");
656 return true; // already loaded
659 bool use64 = Ini->ReadInteger(PFS_CONFIG, PFS_USE64, DEF_USE64);
660 hDll = new TDCHookLoader(use64);
661 if (!hDll->LoadHook(Handle)){
668 miHook->Enabled = false;
669 miUnhook->Enabled = true;
671 if (hDll->IsReady()){
674 PostMessage(Handle, UM_SHORTCUT, SCINX_NOTIFY64, (LPARAM)hwnd64);
681 void TDCHookMainForm::Unhook()
689 miHook->Enabled = true;
690 miUnhook->Enabled = false;
692 //---------------------------------------------------------------------------
694 // text
\82Ì
\90æ
\93ª
\82ð(0,0)
\82Æ
\82µ
\82½
\8dÀ
\95W
\82Å
\81Apos
\82Ì
\88Ê
\92u
\82É
\82 \82étext
\82Ì
\95¶
\8e\9a\88Ê
\92u
\82ð
\95Ô
\82·
695 int GetTextFromPoint( HDC hdc, const char *text, int pos )
697 int len = lstrlen(text);
703 loc = (right + left)/2;
704 if ( right - left <= 1 ){
707 GetTextExtentPoint32A( hdc, text, loc, &sz );
708 // DBW("%08X %d %d %d %d", hdc, left, right, loc, sz.cx);
715 return (right+left)/2;
717 int GetTextFromPoint( HDC hdc, const wchar_t *text, int pos )
719 int len = lstrlenW(text);
725 loc = (right + left)/2;
726 if ( right - left <= 1 ){
729 GetTextExtentPoint32W( hdc, text, loc, &sz );
730 // DBW("%08X %d %d %d %d", hdc, left, right, loc, sz.cx);
737 return (right+left)/2;
740 void TDCHookMainForm::EvCopyData(TMessage& msg )
742 COPYDATASTRUCT *cds = (COPYDATASTRUCT*)msg.LParam;
743 if ( !cds ){ return; }
744 switch ( cds->dwData ){
746 //DBW("DCH_MOVESEND");
747 // mouse move message
748 EvMoveSend(msg.WParam==0);
751 CursorPoint = *(POINT*)cds->lpData;
753 PaintBox->Canvas->FillRect( PaintBox->Canvas->ClipRect );
761 case DCH_END | DCH_MOVESEND:
763 PopupMoveSend = cds->dwData & DCH_MOVESEND ? true : false;
764 PostMessage( Handle, WM_POPUP, PopupLoc | (PopupMoveSend ? FLG_MOVESEND : 0), (LPARAM)PopupText );
765 if (OCRTextForm) OCRTextForm->SetText(PopupText);
766 PopupText = NULL; // release ownership
769 case DCH_HITTEXT1: // single char
776 //*+++
\93®
\8dì
\96¢
\8am
\94F 2002.12.4
777 PopupText = new tchar[ cds->cbData*2 + 1 ];
778 //
\91O
\94¼
\95\94\95ª
779 PopupLoc = MultiByteToWideChar( CP_ACP, 0,
780 (LPCSTR)cds->lpData, msg.WParam, PopupText, cds->cbData*2 );
781 //
\8cã
\94¼
\95\94\95ª
782 int r = MultiByteToWideChar( CP_ACP, 0,
783 &((char*)cds->lpData)[msg.WParam], cds->cbData-msg.WParam, &PopupText[PopupLoc], cds->cbData-PopupLoc );
784 PopupText[PopupLoc+r] = '\0';
785 #else // !USE_UNICODE
786 PopupText = new tchar[ cds->cbData + 1 ];
787 memcpy( PopupText, cds->lpData, cds->cbData );
788 PopupText[cds->cbData] = '\0';
789 PopupLoc = msg.WParam;
791 Memo->Lines->Add( PopupText );
792 edFound->Text = PopupText + msg.WParam;
793 TestTimer->Enabled = true;
795 char *p = (char*)DCDebug( );
796 memcpy( share, p, COMPSIZE );
802 case DCH_HITTEXT2: // wide char
808 PopupText = new tchar[ cds->cbData + 1 ];
809 memcpy( PopupText, cds->lpData, cds->cbData );
810 PopupText[cds->cbData/sizeof(tchar)] = '\0';
811 PopupLoc = msg.WParam;
812 #else // !USE_UNICODE
814 //*+++
\93®
\8dì
\96¢
\8am
\94F 2002.12.4
815 PopupText = new tchar[ cds->cbData + 1 ];
816 //
\91O
\94¼
\95\94\95ª
818 PopupLoc = WideCharToMultiByte( CP_ACP, 0,
819 (wchar_t*)cds->lpData, msg.WParam,
820 PopupText, cds->cbData, 0, &defchar );
821 //
\8cã
\94¼
\95\94\95ª
822 int r = WideCharToMultiByte( CP_ACP, 0,
823 &((wchar_t*)cds->lpData)[msg.WParam], (cds->cbData>>1)-msg.WParam,
824 &PopupText[PopupLoc], cds->cbData-PopupLoc, 0, &defchar );
825 PopupText[PopupLoc+r] = '\0';
830 case DCH_EXTTEXTOUTA:
831 case DCH_EXTTEXTOUTW:
833 EMREXTTEXTOUTW *emr = (EMREXTTEXTOUTW*)cds->lpData;
834 wchar_t *p = (wchar_t*) ( ((char*)emr) + emr->emrtext.offString );
838 sprintf(b,"exScale=%f eyScale=%f ptlReference=(%d,%d)",emr->exScale, emr->eyScale, emr->emrtext.ptlReference.x, emr->emrtext.ptlReference.y );
841 if ( cds->dwData == DCH_EXTTEXTOUTW ){
842 buf = new char[ emr->emrtext.nChars * 2 ];
843 memset( buf, 0, emr->emrtext.nChars*2 );
844 WideCharToMultiByte( CP_ACP, 0, p, emr->emrtext.nChars, buf, emr->emrtext.nChars * 2, NULL, NULL );
846 const char *text = buf ? buf : (char*)p;
847 Memo->Lines->Add( text );
848 PaintBox->Canvas->TextOut( emr->rclBounds.left, emr->rclBounds.top, text );
850 if ( PtInRect( (RECT*)&emr->rclBounds, CursorPoint ) ){
851 int loc = GetTextFromPoint( (HDC)msg.WParam, text, CursorPoint.x - emr->rclBounds.left );
853 edFound->Text = text + loc;
862 DokoPopMenu( false );
865 PostMessage( Handle, WM_TOGGLE, 0, 0 );
867 case WMCD_EXISTCHECK: // exist check
868 if ( cds->cbData != strlen(APPNAME)+1 ){
872 msg.Result = (memcmp( cds->lpData, APPNAME, strlen(APPNAME)+1 ) == 0);
874 case DCH_LAUNCH_AMODI:
876 //Reboot(); // AMODI.exe
\8dÄ
\8bN
\93®
\82Å
\82Í
\89ð
\8c\88\82Å
\82«
\82È
\82¢
\82½
\82ß
881 //---------------------------------------------------------------------------
882 bool WaitTransaction( TDdeClientConv *dde )
885 for ( int i=0;i<100000;i++ ){
886 Application->ProcessMessages();
887 if ( !dde->WaitStat ){
888 // DBW("DCHook:Wait OK");
892 DBW("DCHook:Wait failure");
898 // ANSI
\82Å
\93n
\82·
\8fê
\8d\87
899 bool DdePoke( TDdeClientConv *dde, AnsiString Item, AnsiString Data )
902 int ansilen = Data.Length();
903 wchar_t *buf = new wchar_t[ansilen*2+1];
904 int len = MultiByteToWideChar( CP_ACP, 0,
905 (LPCSTR)Data.c_str(), ansilen, buf, ansilen*2 );
907 bool r = DdePoke( dde, Item, (wchar_t*)buf );
910 #else // !USE_UNICODE
911 HSZ hszItem = DdeCreateStringHandle(ddeMgr->DdeInstId, Item.c_str(), CP_WINANSI );
912 if ( !hszItem ) return false;
913 HDDEDATA hszDat = DdeCreateDataHandle( ddeMgr->DdeInstId, Data.c_str(), Data.Length() + 1,
914 0, hszItem, dde->DdeFmt, 0);
917 HDDEDATA hdata = DdeClientTransaction( (LPBYTE)hszDat, (DWORD)-1, (HCONV)dde->Conv, hszItem,
918 dde->DdeFmt, XTYP_POKE, 10000, NULL);
919 if (hdata || DdeGetLastError(ddeMgr->DdeInstId) != DMLERR_NO_ERROR){
922 DdeFreeDataHandle( hdata );
925 DdeFreeStringHandle(ddeMgr->DdeInstId, hszItem);
930 // Unicode
\82Å
\93n
\82·
\8fê
\8d\87
931 bool DdePoke( TDdeClientConv *dde, AnsiString Item, const wchar_t *Data )
933 // Item
\96¼
\82ÍANSI
\81A
\83f
\81[
\83^
\82ÍUNICODE //
934 int ddeFmt = /*dde->DdeFmt*/CF_UNICODETEXT;
935 HSZ hszItem = DdeCreateStringHandle(ddeMgr->DdeInstId, Item.c_str(), CP_WINANSI );
936 if ( !hszItem ) return false;
937 HDDEDATA hszDat = DdeCreateDataHandle( ddeMgr->DdeInstId, (LPBYTE)Data, (_tcslen(Data)+1)*sizeof(wchar_t),
938 0, hszItem, ddeFmt, 0);
941 HDDEDATA hdata = DdeClientTransaction( (LPBYTE)hszDat, (DWORD)-1, (HCONV)dde->Conv, hszItem,
942 ddeFmt, XTYP_POKE, 10000, NULL);
943 if (hdata || DdeGetLastError(ddeMgr->DdeInstId) != DMLERR_NO_ERROR){
946 DdeFreeDataHandle( hdata );
949 DdeFreeStringHandle(ddeMgr->DdeInstId, hszItem);
952 bool DdeRequest( TDdeClientConv *dde, AnsiString Item, char *Data, int &ioDataLen )
954 const int ddeFmt = /*dde->DdeFmt*/CF_UNICODETEXT;
955 HSZ hszItem = DdeCreateStringHandle(ddeMgr->DdeInstId, Item.c_str(), CP_WINANSI );
956 if ( !hszItem ) return false;
958 HDDEDATA hdata = DdeClientTransaction( NULL, 0, (HCONV)dde->Conv, hszItem, ddeFmt, XTYP_REQUEST, 10000, NULL);
959 if (hdata || DdeGetLastError(ddeMgr->DdeInstId) != DMLERR_NO_ERROR){
962 ioDataLen = DdeGetData(hdata, (LPBYTE)Data, ioDataLen, 0);
963 DdeFreeDataHandle( hdata );
969 DdeFreeStringHandle(ddeMgr->DdeInstId, hszItem);
973 TDdeClientConv *TDCHookMainForm::OpenPdic( const char *topic )
975 TDdeClientConv *PdicDde = new TDdeClientConv( this );
977 PdicDde->ConnectMode = ddeManual;
978 static int entry = 0;
979 PdicDde->Name = AnsiString("PdicDde") + (++entry);
980 PdicDde->ServiceApplication = DDE_SERVICE_NAME;
981 if ( !PdicDde->SetLink( DDE_SERVICE_NAME, topic ) ){
982 DBW("DCHook:Cannot SetLink");
986 if ( !PdicDde->OpenLink( ) ){ //
\82±
\82±
\82ª
\92x
\82¢
\81I
\81I
989 for(int i=0;i<OPEN_RETRY;i++){
990 if ( PdicDde->OpenLink() ){
993 Sleep(OPEN_WAITTIME);
996 DBW("PDIC
\82ª
\8c©
\82Â
\82©
\82è
\82Ü
\82¹
\82ñ(OpenPdic)");
997 Application->MessageBox( "PDIC
\82ª
\8c©
\82Â
\82©
\82è
\82Ü
\82¹
\82ñ(OpenPdic)", APPNAME, MB_OK );
1004 static const TCHAR *clsname = TEXT("TPdicMain.UnicodeClass");
1006 static const TCHAR *clsname = TEXT(DDE_SERVICE_NAME);
1008 static const TCHAR *winname = NULL;
1009 HWND TDCHookMainForm::FindPdic( )
1011 HWND hWin = FindWindow( clsname, winname );
1014 if ( LaunchPdic() ){
1015 hWin = FindWindow( clsname, winname );
1017 DBW("PDIC
\82ª
\8c©
\82Â
\82©
\82è
\82Ü
\82¹
\82ñ(FindPdic)");
1018 Application->MessageBox( "PDIC
\82ª
\8c©
\82Â
\82©
\82è
\82Ü
\82¹
\82ñ(FindPdic)", APPNAME, MB_OK );
1026 LRESULT TDCHookMainForm::SendCopyData( HWND hwnd, int message, const char *str )
1029 cds.dwData = message;
1030 cds.lpData = (LPSTR)str;
1031 cds.cbData = lstrlen(str)+1;
1032 SendMessage( hwnd, WM_COPYDATA, (WPARAM)Handle, (LPARAM)&cds );
1035 void TDCHookMainForm::ClosePdic( TDdeClientConv *dde )
1040 // XX.XX.XXXX (hex) 1+1+2 byte
\8d\
\90¬
1041 int TDCHookMainForm::GetPdicVersion()
1043 TDdeClientConv *PdicDde = OpenPdic("PDIC");
1044 if (!PdicDde) return 0;
1048 if (DdeRequest(PdicDde, "GetVersion", buf, sizeof(buf))){
1049 wchar_t *str = (wchar_t*)buf;
1050 version = _wtoi( str ) << 24;
1051 const wchar_t *p = wcschr( str, '.' );
1053 version |= _wtoi( p+1 ) << 16;
1054 p = wcschr( p+1, '.' );
1056 version |= _wtoi( p+1 );
1059 //DBW("version: %X", version);
1062 ClosePdic( PdicDde );
1065 // click_pos: mouse click
\82³
\82ê
\82½text
\8fã
\82Ì
\95¶
\8e\9a\88Ê
\92u(text
\90æ
\93ª
\82©
\82ç
\82Ìoffset)
1066 bool TDCHookMainForm::DoPopup( const tchar *text, int click_pos, const tchar *prevtext, bool movesend )
1072 DBW("Reentrant!!!!!");
1075 HWND hwnd = FindPopupWindow( );
1077 HWND hwndParent = GetParent( hwnd );
1079 DBW("Parent exist!!!!");
1082 DBW("Retry again:%d:%08X",ct,hwnd);
1083 //
\95K
\82¸PostMessage()
\82Åclose
\82·
\82é
\82±
\82Æ
\81B
1084 // CloseWindow()
\82Å
\82ÍPopup Winodow
\82Ì
\8f\89\8aú
\89»
\92\86\82É
1085 // close
\8f\88\97\9d\82ð
\8eÀ
\8ds
\82µ
\82Ä
\82µ
\82Ü
\82¢
\81A
1086 // popup window
\82ª
\82¨
\82©
\82µ
\82È
\8fó
\91Ô
\82É
\82Í
\82¢
\82Á
\82Ä
\82µ
\82Ü
\82¤
\8fê
\8d\87\82ª
\82 \82é
1087 PostMessage( hwnd, WM_CLOSE, 0, 0 );
1091 DBW("Not found popup window");
1092 if (DoPopupRetry++ > 10){
1094 return true; // abort
1096 return false; // retry
1105 // Windows9x
\82Å
\82Í
\81ADDE transaction
\82ª
\92x
\82¢
\82Æ
\82«
\82ª
\82 \82é
1106 // why? - because of 24bit OS:-)
1107 // ->
\82Æ
\8ev
\82Á
\82Ä
\81AWM_COPYDATA version
\82ð
\8dì
\82Á
\82Ä
\82¢
\82½
\82ç
\91¬
\82
\82È
\82Á
\82½
\81H
\81H
\81H
1108 // ->WM_COPYDATA
\89» project
\82Í
\92\86\92f
1109 TDdeClientConv *PdicDde;
1113 // incremental search
1114 PdicDde = OpenPdic("Simulate");
1119 r = DdePoke(PdicDde, "InputWord3", text);
1121 DBW("PDIC DDE : InputWord3 failure");
1129 PdicDde = OpenPdic( "Simulate" );
1131 DdePoke( PdicDde, "Open", GroupName );
1132 PdicDde->CloseLink();
1136 PdicDde = OpenPdic( "Dictionary" );
1142 r = DdePoke( PdicDde, "Open", "" );
1144 DBW("PDIC DDE : Open failure");
1145 PdicDde->CloseLink();
1152 Application->MessageBox(
1153 "
\8e«
\8f\91\83O
\83\8b\81[
\83v
\82ª
\8aJ
\82¯
\82Ü
\82¹
\82ñ\r"
1154 "DokoPop!
\82Å
\81u
\8e«
\8f\91\83O
\83\8b\81[
\83v
\8ew
\92è
\81v
\82ð
\97L
\8cø
\82É
\82µ
\82Ä
\82¢
\82é
\8fê
\8d\87\82Í
\81A
\82·
\82Å
\82ÉPDIC
\96{
\91Ì
\82Å
\83I
\81[
\83v
\83\93\82³
\82ê
\82Ä
\82¢
\82é
\8e«
\8f\91\82Æ
\8b¤
\97L
\88á
\94½
\82ð
\8bN
\82±
\82µ
\82Ä
\82¢
\82é
\89Â
\94\
\90«
\82ª
\82 \82è
\82Ü
\82·\r"
1155 "DokoPop!
\82ÆPDIC
\96{
\91Ì
\82Å
\8eg
\97p
\82µ
\82Ä
\82¢
\82é
\8e«
\8f\91\82É
\93¯
\88ê
\82Ì
\82à
\82Ì
\82ª
\82È
\82¢
\82©
\92²
\82×
\82Ä
\82
\82¾
\82³
\82¢\r"
1156 "
\82à
\82µ
\82 \82Á
\82½
\8fê
\8d\87\82Í
\93o
\98^
\8bÖ
\8e~
\82È
\82Ç
\8b¤
\97L
\82Å
\82«
\82é
\82æ
\82¤
\82È
\8fó
\91Ô
\82É
\82µ
\82Ä
\82
\82¾
\82³
\82¢\r"
1157 "
\82±
\82Ì
\83\81\83b
\83Z
\81[
\83W
\82Ì
\88Ó
\96¡
\82ª
\82í
\82©
\82ç
\82È
\82¢
\8fê
\8d\87\82Í
\81A
\81u
\8e«
\8f\91\83O
\83\8b\81[
\83v
\8ew
\92è
\81v
\8b@
\94\
\82ð
\8eg
\82í
\82È
\82¢
\82Ù
\82¤
\82ª
\88À
\91S
\82Å
\82·"
1161 SetForegroundWindow( Handle );
1168 DdePoke( PdicDde, "PopupSearchConfig", "c1" ); // Ctrl close
1170 DdePoke( PdicDde, "PopupSearchConfig", "o1w1" ); // overlap window and no wait transaction
1171 if ( prevtext && (prevtext != text) ){
1172 //DBW("prevtext="FMTS,prevtext);
1174 int len = _tcslen(prevtext);
1175 tchar *buf = new tchar[len+10];
1176 _itow( STR_DIFF(text, prevtext) + click_pos, buf, 10 ); //
\83N
\83\8a\83b
\83N
\88Ê
\92u
1177 tchar *dp = buf + _tcslen(buf);
1179 wcscpy( dp, prevtext );
1180 DdePoke( PdicDde, "PopupSearch3", buf );
1181 // ExecuteMacro( "PopupSearch3", true );
1184 DdePoke( PdicDde, "PopupSearch2", (tchar*)prevtext );
1185 // ExecuteMacro( "PopupSearch2", true );
1187 WaitTransaction( PdicDde );
1189 //DBW("text="FMTS,text);
1190 DdePoke( PdicDde, "PopupSearch", (tchar*)text );
1191 // PdicDde->ExecuteMacro( "PopupSearch", true );
1192 WaitTransaction( PdicDde );
1194 DdePoke( PdicDde, "Close", "" );
1196 ClosePdic( PdicDde );
1198 // WM_COPYDATA
\82É
\82æ
\82é
\95û
\96@(
\82Ü
\82¾document
\89»
\82³
\82ê
\82Ä
\82¢
\82È
\82¢
\95û
\96@(Ver.4.30)
1199 // PDIC/W32 Ver.4.22
\81`
\82É
\91Î
\89\9e
1200 //
\82½
\82¾
\82µ
\81AVer.4.29
\82Ü
\82Å
\82Í
\81AWMCD_POPUPSEARCH
\82ÆWMCD_POPUPSEARCH2
\82Í
\93¯
\82¶
1202 // WM_COPYDATA code //
1203 //
\88È
\89º
\82Ì
\90\94\92l
\82Í
\8f«
\97\88\95Ï
\82í
\82é
\89Â
\94\
\90«
\82ª
\82 \82é(undocumented) //
1204 #define WMCD_GETVERSION 0x0001
1205 #define WMCD_CHECKOPEN 0x0010
1206 #define WMCD_AUTOSEARCH 0x0020
1207 #define WMCD_AUTOSEARCHMODE 0x0021
1209 #define WMCD_ISOPENED 0x0080
1210 #define WMCD_CLOSE 0x0081
1212 #define WMCD_POPUPSEARCH 0x0100
1213 #define WMCD_POPUPSEARCH2 0x0101
1214 #define WMCD_POPUPSEARCHPOINT 0x0102
1215 #define WMCD_POPUPSEARCHCONFIG 0x0103
1216 #define WMCD_POPUPSEARCHDIALOG 0x0104
1217 #define WMCD_POPUPSEARCHWINDOW 0x0105
1219 #define WMCD_SPELLCHECK 0x0110
1221 HWND hwnd = FindPdic();
1229 SendCopyData( hwnd, WMCD_POPUPSEARCHCONFIG, "c1" );
1231 GetCursorPos( &pt );
1233 wsprintf( buf, "%d,%d", pt.x, pt.y );
1234 SendCopyData( hwnd, WMCD_POPUPSEARCHPOINT, buf );
1235 if ( prevtext && (prevtext != text) ){
1236 DBW("prevtext=%s",prevtext);
1237 SendCopyData( hwnd, WMCD_POPUPSEARCH2, prevtext );
1239 DBW("text=%s",text);
1240 SendCopyData( hwnd, WMCD_POPUPSEARCH, text );
1242 SendCopyData( hwnd, WMCD_CLOSE, "" );
1245 DBW("DCHook:Exit Popup:%d",ct);
1249 miUnhookClick( this );
1250 miHookClick( this );
1255 //---------------------------------------------------------------------------
1257 // WParam : text location & FLG_MOVESEND
1258 // LParam : text pointer (must be freed when done)
1259 void TDCHookMainForm::EvPopup(TMessage &msg)
1265 int pdicVer = GetPdicVersion();
1266 const int numPrev = pdicVer >= 0x050A0018 ? 2 : 1; // ver.5.10.24
\88È
\8fã
1268 tchar *text = (tchar*)msg.LParam;
1269 int loc = msg.WParam & ~FLG_MOVESEND;
1270 bool movesend = msg.WParam & FLG_MOVESEND ? true : false;
1274 if ( !GetWord( text, loc, start, end, prevstart, true, 10, true, IgnoreJ, numPrev ) ){
1280 edWord->Text = text + start;
1281 edPrev->Text = loc + prevstart;
1284 if (DoPopup( text + start, loc - start, text + prevstart, movesend )){
1290 delete[] PopupText; //
\82 \82Æ
\82É
\97\88\82½
\82Ù
\82¤
\82ð
\97D
\90æ
\82·
\82é
1293 PopupMoveSend = movesend;
1294 tmPopup->Enabled = true; // start timer for delayed popup
1296 //DBW("EvPopup - end");
1298 void TDCHookMainForm::EvMoveSend(TMessage &msg)
1300 EvMoveSend(msg.WParam==0);
1302 void TDCHookMainForm::EvMoveSend(bool enable)
1304 tmMouseMove->Enabled = false;
1306 tmMouseMove->Enabled = true;
1309 void TDCHookMainForm::RegisterTrayIcon( bool flag )
1311 NOTIFYICONDATA m_tnid; //
\82±
\82ê
\82Í*.h
\82Å
\92è
\8b`
\82µ
\82Ä
\82¨
\82
1313 m_tnid.cbSize = sizeof(NOTIFYICONDATA);
1314 m_tnid.hWnd = Handle;
1316 m_tnid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
1317 m_tnid.uCallbackMessage = WM_NOTIFYICON;
1318 // Get small icon from me
1321 ExtractIconEx( Application->ExeName.c_str(), -2, &hIcon, &hIconSm, 1 );
1322 m_tnid.hIcon = hIconSm;
1323 lstrcpy(m_tnid.szTip, APPNAME );
1324 Shell_NotifyIcon( flag ? NIM_ADD : NIM_DELETE, &m_tnid);
1326 void TDCHookMainForm::EvNotifyIcon(TMessage &msg)
1328 //UINT uID = (UINT) msg.WParam;
1329 UINT uMouseMsg = (UINT) msg.LParam;
1330 if (uMouseMsg == WM_LBUTTONDBLCLK)
1332 miOptionClick( this );
1334 else if (uMouseMsg == WM_RBUTTONDOWN)
1336 DokoPopMenu( true );
1339 //---------------------------------------------------------------------------
1340 void TDCHookMainForm::SaveConfig()
1342 Ini->WriteInteger( PFS_CONFIG, PFS_GROUPOPEN, GroupOpen );
1343 Ini->WriteString( PFS_CONFIG, PFS_GROUPNAME, GroupName.c_str() );
1344 Ini->WriteInteger( PFS_CONFIG, PFS_CTRLCLOSE, CtrlClose );
1345 Ini->WriteInteger( PFS_CONFIG, PFS_IGNOREJ, IgnoreJ );
1346 Ini->WriteInteger( PFS_CONFIG, PFS_BANNER, Banner );
1348 void TDCHookMainForm::OpenDicGroup( const char *name )
1350 TDdeClientConv *dde = OpenPdic( PFS_PDIC );
1353 //
\8e«
\8f\91\83O
\83\8b\81[
\83v
\83I
\81[
\83v
\83\93\8f\88\97\9d //
1354 if ( name[0] == '&' )
1356 DdePoke(dde, "OpenGroup", (tchar*)mustr(name));
1359 //---------------------------------------------------------------------------
1360 // DokoPop
\82Ì
\90Ý
\92è
1361 void TDCHookMainForm::SetupConfig()
1363 EnableClickOnly( miClickOnly->Checked );
1365 hDll->Config( -1, KA_POPUP,
1366 Ini->ReadInteger( PFS_CONFIG, PFS_POPUPKEY, DEF_POPUPKEY ) );
1367 hDll->Config( -1, KA_TOGGLE,
1368 Ini->ReadInteger( PFS_CONFIG, PFS_TOGGLEKEY, DEF_TOGGLEKEY ) );
1374 void TDCHookMainForm::SetupConfig2()
1380 memset(&cfg, 0, sizeof(cfg));
1381 cfg.UseAMODI = AMODIAvail && (CaptureMode & CM_IMAGE);
1382 cfg.OnlyAMODI = AMODIAvail && !(CaptureMode & CM_TEXT);
1383 cfg.MoveSend = MouseIncSrch;
1384 //cfg.OnlyImage = 1; //TODO:
1385 if (AMODIPath.data()){
1386 strncpy(cfg.AMODIPath, AMODIPath.c_str(), sizeof(cfg.AMODIPath)-1);
1389 int dpiDetect = Ini->ReadInteger(PFS_CONFIG, PFS_DPI_DETECT, 1);
1392 cfg.ScaleX = GetMonitorScale();
1395 cfg.ScaleX = Ini->ReadInteger(PFS_CONFIG, PFS_SCALE, 0);
1397 cfg.ScaleY = cfg.ScaleX;
1398 hDll->Config2(&cfg);
1400 void TDCHookMainForm::SetupAMODI()
1402 if (AMODIPath.data()){
1405 HWND hwnd = FindAMODI();
1409 AMODIAvail = LaunchAMODI();
1411 HWND hwnd = FindAMODI();
1415 tmReInit->Enabled = true; // retry later
1420 tmMODIInstallCheck->Enabled = false;
1423 void TDCHookMainForm::EnableClickOnly( bool enable )
1426 hDll->Config( enable, 0, 0 );
1428 void TDCHookMainForm::DokoPopMenu( bool all )
1431 SetForegroundWindow( Handle );
1433 GetCursorPos( &pt );
1434 miEnablePopup->Visible = all;
1435 miReload->Visible = !all;
1436 miClose->Visible = !all;
1437 miExit2->Visible = all;
1438 pmTrayIcon->TrackButton = tbRightButton;
1439 pmTrayIcon->Popup( pt.x, pt.y );
1440 MoveToTop( Handle );
1441 // MoveToTop( pmTrayIcon->WindowHandle );
1443 void TDCHookMainForm::MenuClosed()
1446 ShowWindow( Application->Handle, SW_HIDE );
1447 tmMenuClose->Enabled = true;
1449 void TDCHookMainForm::EvToggle( TMessage &msg )
1451 miClickOnlyClick( this );
1454 void TDCHookMainForm::EvShortcut( TMessage &msg )
1456 switch (msg.WParam){
1457 case SCINX_NOTIFY64:
1458 DBW("SCINX_NOTIFY64:%08X %08X", msg.LParam, hDll);
1460 hDll->Notify64(msg.LParam);
1466 void TDCHookMainForm::EvGetVersion( TMessage &msg )
1468 msg.Result = VersionValue;
1470 //---------------------------------------------------------------------------
1471 //
\89E
\83N
\83\8a\83b
\83N
\8c\9f\8dõON/OFF
\95\
\8e¦
1472 void TDCHookMainForm::ShowNotify()
1475 GetCursorPos( &pt );
1477 NotifyForm = new TNotifyForm( this );
1479 NotifyForm->Visible = false;
1481 NotifyForm->enable = miClickOnly->Checked;
1482 NotifyForm->Left = pt.x + 8;
1483 NotifyForm->Top = pt.y + 8;
1484 NotifyForm->Setup();
1486 SetWindowPos( Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE );
1487 SetWindowPos( NotifyForm->Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE );
1488 tmNotify->Enabled = false;
1489 tmNotify->Enabled = true;
1491 void TDCHookMainForm::NotifyAMODI()
1493 MODINotifyDialog = new TMODINotifyDialog(this);
1494 MODINotifyDialog->ShowModal();
1495 if (MODINotifyDialog->LinkClicked || AMODIRunable()){
1496 tmMODIInstallCheck->Enabled = true;
1498 delete MODINotifyDialog;
1500 void TDCHookMainForm::Reboot()
1505 void GetGroupList(TMyIni &ini, TStringList &list)
1507 AnsiString s = ini.ReadString("Group", "::GroupNames::", "");
1509 // for old version (not work correctly)
1510 ini.ReadValues( "Group", &list);
1512 const TCHAR *p = _tcstok(s.c_str(), _T("\t"));
1515 p = _tcstok(NULL, _T("\t"));