OSDN Git Service

first commit
authortnishi <sgm00353@nifty.ne.jp>
Thu, 27 Oct 2016 14:00:32 +0000 (23:00 +0900)
committertnishi <sgm00353@nifty.ne.jp>
Thu, 27 Oct 2016 14:00:32 +0000 (23:00 +0900)
144 files changed:
DCHook/DCHook.6.0.sln [new file with mode: 0644]
DCHook/DCHook.7.1.vcproj [new file with mode: 0644]
DCHook/DCHook.cpp [new file with mode: 0644]
DCHook/DCHook.def [new file with mode: 0644]
DCHook/DCHook.h [new file with mode: 0644]
DCHook/DCHook.mak [new file with mode: 0644]
DCHook/DCHook.sln [new file with mode: 0644]
DCHook/DCHook.vcproj [new file with mode: 0644]
DCHook/DCHook.vcxproj [new file with mode: 0644]
DCHook/DCHook.vcxproj.filters [new file with mode: 0644]
DCHook/MonitorScale.cpp [new file with mode: 0644]
DCHook/MonitorScale.h [new file with mode: 0644]
DCHook/VS2003/DCHook.sln [new file with mode: 0644]
DCHook/VS2003/DCHook.vcproj [new file with mode: 0644]
DCHook/VS2008/DCHook.sln [new file with mode: 0644]
DCHook/VS2008/DCHook.vcproj [new file with mode: 0644]
DCHook/VS2015/DCHook.sln [new file with mode: 0644]
DCHook/VS2015/DCHook.vcxproj [new file with mode: 0644]
DCHook/VS2015/DCHook.vcxproj.filters [new file with mode: 0644]
DCHook/dchook.rc [new file with mode: 0644]
DCHook64/DCHook64.h [new file with mode: 0644]
DCHook64/dchk64/ReadMe.txt [new file with mode: 0644]
DCHook64/dchk64/Resource.h [new file with mode: 0644]
DCHook64/dchk64/dchk64.cpp [new file with mode: 0644]
DCHook64/dchk64/dchk64.h [new file with mode: 0644]
DCHook64/dchk64/dchk64.ico [new file with mode: 0644]
DCHook64/dchk64/dchk64.rc [new file with mode: 0644]
DCHook64/dchk64/dchk64.sln [new file with mode: 0644]
DCHook64/dchk64/dchk64.suo [new file with mode: 0644]
DCHook64/dchk64/dchk64.vcxproj [new file with mode: 0644]
DCHook64/dchk64/dchk64.vcxproj.filters [new file with mode: 0644]
DCHook64/dchk64/small.ico [new file with mode: 0644]
DCHook64/dchk64/stdafx.cpp [new file with mode: 0644]
DCHook64/dchk64/stdafx.h [new file with mode: 0644]
DCHook64/dchk64/targetver.h [new file with mode: 0644]
DCHookTest/DCHookLoader.cpp [new file with mode: 0644]
DCHookTest/DCHookLoader.h [new file with mode: 0644]
DCHookTest/DCHookMain.cpp [new file with mode: 0644]
DCHookTest/DCHookMain.dfm [new file with mode: 0644]
DCHookTest/DCHookMain.h [new file with mode: 0644]
DCHookTest/DCHookTest.bpr [new file with mode: 0644]
DCHookTest/DCHookTest.cpp [new file with mode: 0644]
DCHookTest/DCHookTest.dfm [new file with mode: 0644]
DCHookTest/DCHookTest.h [new file with mode: 0644]
DCHookTest/DCHookTest.mak [new file with mode: 0644]
DCHookTest/DCHookTest.rc [new file with mode: 0644]
DCHookTest/DCHookTest.res [new file with mode: 0644]
DCHookTest/DKPU.txt [new file with mode: 0644]
DCHookTest/HookDLl.cpp [new file with mode: 0644]
DCHookTest/HookDLl.h [new file with mode: 0644]
DCHookTest/HookLoader.cpp [new file with mode: 0644]
DCHookTest/HookLoader.h [new file with mode: 0644]
DCHookTest/MODINotifyDlg.cpp [new file with mode: 0644]
DCHookTest/MODINotifyDlg.dfm [new file with mode: 0644]
DCHookTest/MODINotifyDlg.h [new file with mode: 0644]
DCHookTest/Notify.cpp [new file with mode: 0644]
DCHookTest/Notify.dfm [new file with mode: 0644]
DCHookTest/Notify.h [new file with mode: 0644]
DCHookTest/OCRTextFrm.cpp [new file with mode: 0644]
DCHookTest/OCRTextFrm.dfm [new file with mode: 0644]
DCHookTest/OCRTextFrm.h [new file with mode: 0644]
DCHookTest/PopupConfig.cpp [new file with mode: 0644]
DCHookTest/PopupConfig.dfm [new file with mode: 0644]
DCHookTest/PopupConfig.h [new file with mode: 0644]
DCHookTest/StringLib.cpp [new file with mode: 0644]
DCHookTest/StringLib.h [new file with mode: 0644]
DCHookTest/Util.cpp [new file with mode: 0644]
DCHookTest/Util.h [new file with mode: 0644]
DCHookTest/cpd.bat [new file with mode: 0644]
DCHookTest/dkpp.bmp [new file with mode: 0644]
DCHookTest/dkpp.ico [new file with mode: 0644]
DCHookTest/dkpp0.ico [new file with mode: 0644]
DCHookTest/dkpp2.bmp [new file with mode: 0644]
DCHookTest/dkpp3.bmp [new file with mode: 0644]
DCHookTest/dkpp4.bmp [new file with mode: 0644]
DCHookTest/dkpps.ico [new file with mode: 0644]
DCHookTest/dkpps0.ico [new file with mode: 0644]
DCHookTest/icon.rc [new file with mode: 0644]
DCHookTest/icon.res [new file with mode: 0644]
DCHookTest/mustr.cpp [new file with mode: 0644]
DCHookTest/mustr.h [new file with mode: 0644]
DCHookTest/obj/icon.res [new file with mode: 0644]
DCHookTest/popdisable.bmp [new file with mode: 0644]
DCHookTest/popdisable.h [new file with mode: 0644]
DCHookTest/popenable.bmp [new file with mode: 0644]
DCHookTest/popenable.h [new file with mode: 0644]
DCHookTest/prgconfig.cpp [new file with mode: 0644]
DCHookTest/prgconfig.h [new file with mode: 0644]
DCHookTest/prgprof.cpp [new file with mode: 0644]
DCHookTest/prgprof.h [new file with mode: 0644]
DCHookTest/stdafx.h [new file with mode: 0644]
DKPP.TXT [new file with mode: 0644]
DKPPu.TXT [new file with mode: 0644]
DKPU.TXT [new file with mode: 0644]
DKPUu.TXT [new file with mode: 0644]
Diary.txt [new file with mode: 0644]
ExMODIst/ExMODIst.bpf [new file with mode: 0644]
ExMODIst/ExMODIst.bpr [new file with mode: 0644]
ExMODIst/ExMODIst.cpp [new file with mode: 0644]
ExMODIst/ExMODIst.h [new file with mode: 0644]
ExMODIst/ExMODIst.rc [new file with mode: 0644]
ExMODIst/ExMODIst.sln [new file with mode: 0644]
ExMODIst/ExMODIst.vcproj [new file with mode: 0644]
ExMODIst/ExMODIst.vcxproj [new file with mode: 0644]
ExMODIst/ExMODIst.vcxproj.filters [new file with mode: 0644]
ExMODIst/ReadMe.txt [new file with mode: 0644]
ExMODIst/Resource.h [new file with mode: 0644]
ExMODIst/main.cpp [new file with mode: 0644]
ExMODIst/stdafx.cpp [new file with mode: 0644]
ExMODIst/stdafx.h [new file with mode: 0644]
ExMODIst/targetver.h [new file with mode: 0644]
ExMODIstBCC/ExMODIst.bpf [new file with mode: 0644]
ExMODIstBCC/ExMODIst.bpr [new file with mode: 0644]
ExMODIstBCC/main.cpp [new file with mode: 0644]
MK.BAT [new file with mode: 0644]
MKU.BAT [new file with mode: 0644]
Makefile [new file with mode: 0644]
README.TXT [new file with mode: 0644]
VxD/hk95c.c [new file with mode: 0644]
VxD/hk95d.asm [new file with mode: 0644]
VxD/hk95d.def [new file with mode: 0644]
VxD/hk95d.h [new file with mode: 0644]
VxD/makefile [new file with mode: 0644]
amodi/amodi.sln [new file with mode: 0644]
amodi/amodi/MainForm.Designer.cs [new file with mode: 0644]
amodi/amodi/MainForm.cs [new file with mode: 0644]
amodi/amodi/MainForm.resx [new file with mode: 0644]
amodi/amodi/Program.cs [new file with mode: 0644]
amodi/amodi/Properties/AssemblyInfo.cs [new file with mode: 0644]
amodi/amodi/Properties/Resources.Designer.cs [new file with mode: 0644]
amodi/amodi/Properties/Resources.resx [new file with mode: 0644]
amodi/amodi/Properties/Settings.Designer.cs [new file with mode: 0644]
amodi/amodi/Properties/Settings.settings [new file with mode: 0644]
amodi/amodi/amodi.csproj [new file with mode: 0644]
amodi/amodi/app.config [new file with mode: 0644]
amodi/readme.txt [new file with mode: 0644]
change_iss.pl [new file with mode: 0644]
cpr.bat [new file with mode: 0644]
dchook.ind [new file with mode: 0644]
dchook.tpl [new file with mode: 0644]
dchooku.ind [new file with mode: 0644]
dchooku.tpl [new file with mode: 0644]
mktpl.bat [new file with mode: 0644]
mktplu.bat [new file with mode: 0644]

diff --git a/DCHook/DCHook.6.0.sln b/DCHook/DCHook.6.0.sln
new file mode 100644 (file)
index 0000000..22d6daf
--- /dev/null
@@ -0,0 +1,25 @@
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual Studio 2008
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DCHook", "DCHook.vcproj", "{8C65CE15-64F8-43E6-968D-DBBB96858BB2}"
+EndProject
+Global
+       GlobalSection(SolutionConfigurationPlatforms) = preSolution
+               Debug|Win32 = Debug|Win32
+               Debug|x64 = Debug|x64
+               Release|Win32 = Release|Win32
+               Release|x64 = Release|x64
+       EndGlobalSection
+       GlobalSection(ProjectConfigurationPlatforms) = postSolution
+               {8C65CE15-64F8-43E6-968D-DBBB96858BB2}.Debug|Win32.ActiveCfg = Debug|Win32
+               {8C65CE15-64F8-43E6-968D-DBBB96858BB2}.Debug|Win32.Build.0 = Debug|Win32
+               {8C65CE15-64F8-43E6-968D-DBBB96858BB2}.Debug|x64.ActiveCfg = Debug|x64
+               {8C65CE15-64F8-43E6-968D-DBBB96858BB2}.Debug|x64.Build.0 = Debug|x64
+               {8C65CE15-64F8-43E6-968D-DBBB96858BB2}.Release|Win32.ActiveCfg = Release|Win32
+               {8C65CE15-64F8-43E6-968D-DBBB96858BB2}.Release|Win32.Build.0 = Release|Win32
+               {8C65CE15-64F8-43E6-968D-DBBB96858BB2}.Release|x64.ActiveCfg = Release|x64
+               {8C65CE15-64F8-43E6-968D-DBBB96858BB2}.Release|x64.Build.0 = Release|x64
+       EndGlobalSection
+       GlobalSection(SolutionProperties) = preSolution
+               HideSolutionNode = FALSE
+       EndGlobalSection
+EndGlobal
diff --git a/DCHook/DCHook.7.1.vcproj b/DCHook/DCHook.7.1.vcproj
new file mode 100644 (file)
index 0000000..c6c4c8c
--- /dev/null
@@ -0,0 +1,142 @@
+<?xml version="1.0" encoding="shift_jis"?>
+<VisualStudioProject
+       ProjectType="Visual C++"
+       Version="7.10"
+       Name="DCHook"
+       ProjectGUID="{8C65CE15-64F8-43E6-968D-DBBB96858BB2}"
+       Keyword="Win32Proj">
+       <Platforms>
+               <Platform
+                       Name="Win32"/>
+       </Platforms>
+       <Configurations>
+               <Configuration
+                       Name="Debug|Win32"
+                       OutputDirectory="Debug"
+                       IntermediateDirectory="Debug"
+                       ConfigurationType="2"
+                       CharacterSet="2">
+                       <Tool
+                               Name="VCCLCompilerTool"
+                               Optimization="0"
+                               PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;DCHOOK_EXPORTS"
+                               MinimalRebuild="TRUE"
+                               BasicRuntimeChecks="3"
+                               RuntimeLibrary="1"
+                               UsePrecompiledHeader="2"
+                               WarningLevel="3"
+                               Detect64BitPortabilityProblems="FALSE"
+                               DebugInformationFormat="4"/>
+                       <Tool
+                               Name="VCCustomBuildTool"/>
+                       <Tool
+                               Name="VCLinkerTool"
+                               OutputFile="$(OutDir)/DCHook.dll"
+                               LinkIncremental="2"
+                               ModuleDefinitionFile="DCHook.def"
+                               GenerateDebugInformation="TRUE"
+                               ProgramDatabaseFile="$(OutDir)/DCHook.pdb"
+                               SubSystem="2"
+                               ImportLibrary="$(OutDir)/DCHook.lib"
+                               TargetMachine="1"/>
+                       <Tool
+                               Name="VCMIDLTool"/>
+                       <Tool
+                               Name="VCPostBuildEventTool"/>
+                       <Tool
+                               Name="VCPreBuildEventTool"/>
+                       <Tool
+                               Name="VCPreLinkEventTool"/>
+                       <Tool
+                               Name="VCResourceCompilerTool"/>
+                       <Tool
+                               Name="VCWebServiceProxyGeneratorTool"/>
+                       <Tool
+                               Name="VCXMLDataGeneratorTool"/>
+                       <Tool
+                               Name="VCWebDeploymentTool"/>
+                       <Tool
+                               Name="VCManagedWrapperGeneratorTool"/>
+                       <Tool
+                               Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+               </Configuration>
+               <Configuration
+                       Name="Release|Win32"
+                       OutputDirectory="Release"
+                       IntermediateDirectory="Release"
+                       ConfigurationType="2"
+                       CharacterSet="2">
+                       <Tool
+                               Name="VCCLCompilerTool"
+                               PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;DCHOOK_EXPORTS"
+                               RuntimeLibrary="0"
+                               UsePrecompiledHeader="2"
+                               WarningLevel="3"
+                               Detect64BitPortabilityProblems="FALSE"
+                               DebugInformationFormat="3"/>
+                       <Tool
+                               Name="VCCustomBuildTool"/>
+                       <Tool
+                               Name="VCLinkerTool"
+                               OutputFile="$(OutDir)/DCHook.dll"
+                               LinkIncremental="1"
+                               ModuleDefinitionFile="DCHook.def"
+                               GenerateDebugInformation="TRUE"
+                               SubSystem="2"
+                               OptimizeReferences="2"
+                               EnableCOMDATFolding="2"
+                               ImportLibrary="$(OutDir)/DCHook.lib"
+                               TargetMachine="1"/>
+                       <Tool
+                               Name="VCMIDLTool"/>
+                       <Tool
+                               Name="VCPostBuildEventTool"/>
+                       <Tool
+                               Name="VCPreBuildEventTool"/>
+                       <Tool
+                               Name="VCPreLinkEventTool"/>
+                       <Tool
+                               Name="VCResourceCompilerTool"/>
+                       <Tool
+                               Name="VCWebServiceProxyGeneratorTool"/>
+                       <Tool
+                               Name="VCXMLDataGeneratorTool"/>
+                       <Tool
+                               Name="VCWebDeploymentTool"/>
+                       <Tool
+                               Name="VCManagedWrapperGeneratorTool"/>
+                       <Tool
+                               Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+               </Configuration>
+       </Configurations>
+       <References>
+       </References>
+       <Files>
+               <Filter
+                       Name="\83\\81[\83\83t\83@\83C\83\8b"
+                       Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+                       UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
+                       <File
+                               RelativePath=".\DCHook.cpp">
+                       </File>
+                       <File
+                               RelativePath=".\DCHook.def">
+                       </File>
+               </Filter>
+               <Filter
+                       Name="\83w\83b\83_\81\83t\83@\83C\83\8b"
+                       Filter="h;hpp;hxx;hm;inl;inc;xsd"
+                       UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
+               </Filter>
+               <Filter
+                       Name="\83\8a\83\\81[\83\83t\83@\83C\83\8b"
+                       Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
+                       UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
+                       <File
+                               RelativePath=".\dchook.rc">
+                       </File>
+               </Filter>
+       </Files>
+       <Globals>
+       </Globals>
+</VisualStudioProject>
diff --git a/DCHook/DCHook.cpp b/DCHook/DCHook.cpp
new file mode 100644 (file)
index 0000000..03bd3c8
--- /dev/null
@@ -0,0 +1,3069 @@
+//---------------------------------------------------------------------------
+//
+// \96â\91è\93_\81F
+// Ver0.50
+//
+// \8dÅ\93K\89»\82Ì\89Û\91è\81F
+// standard library\82ð\8eg\82í\82È\82¢\82æ\82¤\82É\82·\82é
+// \8b¤\97L\97Ì\88æ\82ð\91\9d\82â\82·
+//
+// Tips:
+// \93Ë\91RDetach\82³\82ê\82é\8c»\8fÛ
+// --> Hook Function\82Å\97á\8aO\82ª\94­\90\82µ\82Ä\82¢\82é\89Â\94\\90«\82ª\8d\82\82¢
+//     \82à\82µ\82­\82Í\81A\83A\83v\83\8a\83P\81[\83V\83\87\83\93\82Å\97á\8aO\94­\90\82µ\82Ä\82¢\82é
+// \8b¤\97L\83\81\83\82\83\8a\82É\82Â\82¢\82Ä
+// \95¨\97\9d\83\81\83\82\83\8a\82ª\93¯\88ê\82¾\82¯\82Å\82 \82Á\82Ä\81A\98_\97\9d\83A\83h\83\8c\83X\82Í\93¯\88ê\82Æ\82Í\8cÀ\82ç\82È\82¢\81I\81I
+// \8f]\82Á\82Ä\81A\8b¤\97L\83\81\83\82\83\8a\8fã\82Épointer\82ð\94z\92u\82·\82é\82±\82Æ\82Í\8aî\96{\93I\82É\8aë\8c¯\81I\81I
+#define STRICT
+#include <windows.h>
+#include <tchar.h>
+#pragma hdrstop
+#ifndef GWL_WNDPROC
+#define GWL_WNDPROC         (-4)       // \82±\82Ì\92è\8b`\82ª\82È\82¢\82Æerror\82É\82È\82Á\82½ 2014.11.19
+#endif
+#include <tlhelp32.h>
+#include <imagehlp.h>
+#pragma comment(lib, "ImageHlp")
+#include "DCHook.h"
+#ifndef UNICODE
+#include "..\VxD\hk95d.h"
+#endif
+#include "MonitorScale.h"
+
+// Compiler //
+#pragma        warning( disable : 4710 )       // \82Ç\82¤\82µ\82Ä\82±\82¤\82¢\82¤warning\82ª\8fo\82Ä\82­\82é\82Ì\82©\81H
+
+// Configuration //
+#define        USE_SCALING             1       // Uses DPI scaling
+
+#define        USE_DBW                 1       // DBW\82ð\8eg\97p\82·\82é
+#define        USE_SHARE0              1       // share\82µ\82Ä\82à\96â\91è\82È\82¢\95Ï\90\94
+
+#define        METAEXTTEXTOUT  1       // MetaMethod\82ÅExtTextOutx\82ðhook\82·\82é
+#define        HOOK_GETDC              0       // GetDC(),ReleaseDC()\82ðhook\82·\82é
+#define        HOOK_TEXT               0       // DrawText(Ex),TextOut,TabbedTextOut\82Ìhooking
+#define        USE_REDRAW              1
+#define        HOOK_BITBLT             0       // 2016.1.15 \8aO\82µ\82Ä\82Ý\82½
+#define        HOOK_PAINT              0
+#define        GUARD                   0       // \8b¤\97L\83\81\83\82\83\8a\82ðVirtualProtect\82Åguard\82·\82é
+                                                       // \97L\8cø\82É\82·\82é\82ÆApplication\8fI\97¹\8e\9e\82É\88Ù\8fí\8fI\97¹\82ª\94­\90\82·\82é
+                            // Application close ->
+                            // \8c´\88ö\81FDettach\82·\82é\91O\82É\81AOS or Application\82ª
+                            // Protected code\97Ì\88æ\82É\8f\91\82«\8d\9e\82Ý\82ð\8ds\82Á\82Ä\82¢\82é\82æ\82¤\82¾
+
+#define        USE_INVALIDATE          0       // \95`\89æ\91O\82ÉInvalidate\82ð\91\97\82é(IE5@Win98\82Í\95K\97v)
+#define        INVALIDATE_TRUE         0       // InvalidateRect\82Årepaint\82ð\8ds\82¤
+#define        ORG_OFFSET                      1       // ViewPort\82Ìorg offset\8f\88\97\9d\82ð\8ds\82¤
+
+#define        USE_OPTIMALINVALID      1       // \8dÄ\95`\89æ\97Ì\88æ\82ð\82È\82é\82×\82­\8f¬\82³\82­\82·\82é
+#define        USE_VXD                         0       // no longer support (Win9x)
+#define        EXC_WOW64                       0       // do not attach on WOW64
+
+#define        MAX_KEYS                        8       // \83L\81[\83t\83\89\83O\82Ì\8dÅ\91å\92è\8b`\90\94
+
+#define        DEBUG_HITTEXT           0       // for debug hit text
+
+// ExtTextOut hooking\82ÅMetafile\82à\8eg\97p\82·\82é
+// \92P\93Æ\82Å\8ds\82¤\8fê\8d\87\82Í\81ARETRYMETA
+#if HOOK_PAINT || HOOK_GETDC || !USE_REDRAW
+#define        USE_META        1
+#else
+#define        USE_META        0
+#endif
+
+#define        RETRYMETA       1
+
+#if USE_DBW
+#include <stdio.h>
+#else  // !USE_DBW
+#undef DEBUG_HITTEXT
+#define        DEBUG_HITTEXT   0
+#endif // !USE_DBW
+
+#define        MOVESEND_POST   1
+
+// Type Definitions //
+
+// Macros //
+#if GUARD
+#define        PROTECT_SHARE()         ShareProtect( true )
+#define        UNPROTECT_SHARE()       ShareProtect( false )
+#else
+#define        PROTECT_SHARE()
+#define        UNPROTECT_SHARE()
+#endif
+
+#if USE_DBW
+#define        DBW             dbw
+#else
+#define        DBW             (void)
+#endif
+void dbw(const char *format, ...);
+
+#define        WM_AMODI                                (WM_APP+0x400)  // app communication message with AMODI
+#define        WM_MOVESEND                             (WM_APP+0x208)  // DCH_MOVESEND\82Ì\91ã\82í\82è\82ÉPostMessage\82Å\91\97\82é
+#define        AMODI_CMD_QUERY                 0
+#define        AMODI_CMD_PAGE_CAPTURE  1
+
+#define        tsizeof(type)   sizeof(type)
+#define        int_bool(v)             ((v)!=0)
+
+#pragma warning (disable : 4996)
+
+//==============================================//
+// TString template class                                              //
+//==============================================//
+template <class T>
+class TString {
+protected:
+       T *Buffer;
+       int Size;       // Buffer size in character
+       int Length;     // String length in character
+public:
+       TString();
+       ~TString();
+       void Clear()
+               { Buffer[0] = '\0'; Length = 0; }
+       void Set( const T *str, int len );
+       void Set( TString *obj )
+               { Set( obj->c_str(), obj->Length ); }
+       void Cat( const T *str, int len );
+       operator const T *() const
+               { return Buffer; }
+       T operator [] ( int index )
+               { return Buffer[index]; }
+       const T *c_str()
+               { return Buffer; }
+       int GetLength() const { return Length; }
+       int GetByte() const { return Length * sizeof(T); }
+//     int GetSize() const { return Size; }
+};
+template <class T>
+TString<T>::TString()
+{
+       Size = 256;             // initial size
+       Buffer = new T[ Size + 1 ];
+       if (!Buffer)
+               Size = 0;
+       Length = 0;
+}
+template <class T>
+TString<T>::~TString()
+{
+       if (Buffer)
+               delete[] Buffer;
+}
+template <class T>
+void TString<T>::Set( const T *str, int len )
+{
+       if (Buffer){
+               if ( Size < len ){
+                       // not enough space to store
+                       delete[] Buffer;
+               } else goto j1;
+       }
+       Buffer = new T[ len + 1 ];
+       Size = len;
+       if (Buffer){
+j1:;
+               CopyMemory( Buffer, str, len*sizeof(T) );
+               Buffer[len] = '\0';
+               Length = len;
+       } else {
+               Size = 0;
+               Length = 0;
+       }
+}
+template <class T>
+void TString<T>::Cat( const T *str, int len )
+{
+       if (!Buffer){
+               Set( str, len );
+               return;
+       }
+       int newlen = Length + len;
+       if (Size < newlen){
+               T *p = new T[ newlen + 1 ];
+               if (p)
+                       CopyMemory( p, Buffer, newlen*sizeof(T) );
+               delete[] Buffer;
+               Buffer = p;
+               Size = newlen;
+       }
+       if (Buffer){
+               CopyMemory( Buffer+Length, str, len * sizeof(T) );
+               Buffer[newlen] = '\0';
+               Length = newlen;
+       } else {
+               Size = 0;
+               Length = 0;
+               Set( str, len );
+       }
+}
+
+int GetTextFromPoint( HDC hdc, const char *text, int len, int pos, int pos_y, const int *dx=NULL );
+int GetTextFromPoint( HDC hdc, const wchar_t *text, int len, int pos, int pos_y, const int *dx=NULL );
+
+bool CaptureImage(HWND hwnd, bool movesend, bool non_block);
+bool WaitAndGetResult(const TCHAR *text_path, unsigned waittime);
+HANDLE WaitForResult(const TCHAR *text_path, unsigned waittime);
+HWND FindAMODI();
+int SendAMODI(int cmd, const char *data, int len);
+void CheckAMODIAlive();
+void SendMoveMessage();
+void SendCancelMove();
+DWORD WINAPI SendMoveThread(LPVOID vdParam);
+void CheckWOW64();
+
+extern "C" {
+//==============================================//
+// Prototypes                                                                  //
+//==============================================//
+typedef HDC (WINAPI *FNBeginPaint)( HWND, LPPAINTSTRUCT );
+typedef BOOL (WINAPI *FNEndPaint)( HWND, CONST PAINTSTRUCT * );
+typedef HDC (WINAPI *FNGetDC)( HWND );
+typedef int (WINAPI *FNReleaseDC)( HWND, HDC );
+typedef BOOL (WINAPI *FNExtTextOutW)(HDC hdc, int x, int y, UINT option, CONST RECT *rc, LPCWSTR str, UINT count, CONST INT *dx );
+typedef BOOL (WINAPI *FNExtTextOutA)(HDC hdc, int x, int y, UINT option, CONST RECT *rc, LPCSTR str, UINT count, CONST INT *dx );
+typedef BOOL (WINAPI *FNBitBlt)(HDC hdcdest, int xdest, int ydest, int width, int height, HDC hdcsrc, int xsrc, int ysrc, DWORD rop );
+
+typedef LONG (WINAPI *FNTabbedTextOutA)( HDC hdc, int x, int y, LPCSTR str, int count, int ntabs, LPINT tabs, int origin );
+typedef LONG (WINAPI *FNTabbedTextOutW)( HDC hdc, int x, int y, LPCWSTR str, int count, int ntabs, LPINT tabs, int origin );
+typedef BOOL (WINAPI *FNTextOutA)( HDC hdc, int x, int y, LPCSTR str, int count );
+typedef BOOL (WINAPI *FNTextOutW)( HDC hdc, int x, int y, LPCWSTR str, int count );
+typedef int (WINAPI *FNDrawTextA)( HDC hdc, LPCSTR str, int count, LPRECT rc, UINT format );
+typedef int (WINAPI *FNDrawTextW)( HDC hdc, LPCWSTR str, int count, LPRECT rc, UINT format );
+typedef int (WINAPI *FNDrawTextExA)( HDC hdc, LPCSTR str, int count, LPRECT rc, UINT format, LPDRAWTEXTPARAMS params );
+typedef int (WINAPI *FNDrawTextExW)( HDC hdc, LPCWSTR str, int count, LPRECT rc, UINT format, LPDRAWTEXTPARAMS params );
+
+typedef BOOL (WINAPI *FNMoveToEx)(HDC hdc, int x, int y, LPPOINT pt );
+
+
+HDC WINAPI _BeginPaint( HWND hwnd, LPPAINTSTRUCT ps );
+BOOL WINAPI _EndPaint( HWND hwnd, CONST PAINTSTRUCT *ps );
+HDC WINAPI _GetDC( HWND hwnd );
+int WINAPI _ReleaseDC( HWND hwnd, HDC hdc );
+BOOL  WINAPI _ExtTextOutA(HDC hdc, int x, int y, UINT option, CONST RECT *rc, LPCSTR str, UINT count, CONST INT *dx );
+BOOL  WINAPI _ExtTextOutW(HDC hdc, int x, int y, UINT option, CONST RECT *rc, LPCWSTR str, UINT count, CONST INT *dx );
+BOOL WINAPI _BitBlt(HDC hdcdest, int xdest, int ydest, int width, int height, HDC hdcsrc, int xsrc, int ysrc, DWORD rop );
+
+LONG WINAPI _TabbedTextOutA( HDC hdc, int x, int y, LPCSTR str, int count, int ntabs, LPINT tabs, int origin );
+LONG WINAPI _TabbedTextOutW( HDC hdc, int x, int y, LPCWSTR str, int count, int ntabs, LPINT tabs, int origin );
+BOOL WINAPI _TextOutA( HDC hdc, int x, int y, LPCSTR str, int count );
+BOOL WINAPI _TextOutW( HDC hdc, int x, int y, LPCWSTR str, int count );
+int WINAPI _DrawTextA( HDC hdc, LPCSTR str, int count, LPRECT rc, UINT format );
+int WINAPI _DrawTextW( HDC hdc, LPCWSTR str, int count, LPRECT rc, UINT format );
+int WINAPI _DrawTextExA( HDC hdc, LPCSTR str, int count, LPRECT rc, UINT format, LPDRAWTEXTPARAMS params );
+int WINAPI _DrawTextExW( HDC hdc, LPCWSTR str, int count, LPRECT rc, UINT format, LPDRAWTEXTPARAMS params );
+
+BOOL WINAPI _MoveToEx( HDC hdc, int x, int y, LPPOINT pt );
+
+void ShareProtect( bool f );
+DWORD SetWriteProtect( LPVOID addr, bool f );
+bool ChangeMemory( void *dst, const void *src, unsigned size );
+bool LoadVxD();
+void UnloadVxD();
+
+static HMODULE ModuleFromAddress(PVOID pv);
+
+// Prototypes for PSAPI.DLL //
+typedef BOOL (WINAPI *FNEnumProcessModules)( HANDLE hProcess, HMODULE *lphModule, DWORD cb, LPDWORD lpcbNeeded );
+typedef DWORD (WINAPI *FNGetModuleFileNameExA)( HANDLE hProcess, HMODULE hModule, LPSTR lpFilename, DWORD nSize );
+typedef HANDLE (WINAPI *FNCreateToolhelp32Snapshot)( DWORD dwFlags, DWORD th32ProcessID );
+typedef BOOL (WINAPI *FNModule32First)( HANDLE hSnapshot, LPMODULEENTRY32 lpme );
+typedef BOOL (WINAPI *FNModule32Next)( HANDLE hSnapshot, LPMODULEENTRY32 lpme );
+
+
+LRESULT CALLBACK MouseProc( int code, WPARAM wParam, LPARAM lParam );
+LRESULT CALLBACK KeyboardProc( int code, WPARAM wParam, LPARAM lParam );
+bool CaptureText( HWND hwnd, bool movesend );
+bool DoCapture(HWND hwnd, POINT pt, bool movesend, bool image_only=false, bool runOnLaunchedProc=false, bool nonBlock=false);
+void DokoPopMenu( HWND hwnd );
+void ToggleClick( HWND hwnd );
+int CALLBACK EnumMetaFileProc( HDC hdc, HANDLETABLE *, CONST ENHMETARECORD *mfr, int nobj, LPARAM user );
+
+//__declspec(dllexport)
+BOOL  WINAPI _ExtTextOutA(HDC hdc, int x, int y, UINT option, CONST RECT *rc, LPCSTR str, UINT count, CONST INT *dx );
+
+#if METAEXTTEXTOUT
+void ExtTextOutHit();
+#endif
+
+void DoScale(HDC hdc, POINT *pts, int num);
+
+// Prototypes for High DPI //
+typedef enum _PROCESS_DPI_AWARENESS { 
+  Process_DPI_Unaware            = 0,
+  Process_System_DPI_Aware       = 1,
+  Process_Per_Monitor_DPI_Aware  = 2
+} PROCESS_DPI_AWARENESS;
+
+typedef HRESULT (WINAPI *FNGetProcessDPIAwareness)(HANDLE hprocess, PROCESS_DPI_AWARENESS *value);
+typedef HRESULT (WINAPI *FNSetProcessDPIAwareness)(PROCESS_DPI_AWARENESS value);
+
+//==============================================//
+// Shared Section                                                              //
+//==============================================//
+#pragma data_seg(".sdata")
+#pragma bss_seg( ".sbss" )
+HWND hwndCallback = NULL;
+#if USE_VXD
+char VxDpathName[256]; // HK95.vxd path
+#endif
+DWORD siPageSize = 0;
+HWND hwndOrg = NULL;
+HWND hwndAMODI = NULL;
+bool OnlyAMODI = false;
+bool tryAMODI = false;
+bool MoveSend = false;
+#if USE_DBW
+int attach = 0;
+#endif
+#if USE_VXD
+bool WindowsNT;
+#else
+const bool WindowsNT = true;
+#endif
+bool Initialized = false;      // Whether this module initialized or not
+DWORD idDokopopProcess;                // DKPP.EXE process ID
+HHOOK hMouseHook;      // Windows Hook Handle for mouse
+bool ClickOnlyEnabled = false;
+
+struct TKeyConfig {
+       unsigned char Action;
+       int Flag;
+};
+
+TKeyConfig KeyConfig[MAX_KEYS] = {
+       { KA_POPUP, KF_CONTROL },                       // Ctrl+click
+       { KA_POPUP_NC, KF_CLICKONLY },                  // click\82¾\82¯\82Åpopup(DO NOT CHANGE)
+//     { KA_MENU, KF_CONTROL | KF_MENU },      // dokopop menu
+//     { KA_MENU, KF_CONTROL | KF_MENU | KF_CLICKONLY },       // dokopop menu
+       { KA_TOGGLE, KF_CONTROL | KF_MENU },    // dokopop menu
+       { 0, 0 }
+};
+
+bool fWow64 = false;
+
+POINT CursorPoint;     // Client area coordinate //
+POINT ScreenPoint;     // Screen coordinate //
+POINT PrevCursorPoint;
+HWND hwndLast = NULL;
+DWORD PrevMoveTime = 0;
+bool MoveSent = true;
+bool OnlyImage = false;
+
+bool MouseMoving;
+
+RECT rcClient;
+RECT rcInvalid;
+RECT rcOrgInvalid;     // \8dÄ\95`\89æ\91O\82Éinvalid\82¾\82Á\82½\97Ì\88æ
+bool HitFound;
+bool RButtonUpCancel = false;  // \8e\9f\82ÌRButtonUp\82Í\94j\8aü\82·\82é
+bool LButtonUpCancel = false;  // \8e\9f\82ÌLButtonUp\82Í\94j\8aü\82·\82é
+bool MButtonUpCancel = false;  // \8e\9f\82ÌMButtonUp\82Í\94j\8aü\82·\82é
+bool LButtonDown = false;
+bool MButtonDown = false;
+
+HINSTANCE hPSAPI;              // handle of PSAPI.DLL(NT only)
+FNEnumProcessModules fnEnumProcessModules;
+FNGetModuleFileNameExA fnGetModuleFileNameExA;
+FNCreateToolhelp32Snapshot fnCreateToolhelp32Snapshot;
+FNModule32First fnModule32First;
+FNModule32Next fnModule32Next;
+
+#if USE_META || RETRYMETA
+HDC OrgHDC;
+HDC hdcMeta;
+#endif
+HDC hdcExtTextOut;
+#if HOOK_GETDC
+HDC OrgGetDC;
+#endif
+
+int BitBltCount;               // \8c»\8dÝ\82ÌBitBlt\89ñ\90\94
+int ExtTextOutCount;   // \8c»\8dÝ\82ÌBand\93à\82ÌExtTextOut\89ñ\90\94(A/W\82Æ\82à)
+int TargetBitBltCount; // \8c\9f\8d¸\91Î\8fÛ\82ÌBitBlt(\8f\89\89ñ\95`\89æ\8cã\82É\94»\92è) 
+POINT TargetOffset;            // \8c\9f\8d¸\91Î\8fÛ\82ÌBitBlt\82Ì\95`\89æ\83I\83t\83Z\83b\83g(\8f\89\89ñ\95`\89æ\8cã\82É\94»\92è)
+bool RetryPhase;
+
+#if METAEXTTEXTOUT
+// hit text information
+TString<char> *FoundTextA;
+TString<wchar_t> *FoundTextW;
+int FoundLocA;
+int FoundLocW;
+
+// \8dÅ\8cã\82É\95`\89æ\82µ\82½\83e\83L\83X\83g\82Ì\8fî\95ñ
+// for text merge
+int LastX;     // \8dÅ\8cã\82É\95`\89æ\82µ\82½\83e\83L\83X\83g\82Ì\89E\8fã\8dÀ\95W
+int LastY;
+TString<char> *LastTextA;
+TString<wchar_t> *LastTextW;
+#endif // METAEXTTEXTOUT
+
+bool MoveSendMode;
+
+TCHAR AMODIPath[256];
+bool ExtAMODI = false;
+int ScaleX = 0;        // 96\82ð1\82Æ\82µ\82½\89æ\96Ê\82Ì\8ag\91å\97¦
+int ScaleY = 0;
+int generation = 0;
+
+TCHAR ImageTextPath[256+40];   // OCR\97pimage filename or text filename
+DWORD SaveImageTime;
+bool CaptureImageBlocking = false;
+
+const char STR_USER32[] = "user32.dll";
+const char STR_GDI32[] = "gdi32.dll";
+const char STR_KERNEL32[] = "kernel32.dll";
+const TCHAR STR_PSAPI[] = _T("psapi.dll");
+
+// KERNEL32.DLL //
+const char STR_CreateToolhelp32Snapshot[] = "CreateToolhelp32Snapshot";
+const char STR_Module32First[] = "Module32First";
+const char STR_Module32Next[] = "Module32Next";
+
+// PSAPI.DLL //
+const char STR_EnumProcessModules[] = "EnumProcessModules";
+const char STR_GetModuleFileNameExA[] = "GetModuleFileNameExA";
+
+const char STR_BeginPaint[] = "BeginPaint";
+const char STR_EndPaint[] = "EndPaint";
+const char STR_BitBlt[] = "BitBlt";
+const char STR_GetDC[] = "GetDC";
+const char STR_ReleaseDC[] = "ReleaseDC";
+
+const char STR_ExtTextOutA[] = "ExtTextOutA";
+const char STR_ExtTextOutW[] = "ExtTextOutW";
+const char STR_TabbedTextOutA[] = "TabbedTextOutA";
+const char STR_TabbedTextOutW[] = "TabbedTextOutW";
+const char STR_TextOutA[] = "TextOutA";
+const char STR_TextOutW[] = "TextOutW";
+const char STR_DrawTextA[] = "DrawTextA";
+const char STR_DrawTextW[] = "DrawTextW";
+const char STR_DrawTextExA[] = "DrawTextExA";
+const char STR_DrawTextExW[] = "DrawTextExW";
+
+#if USE_SHARE0
+#pragma data_seg()
+#pragma bss_seg()
+#endif
+
+//==============================================//
+// Module depend values                                                        //
+//==============================================//
+HINSTANCE hInstance;   // attached instance
+DWORD idProcess;               // attached process
+HANDLE hProcess;       // Hook\8e\9eGetCurrentProcess()\82Í\8eg\82¦\82È\82¢
+                                       // Hook\8e\9e\82Ìcurrent process\82ª\8f\91\82«\8a·\82¦\82½\82¢thunk\82Ìprocess\82Æ\88ê\92v\82·\82é\82Æ\82Í\8cÀ\82ç\82È\82¢\82½\82ß
+                                       // \82»\82Ì\82½\82ß\81ADLL\82Ìattach\8e\9e\82ÉWriteProcessMemory()\97p\82Éprocess handle\82ð\8eæ\93¾\82·\82é
+DWORD curProcess;      // hooking process
+#if USE_VXD
+HANDLE vxd_Handle = INVALID_HANDLE_VALUE;      // Not shared
+#endif
+
+#if !MOVESEND_POST
+HANDLE SendMoveEvent = NULL;
+DWORD SendMoveThreadId;
+#endif
+
+HINSTANCE hInstSHCore = NULL;
+FNGetProcessDPIAwareness GetProcessDPIAwareness = NULL;
+
+//==============================================//
+// APIHOOK                                                                             //
+//==============================================//
+class APIHOOK {
+public:
+       const char *ModName;
+       const char *FuncName;
+protected:
+       bool ExcludeMe;
+       bool Hooked;
+public:
+       PROC OrgFunc;   // not shared@NT
+protected:
+       PROC HookFunc;  // not shared
+       // Process dedicated values //
+public:
+       static void *MaxAppAddr;        // Maximum private memory address
+protected:
+       static APIHOOK *LinkTop;        // top of APIHOOK link
+       APIHOOK *LinkNext;                      // next pointer of API HOOK link
+public:
+       APIHOOK( const char *modname, const char *name, void *hookfunc, bool excme = true );
+       ~APIHOOK();
+       bool GetProcOrgFunc( HINSTANCE hInst );
+       bool GetProcOrgFunc();
+       bool HookAgain();
+       void Finish();
+protected:
+       bool StoreCode( );
+       void RestoreCode( );
+protected:
+       static void ReplaceIATEntryInAllMods( APIHOOK *obj, PROC pfnCurrent, PROC pfnNew );
+       static bool ReplaceIATEntryInOneMod( APIHOOK *obj, PROC pfnCurrent, PROC pfnNew, HMODULE hmodCaller);
+};
+
+const BYTE cPushOpCode = 0x68;   // The PUSH opcode on x86 platforms
+APIHOOK* APIHOOK::LinkTop = NULL;
+PVOID APIHOOK::MaxAppAddr = NULL;
+
+APIHOOK::APIHOOK( const char *modname, const char *funcname, void *hookfunc, bool excme )
+{
+//     DBW("APIHOOK constructor:%08X %s %s",this, modname, funcname);
+       Hooked = false;
+       ModName = modname;
+       FuncName = funcname;
+       HookFunc = (PROC)hookfunc;
+       ExcludeMe = excme;
+       LinkNext  = LinkTop;
+       LinkTop = this;
+       if (!MaxAppAddr){
+               // Functions with address above lpMaximumApplicationAddress require
+               // special processing (Windows 98 only)
+               SYSTEM_INFO si;
+               GetSystemInfo(&si);
+               MaxAppAddr = si.lpMaximumApplicationAddress;
+       }
+}
+
+APIHOOK::~APIHOOK()
+{
+       Finish();
+       // Remove this object from the linked list
+       APIHOOK* p = LinkTop;
+       if (p == this) {     // Removing the head node
+               LinkTop = p->LinkNext;
+       } else {
+               // Walk list from head and fix pointers
+               for (; p->LinkNext; p = p->LinkNext){
+                       if (p->LinkNext == this) {
+                               // Make the node that points to us point to the our next node
+                               p->LinkNext = p->LinkNext->LinkNext;
+                               break;
+                       }
+               }
+       }
+}
+bool APIHOOK::GetProcOrgFunc()
+{
+       return GetProcOrgFunc( GetModuleHandleA( ModName ) );
+}
+bool APIHOOK::GetProcOrgFunc( HINSTANCE hInst )
+{
+       if (Hooked) return true;
+
+       // Save information about this hooked function
+       OrgFunc = ::GetProcAddress( hInst, FuncName);
+       if (!OrgFunc){
+               DBW("Function doesn't exist =%s:%s", ModName, FuncName);
+               return false;
+       }
+
+       if (OrgFunc > MaxAppAddr) {
+//             DBW("The address is in a shared DLL; the address needs fixing up");
+               PBYTE pb = (PBYTE)OrgFunc;
+               if (pb[0] == cPushOpCode){
+                       // Skip over the PUSH op code and grab the real address
+                       PVOID pv = * (PVOID*) &pb[1];
+                       OrgFunc = (PROC) pv;
+               }
+       }
+
+       // Set assembler code for hooking at the org entry
+       if ( !StoreCode() ){
+               DBW("Cannot write process memory");
+               return false;
+       }
+
+       Hooked = true;
+       return true;
+}
+bool APIHOOK::StoreCode( )
+{
+       DBW("StoreCode:%s %s", ModName, FuncName);
+       // Hook this function in all currently loaded modules
+       ReplaceIATEntryInAllMods( this, OrgFunc, HookFunc );
+       return true;
+}
+void APIHOOK::RestoreCode()
+{
+       DBW("RestoreCode:%s %s", ModName, FuncName);
+       ReplaceIATEntryInAllMods( this, HookFunc, OrgFunc );
+}
+void APIHOOK::ReplaceIATEntryInAllMods( APIHOOK *obj, PROC pfnCurrent, PROC pfnNew )
+{
+       HMODULE hmodThisMod = obj->ExcludeMe
+               ? ModuleFromAddress(ReplaceIATEntryInAllMods) : NULL;
+
+       DWORD cbNeeded;
+       HMODULE hMods[1024];
+       unsigned i;
+       if (fnCreateToolhelp32Snapshot){
+               // Toolhelp\82ª\8eg\97p\82Å\82«\82é\8fê\8d\87\82Í\8eg\97p\82·\82é
+               // Get the list of modules in this process
+               HANDLE hSnapshot = fnCreateToolhelp32Snapshot(TH32CS_SNAPMODULE, idProcess);
+
+               MODULEENTRY32 me = { sizeof(me) };
+               for (BOOL fOk = fnModule32First(hSnapshot,&me); fOk; fOk = fnModule32Next(hSnapshot,&me)){
+                       // NOTE: We don't hook functions in our own module
+                       if (me.hModule != hmodThisMod){
+       //                      DBW("Module : %s %s", me.szModule,FuncName);
+                               // Hook this function in this module
+                               ReplaceIATEntryInOneMod( obj, pfnCurrent, pfnNew, me.hModule);
+                       }
+               }
+               CloseHandle( hSnapshot );
+       } else {
+               if( fnEnumProcessModules(hProcess, hMods, sizeof(hMods), &cbNeeded))
+               {
+                       for ( i = 0; i < (cbNeeded / sizeof(HMODULE)); i++ )
+                       {
+                               if (hMods[i] != hmodThisMod){
+                                       char szModName[MAX_PATH];
+                                       // Get the full path to the module's file.
+                                       if ( fnGetModuleFileNameExA( hProcess, hMods[i], szModName,
+                                                                               sizeof(szModName))){
+       //                                      DBW("Module : %s %s", szModName, FuncName );
+                                               ReplaceIATEntryInOneMod( obj, pfnCurrent, pfnNew, hMods[i]);
+                                       }
+                               }
+                       }
+               }
+#if USE_DBW
+               else DBW("EnumProcessModules failed");
+#endif
+       }
+}
+
+// This functions is almost taken from Jeffrey Richter's sample, thank you.
+bool APIHOOK::ReplaceIATEntryInOneMod( APIHOOK *obj, PROC pfnCurrent, PROC pfnNew, HMODULE hmodCaller)
+{
+       if (!hProcess) return false;
+
+       // Get the address of the module's import section
+       ULONG ulSize;
+       PIMAGE_IMPORT_DESCRIPTOR pImportDesc = (PIMAGE_IMPORT_DESCRIPTOR)
+               ImageDirectoryEntryToData(hmodCaller, TRUE,
+                       IMAGE_DIRECTORY_ENTRY_IMPORT, &ulSize);
+
+       if (!pImportDesc){
+//             DBW("No import section : %s", obj->ModName);
+               return false;
+       }
+
+       // Find the import descriptor containing references to callee's functions
+       for (; pImportDesc->Name; pImportDesc++){
+               PSTR pszModName = (PSTR) ((PBYTE) hmodCaller + pImportDesc->Name);
+               if (lstrcmpiA(pszModName, obj->ModName) == 0) 
+                       break;   // Found
+       }
+
+       if (pImportDesc->Name == 0){
+//             DBW("This module doesn't import any functions from this callee");
+               return false;  // This module doesn't import any functions from this callee
+       }
+
+   // Get caller's import address table (IAT) for the callee's functions
+       PIMAGE_THUNK_DATA pThunk = (PIMAGE_THUNK_DATA) 
+               ((PBYTE) hmodCaller + pImportDesc->FirstThunk);
+
+       // Replace current function address with new function address
+       for (; pThunk->u1.Function; pThunk++){
+               // Get the address of the function address
+               PROC* ppfn = (PROC*) &pThunk->u1.Function;
+               // Is this the function we're looking for?
+               BOOL fFound = (*ppfn == pfnCurrent);
+               if (!fFound && (*ppfn > MaxAppAddr)){
+                       // If this is not the function and the address is in a shared DLL, 
+                       // then maybe we're running under a debugger on Windows 98. In this 
+                       // case, this address points to an instruction that may have the 
+                       // correct address.
+                       PBYTE pbInFunc = (PBYTE) *ppfn;
+                       if (pbInFunc[0] == cPushOpCode){
+                               // We see the PUSH instruction, the real function address follows
+                               ppfn = (PROC*) &pbInFunc[1];
+
+                               // Is this the function we're looking for?
+                               fFound = (*ppfn == pfnCurrent);
+                       }
+               }
+
+               if (fFound){
+                       // The addresses match, change the import section address
+                       if (!WriteProcessMemory(hProcess, ppfn, &pfnNew, sizeof(pfnNew), NULL)){
+                               if (SetWriteProtect( (LPVOID)ppfn, false )==~0){        // write protection release
+                                       DBW("SetWriteProtect failed: %08X %s %s", ppfn, obj->ModName, obj->FuncName);
+                                       return false;
+                               }
+#if USE_VXD
+                               if (!WindowsNT && IsBadWritePtr(ppfn,sizeof(pfnNew))){
+                                       // Windows9x shared DLL section
+                                       // change memory attribte using VxD
+                                       if (!ChangeMemory( ppfn, &pfnNew, sizeof(pfnNew) )){
+                                               DBW("ChangeMemory failed");
+                                       }
+                               } else
+#endif
+                               {
+                                       if (!WriteProcessMemory(hProcess, ppfn, &pfnNew, sizeof(pfnNew), NULL)){
+                                               //SetWriteProtect( ppfn, true );        // restore protection
+                                               DBW("%08X %08X %08X %08X %s %s", hProcess, ppfn, &pfnNew, sizeof(pfnNew), obj->ModName, obj->FuncName );
+                                               DBW("WriteProcessMemory failed : %d",GetLastError());
+                                               return false;
+                                       }
+                               }
+                       }
+                       return true;  // We did it, get out
+               }
+       }
+
+       //DBW("Not found");
+
+       // If we get to here, the function is not in the caller's import section
+       return false;
+}
+bool APIHOOK::HookAgain()
+{
+       if ( Hooked ) return true;
+
+       // Set assembler code for hooking at the org entry
+       if ( !StoreCode() ){
+               DBW("Cannot write process memory@rehook");
+               return false;
+       }
+
+       Hooked = true;
+       return true;
+}
+void APIHOOK::Finish()
+{
+       if ( !Hooked ) return;
+       RestoreCode();
+       Hooked = false;
+}
+// Returns the HMODULE that contains the specified memory address
+static HMODULE ModuleFromAddress(PVOID pv)
+{
+       MEMORY_BASIC_INFORMATION mbi;
+       return((VirtualQuery(pv, &mbi, sizeof(mbi)) != 0) 
+               ? (HMODULE) mbi.AllocationBase : NULL);
+}
+
+#if HOOK_PAINT || RETRYMETA
+APIHOOK BeginPaintHook( STR_USER32, STR_BeginPaint, _BeginPaint );
+APIHOOK EndPaintHook( STR_USER32, STR_EndPaint, _EndPaint );
+#endif
+
+#if HOOK_BITBLT
+APIHOOK BitBltHook( STR_GDI32, STR_BitBlt, _BitBlt );
+#endif
+
+#if HOOK_GETDC
+APIHOOK GetDCHook( STR_USER32, STR_GetDC, _GetDC );
+APIHOOK ReleaseDCHook( STR_USER32, STR_ReleaseDC, _ReleaseDC );
+#endif
+
+#if METAEXTTEXTOUT
+APIHOOK ExtTextOutAHook( STR_GDI32, STR_ExtTextOutA, _ExtTextOutA );
+APIHOOK ExtTextOutWHook( STR_GDI32, STR_ExtTextOutW, _ExtTextOutW );
+#if HOOK_TEXT
+APIHOOK TabbedTextOutAHook( STR_USER32, STR_TabbedTextOutA, _TabbedTextOutA );
+APIHOOK TabbedTextOutWHook( STR_USER32, STR_TabbedTextOutW, _TabbedTextOutW );
+APIHOOK TextOutAHook( STR_GDI32, STR_TextOutA, _TextOutA );
+APIHOOK TextOutWHook( STR_GDI32, STR_TextOutW, _TextOutW );
+APIHOOK DrawTextAHook( STR_USER32, STR_DrawTextA, _DrawTextA );
+APIHOOK DrawTextWHook( STR_USER32, STR_DrawTextW, _DrawTextW );
+APIHOOK DrawTextExAHook( STR_USER32, STR_DrawTextExA, _DrawTextExA );
+APIHOOK DrawTextExWHook( STR_USER32, STR_DrawTextExW, _DrawTextExW );
+#endif
+#endif // METAEXTTEXTOUT
+
+__declspec(dllexport)
+bool WINAPI Init( HWND _hwnd, const char * /*module_name*/, bool windowsnt, const char *vxd_path )
+{
+       DBW("Init:%08X %d", _hwnd, windowsnt);
+       hwndCallback = _hwnd;
+       if ( Initialized ){
+               return true;
+       }
+#if USE_VXD
+       WindowsNT = windowsnt;
+       if (vxd_path){
+//             DBW("vxd_path=%s",vxd_path);
+               lstrcpy( VxDpathName, "\\\\.\\" );
+               lstrcat( VxDpathName, vxd_path );
+               if (!LoadVxD()){
+                       DBW("Cannot open VxD:%s:%d", VxDpathName,GetLastError() );
+                       return false;
+               }
+       }
+#endif
+
+//     HINSTANCE hDll = GetModuleHandle( module_name );
+       hMouseHook = SetWindowsHookEx( WH_MOUSE, (HOOKPROC)MouseProc, hInstance, NULL );
+       if (!hMouseHook){
+               DBW("SetWindowsHookEx error: %d", GetLastError());
+               return false;
+       }
+
+//     hKeyHook = SetWindowsHookEx( WH_KEYBOARD, (HOOKPROC)KeyboardProc, hDll, NULL );
+
+       Initialized = true;
+
+#if GUARD
+       PROTECT_SHARE();
+       DBW("%08X(%08X) Protected", (((INT_PTR)&ExtTextOutAHook) / siPageSize) * siPageSize,&ExtTextOutAHook);
+#endif
+
+       idDokopopProcess = GetCurrentProcessId();
+
+       // get AMODI infomation.
+       if (!tryAMODI){
+               tryAMODI = true;
+               hwndAMODI = FindAMODI();
+#if 0
+               if (hwndAMODI){
+                       DWORD procId;
+                       if (GetWindowThreadProcessId(hwnd, &procId)){
+                               HANDLE hProc = OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ, FALSE, procId);
+                               if (hProc){
+                                       memset(AMODIPath, 0, sizeof(AMODIPath));
+                                       if (GetModuleFileNameEx(hProc, NULL, AMODIPath, sizeof(AMODIPath))>0){
+                                               // OK
+                                       }
+                                       CloseHandle(hProc);
+                               }
+                       }
+               }
+#endif
+       }
+
+       return true;
+}
+
+__declspec(dllexport)
+void WINAPI Uninit()
+{
+       UNPROTECT_SHARE();
+       if ( !Initialized ) return;
+
+       DBW("Uninit");
+       UnhookWindowsHookEx( hMouseHook );
+
+//     UnhookWindowsHookEx( hKeyHook );
+
+#if USE_VXD
+       UnloadVxD();
+#endif
+
+       Initialized = false;
+}
+__declspec(dllexport)
+int WINAPI Config( int clickonly, int keyaction, int keyflag )
+{
+       DBW("Config:%d %d %d", clickonly, keyaction, keyflag);
+       if (clickonly!=-1)
+               ClickOnlyEnabled = int_bool(clickonly);
+       if ( keyflag != 0 ){
+               for ( int i=0;KeyConfig[i].Action;i++ ){
+                       if (KeyConfig[i].Action == keyaction){
+                               KeyConfig[i].Flag = keyflag;
+                               break;
+                       }
+               }
+       }
+       return 0;
+}
+__declspec(dllexport)
+int WINAPI Config2( const struct TDCHConfig *cfg )
+{
+       DBW("Config2: %d %d", cfg->ScaleX, cfg->ScaleY);
+
+       MoveSend = cfg->MoveSend ? true : false;
+       MoveSent = false;
+       OnlyImage = cfg->OnlyImage;
+       ScaleX = cfg->ScaleX;
+       ScaleY = cfg->ScaleY;
+
+       if (cfg->UseAMODI){
+               if (!ExtAMODI){
+                       if (!hwndAMODI)
+                               hwndAMODI = FindAMODI();
+               }
+       } else {
+               hwndAMODI = NULL;
+               ExtAMODI = false;
+               return 0;
+       }
+
+       OnlyAMODI = int_bool(cfg->OnlyAMODI);
+       AMODIPath[0] = '\0';
+       ExtAMODI = false;
+       if (cfg->AMODIPath[0]){
+               size_t len = strlen(cfg->AMODIPath);
+               if (len<sizeof(AMODIPath)-2){
+                       memcpy(AMODIPath, cfg->AMODIPath, len);
+                       if (AMODIPath[len-1]!='\\'){
+                               AMODIPath[len] = '\\';
+                               len++;
+                       }
+                       AMODIPath[len] = '\0';
+                       ExtAMODI = true;
+               }
+       }
+       dbw("Config2[%d]: %d %d %s", ++generation, cfg->ScaleX, cfg->ScaleY, AMODIPath);
+       return 0;
+}
+//Note:
+//     non_block = true\82Ì\8fê\8d\87
+//             \81Ewait\8fó\91Ô\82É\82 \82é\82©\82Ç\82¤\82©\82Í\81AWaitForCaptureResult( false, 0 ) < 0 \82Å\82í\82©\82é\81B
+//             \81E\95K\82¸\8dÅ\8cã\82É\82ÍWaitForCaptureResult(1,...)\82ð\8cÄ\82Ñ\8fo\82·\82±\82Æ\81B
+__declspec(dllexport)
+int WINAPI Capture( HWND hwnd, POINT *ppt, bool movesend, bool non_block )
+{
+       DBW("Capture:%08X %d,%d %d %d", hwnd, ppt ? ppt->x : 0, ppt ? ppt->y : 0, movesend, non_block);
+       if (!hwnd)
+               hwnd = hwndLast;
+       POINT pt;
+       if (ppt)
+               pt = *ppt;
+       else
+               pt = PrevCursorPoint;
+       const bool image_only = true;
+       const bool runOnLaunchedProc = false;
+       return int_bool(DoCapture(hwnd, pt, movesend, image_only, runOnLaunchedProc, non_block));
+}
+//Note:
+// waittime\82ÍCapture()\8aJ\8en\82µ\82Ä\82©\82ç\82Ì\8co\89ß\8e\9e\8aÔ
+// polling\82·\82é\8fê\8d\87\82Íwaittime\82ð\8f­\82µ\82¸\82Â\91\9d\82â\82·\95K\97v\82 \82è(\82»\82Ì\8fê\8d\87\82Ísend_text=0)
+// CaptureImage\82ð\8ds\82Á\82½\8fê\8d\87\82Í\81A\81u\95K\82¸\81vWaitForCaptureResult( 1, ... )\82ð\8cÄ\82Ñ\8fo\82·\95K\97v\82ª\82 \82é\81B
+// \82»\82¤\82µ\82È\82¢\82Æ\81ACaptureImageBlocking\82ª true \82É\82È\82Á\82½\82Ü\82Ü\81B
+//
+// return:
+//     0 : wait\92\86\82Ì\82à\82Ì\82Í\82È\82µ
+//     1 : OK(text ready)
+//     -1: timeout
+__declspec(dllexport)
+int WINAPI WaitForCaptureResult( bool send_text, unsigned waittime )
+{
+       DBW("WaitForCaptureResult: %d %d %d", send_text, waittime, CaptureImageBlocking);
+       if (!CaptureImageBlocking) return 0;
+
+       if (send_text){
+               if (WaitAndGetResult(ImageTextPath, waittime)){
+                       return 1;
+               }
+       } else {
+               HANDLE hf = WaitForResult(ImageTextPath, waittime);
+               if (hf){
+                       CloseHandle(hf);
+                       return 1;
+               }
+       }
+       return -1;
+}
+#if GUARD
+void ShareProtect( bool f )
+{
+       LPVOID BaseAddress = (LPVOID)((((INT_PTR)&ExtTextOutAHook) / siPageSize) * siPageSize);
+
+       DWORD OldProtect;
+       if ( !VirtualProtect( BaseAddress, siPageSize, f ? PAGE_READONLY : PAGE_READWRITE, &OldProtect ) ){
+               DBW("Cannot change protect:%08X@rehook",BaseAddress);
+       }
+}
+#endif
+DWORD SetWriteProtect( LPVOID addr, bool f )
+{
+       LPVOID BaseAddress = (LPVOID)((((INT_PTR)addr) / siPageSize) * siPageSize);
+
+       DWORD OldProtect;
+       if ( !VirtualProtect( BaseAddress, siPageSize, f ? PAGE_READONLY : PAGE_READWRITE, &OldProtect ) ){
+               DBW("Cannot change protect:%08X-%08X@rehook %d", (INT_PTR)BaseAddress>>32, BaseAddress, GetLastError());
+               return ~0;
+       }
+       return OldProtect;
+}
+#if USE_VXD
+// change write protected memory for Windows9x
+bool ChangeMemory( void *dst, const void *src, unsigned size )
+{
+       DWORD DIOC_count;
+       if ( vxd_Handle == INVALID_HANDLE_VALUE ){
+               if (!LoadVxD())
+                       return false;
+       }
+
+       bool r = int_bool(DeviceIoControl( vxd_Handle, DIOC_CHANGE_MEMORY, (void*)src, size, dst, 0, &DIOC_count, NULL));
+#if USE_DBW
+       if ( !r ){
+               DBW("DeviceIoControl failed");
+       }
+#endif
+       return r;
+}
+bool LoadVxD()
+{
+       if (vxd_Handle!=INVALID_HANDLE_VALUE){
+               DBW("Already loaded VxD");
+               return true;
+       }
+       vxd_Handle=CreateFile(&VxDpathName[0],0,0,NULL,0,FILE_FLAG_DELETE_ON_CLOSE,NULL);
+       return vxd_Handle != INVALID_HANDLE_VALUE;
+}
+void UnloadVxD()
+{
+       if (vxd_Handle == INVALID_HANDLE_VALUE)
+               return;
+       CloseHandle(vxd_Handle);
+       vxd_Handle = INVALID_HANDLE_VALUE;
+}
+#endif
+int GetKeyFlag( )
+{
+       int r = 0;
+       if ( GetKeyState( VK_SHIFT ) & 0x8000 ) r |= KF_SHIFT;
+       if ( GetKeyState( VK_CONTROL ) & 0x8000 ) r |= KF_CONTROL;
+       if ( GetKeyState( VK_MENU ) & 0x8000 ) r |= KF_MENU;
+       if ( GetKeyState( VK_LWIN ) & 0x8000 ) r |= KF_LWIN;
+       if ( GetKeyState( VK_RWIN ) & 0x8000 ) r |= KF_RWIN;
+       if ( ClickOnlyEnabled && r == 0 ) r = KF_CLICKONLY;
+//     if ( GetKeyState( VK_APPS ) & 0x8000 ) r |= KF_APPS;
+       return r;
+}
+LRESULT CALLBACK MouseProc( int code, WPARAM wParam, LPARAM lParam )
+{
+       if ( code < 0 || code != HC_ACTION )
+               return CallNextHookEx( hMouseHook, code, wParam, lParam );
+
+       MOUSEHOOKSTRUCT *mhs;
+       HWND hwnd;
+       int kf;
+       int i;
+
+#if 0
+       if (wParam!=0x200 && wParam!=0xA0)
+               dbw("WParam:%08X", wParam);
+#endif
+
+       curProcess = GetCurrentProcessId();
+       bool runOnLaunchedProc = false;
+
+       switch ( wParam ){
+               case WM_LBUTTONDOWN:
+               // case WM_NCLBUTTONDOWN:
+                       LButtonDown = true;
+                       LButtonUpCancel = false;
+//                     if (LButtonUpCancel)
+//                             goto j_end;
+                       kf = KF_LEFTCLICK;
+                       goto j_rbuttondown;
+               case WM_MBUTTONDOWN:
+               // case WM_NCMBUTTONDOWN:
+                       MButtonDown = true;
+                       MButtonUpCancel = false;
+//                     if (MButtonUpCancel)
+//                             goto j_end;
+                       kf = KF_MIDCLICK;
+                       goto j_rbuttondown;
+               case WM_RBUTTONDOWN:
+               //  case WM_NCRBUTTONDOWN:
+                       DBW("RButtonDown");
+                       RButtonUpCancel = false;
+//                     if (RButtonUpCancel)
+//                             goto j_end;
+                       kf = 0;
+                       if (LButtonDown){
+                               kf = KF_LRCLICK;
+                       }
+       j_rbuttondown:;
+                       mhs = (MOUSEHOOKSTRUCT*)lParam;
+                       hwnd = WindowFromPoint( mhs->pt );
+                       //hwnd = mhs->hwnd;
+#if 0
+                       HWND h = GetParent( hwnd );
+                       if ( h )
+                               hwnd = h;
+#endif
+                       kf |= GetKeyFlag();
+
+#if 0
+                       dbw("kf=%02X", kf);
+#endif
+
+                       if (curProcess == idDokopopProcess){
+                               // runs on launched process -> ignored.
+                               DBW("Runs on launched proc(%d)", curProcess);
+                               runOnLaunchedProc = true;
+                       }
+
+                       for ( i=0;KeyConfig[i].Action;i++ ){
+                               //DBW("%d:%d %x", i, KeyConfig[i].Action, KeyConfig[i].Flag);
+                               if ( kf == KeyConfig[i].Flag ){
+                                       switch ( KeyConfig[i].Action ){
+                                               case KA_POPUP:
+                                               case KA_POPUP_NC:
+                                                       {
+                                                       const bool move_send = false;
+                                                       if (DoCapture(hwnd, mhs->pt, move_send, OnlyImage, runOnLaunchedProc)){
+j_discard:
+                                                               if (wParam == WM_LBUTTONDOWN)
+                                                                       LButtonUpCancel = true;
+                                                               if (wParam == WM_MBUTTONDOWN)
+                                                                       MButtonUpCancel = true;
+                                                               else
+                                                                       RButtonUpCancel = true;
+                                                               return 1;       // discard this message
+                                                       }
+                                                       }
+                                                       break;
+                                               case KA_MENU:
+                                                       DokoPopMenu( hwnd );
+                                                       goto j_discard;
+                                               case KA_TOGGLE:
+                                                       DBW("KA_TOGGLE");
+                                                       ToggleClick( hwnd );
+                                                       goto j_discard;
+                                       }
+                               }
+                       }
+                       break;
+               case WM_RBUTTONUP:
+                       DBW("WM_RBUTTONUP:%d",RButtonUpCancel);
+                       if ( RButtonUpCancel ){
+                               RButtonUpCancel = false;
+                               return 1;       // no longer process the message
+                       }
+                       break;
+               case WM_LBUTTONUP:
+                       LButtonDown = false;
+                       if ( LButtonUpCancel ){
+                               LButtonUpCancel = false;
+                               return 1;       // no longer process the message
+                       }
+                       break;
+               case WM_MBUTTONUP:
+                       MButtonDown = false;
+                       if ( MButtonUpCancel ){
+                               MButtonUpCancel = false;
+                               return 1;       // no longer process the message
+                       }
+                       break;
+               case WM_MOUSEMOVE:
+                       if (MoveSend){
+                               mhs = (MOUSEHOOKSTRUCT*)lParam;
+                               hwnd = WindowFromPoint( mhs->pt );
+                               if (PrevCursorPoint.x!=mhs->pt.x || PrevCursorPoint.y!=mhs->pt.y){
+                                       PrevMoveTime = GetTickCount();
+                                       MoveSent = false;
+                                       PrevCursorPoint = mhs->pt;
+                                       hwndLast = hwnd;
+                                       //DBW("Moving:%d %d", mhs->pt.x, mhs->pt.y);
+                                       SendMoveMessage();
+#if 0
+                                       //TODO: 5pixel\96¢\96\9e\82Å\82 \82ê\82ÎDoCapture\82·\82é
+#endif
+                               } else {
+                                       if (!MoveSent){
+#if 0  // 2014.11.18 inc.srch\82Å\97\8e\82¿\82é\82Ì\82Å\82Æ\82è\82 \82¦\82¸comment out
+                                               const int MOVE_SEND_INTERVAL = 50;      // msec
+                                               if (GetTickCount()-PrevMoveTime > MOVE_SEND_INTERVAL){
+                                                       MoveSent = true;
+                                                       if (DoCapture(hwndLast, PrevCursorPoint, true)){
+                                                               // stop the capture from the main.
+                                                               SendCancelMove();
+                                                       }
+                                               }
+#endif
+                                       }
+                               }
+                       }
+                       break;
+       }
+
+//j_end:;
+       return CallNextHookEx( hMouseHook, code, wParam, lParam );
+}
+
+bool DoCapture(HWND hwnd, POINT pt, bool movesend, bool image_only, bool runOnLaunchedProc, bool non_block)
+{
+       CursorPoint = ScreenPoint = pt;
+       ScreenToClient( hwnd, &CursorPoint );
+
+       if (!image_only && !runOnLaunchedProc){
+               //DBW("hwnd:%08X %d %d", (int)hwnd, CursorPoint.x, CursorPoint.y);
+               if ((!hwndAMODI && !ExtAMODI) || !OnlyAMODI){
+                       // Redraw Metafile //
+                       UNPROTECT_SHARE();
+                       DBW("Target : %08X %d", hwnd, curProcess);
+                       bool r = CaptureText( hwnd, movesend );
+                       PROTECT_SHARE();
+                       if (r){
+                               return true;    // discard this message
+                       }
+               }
+       }
+       if (image_only || hwndAMODI || ExtAMODI){
+               if (CaptureImage(hwnd, movesend, non_block))
+                       return true;
+       }
+       return false;
+}
+
+void CallbackMain(int msg, const void *data, int len, HWND wparam=0)
+{
+       COPYDATASTRUCT cds;
+       cds.dwData = msg;
+       cds.cbData = len;
+       cds.lpData = (LPSTR)data;
+       SendMessage( hwndCallback, WM_COPYDATA, (WPARAM)wparam, (LPARAM)&cds );
+}
+
+void DokoPopMenu( HWND hwnd )
+{
+       CallbackMain(DCH_MENU, NULL, 0, hwnd);
+}
+void ToggleClick( HWND hwnd )
+{
+       CallbackMain(DCH_TOGGLE, NULL, 0, hwnd);
+}
+#if 0
+LRESULT CALLBACK KeyboardProc( int code, WPARAM wParam, LPARAM lParam )
+{
+       if ( code < 0 || code != HC_ACTION )
+               return CallNextHookEx( hKeyHook, code, wParam, lParam );
+
+       if ( wParam == VK_CONTROL ){
+               if ( lParam & (KF_UP<<16) ){
+                       // control key up
+                       // -> hold on time
+                       goto j1;
+               } else
+               if ( !(lParam & (KF_REPEAT<<16)) ){
+                       // control key down and not repeat
+//                     DBW("wparam=%08X lparam=%08X",wParam,lParam);
+                       long nowt = GetTickCount();
+                       if ( nowt - LastTypeTime < GetDoubleClickTime() ){
+//                             DBW("On/off!");
+                               ClickOnlyEnabled = !ClickOnlyEnabled;
+                               MessageBeep( MB_OK );
+                               // -> cancel time
+                       } else {
+                               // -> hold on time
+                               LastTypeTime = nowt;
+                               goto j1;
+                       }
+               } else {
+                       // control key down and repeat
+                       // -> cancel time
+               }
+       }
+       LastTypeTime -= 10000;
+j1:;
+       return CallNextHookEx( hMouseHook, code, wParam, lParam );
+}
+#endif
+
+//__declspec(dllexport)
+#if HOOK_PAINT || RETRYMETA
+HDC WINAPI _BeginPaint( HWND hwnd, LPPAINTSTRUCT ps )
+{
+//     DBW("BeginPaint");
+       HDC hdc = ((FNBeginPaint)BeginPaintHook.OrgFunc)( hwnd, ps );
+       OrgHDC = hdc;
+       ps->hdc = hdcMeta;
+#if 1
+       ps->rcPaint.left = 0;
+       ps->rcPaint.top = 0;
+       ps->rcPaint.right = rcInvalid.right;
+       ps->rcPaint.bottom = rcInvalid.bottom;
+#endif
+       return hdcMeta;
+}
+//__declspec(dllexport)
+BOOL WINAPI _EndPaint( HWND hwnd, CONST PAINTSTRUCT *ps )
+{
+       ((PAINTSTRUCT*)ps)->hdc = OrgHDC;
+       return ((FNEndPaint)EndPaintHook.OrgFunc)( hwnd, ps );
+}
+#endif
+#if HOOK_GETDC
+HDC WINAPI _GetDC( HWND hwnd )
+{
+       DBW("GetDC");
+       HDC hdc = ((FNGetDC)GetDCHook.OrgFunc)( hwnd );
+       OrgHDC = hdc;
+       if ( hwnd == hwndOrg ){
+               return hdcMeta;
+       } else {
+               return OrgHDC;
+       }
+}
+int WINAPI _ReleaseDC( HWND hwnd, HDC hdc )
+{
+       DBW("ReleaseDC");
+       if ( hdc == hdcMeta ){
+               hdc = OrgHDC;
+       }
+       int r = ((FNReleaseDC)ReleaseDCHook.OrgFunc)( hwnd, hdc );
+       return r;
+}
+#endif
+
+#if METAEXTTEXTOUT
+//__declspec(dllexport)
+BOOL  WINAPI _ExtTextOutA(HDC hdc, int x, int y, UINT option, CONST RECT *rc, LPCSTR str, UINT count, CONST INT *dx )
+{
+       DBW("_ExtTextOutA");
+       POINT pt;
+       GetCurrentPositionEx(hdc,&pt);
+
+       BOOL r = ((FNExtTextOutA)ExtTextOutAHook.OrgFunc)( hdc, x, y, option, rc, str, count, dx );
+
+       hdcExtTextOut = hdc;
+
+       if ( r
+#if USE_META
+               && hdcMeta != hdc
+#endif
+               && count > 0 ){
+               RECT _rc;
+               if ( rc ){
+                       _rc.right = rc->right;
+                       _rc.bottom = rc->bottom;
+               } else {
+                       _rc.right = rcClient.right;
+                       _rc.bottom = rcClient.bottom;
+               }
+               if ( GetTextAlign( hdc ) & TA_UPDATECP ){
+                       _rc.left = pt.x;
+                       _rc.top = pt.y;
+               } else {
+                       _rc.left = x;
+                       _rc.top = y;
+               }
+               if ( RetryPhase ){
+                       if ( TargetBitBltCount == BitBltCount ){
+                               _rc.right += CursorPoint.x;     //*+++ bug \82±\82¤\82µ\82È\82¢\82Æ\95\9d\82ª\82¹\82Ü\82­\82Ähit\82µ\82È\82¢
+                               OffsetRect( &_rc, TargetOffset.x, TargetOffset.y );
+                       } else {
+                               return r;
+                       }
+               } else {
+                       ExtTextOutCount++;
+               }
+#if ORG_OFFSET /* fixed 2001.1.14 for IE@win2k */
+               POINT vpt;
+               POINT wpt;
+               GetViewportOrgEx( hdc, &vpt );
+               GetWindowOrgEx( hdc, &wpt );
+               OffsetRect( &_rc, vpt.x-wpt.x, vpt.y-wpt.y);
+#else
+#if USE_DBW
+               POINT vpt;
+               POINT wpt;
+               GetViewportOrgEx( hdc, &vpt );
+               GetWindowOrgEx( hdc, &wpt );
+               if (vpt.x != wpt.x || vpt.y != wpt.y)
+                       DBW("!!!Org DIFF=%d %d",vpt.x-wpt.x, vpt.y-wpt.y);
+#endif
+#endif
+
+               // \98A\91±\82µ\82½\83e\83L\83X\83g\82Ì\8fê\8d\87\82Í
+               // \98A\8c\8b\82·\82é
+               if (LastY == _rc.top && LastX == _rc.left ){
+                       // \98A\91±\82µ\82½\83e\83L\83X\83g\95`\89æ\81¨\98A\8c\8b
+                       LastTextA->Cat( str, count );
+               } else {
+                       LastTextA->Set( str, count );
+               }
+               LastX = _rc.left;
+               LastY = _rc.top;
+
+               if ( PtInRect( &_rc, CursorPoint ) )
+               {
+#if DEBUG_HITTEXT
+                       char *buf = new char[ count + 1 ];
+                       CopyMemory( buf, str, count );
+                       buf[count] = '\0';
+                       DBW("CheckA -- %d %d %d %d (%d,%d)", _rc.left, _rc.top, _rc.right, _rc.bottom, CursorPoint.x, CursorPoint.y, count);
+                       DBW("%s", buf);
+                       delete[] buf;
+#endif
+                       int loc = GetTextFromPoint( hdc, str, count, CursorPoint.x - _rc.left, CursorPoint.y - _rc.top, dx );
+                       if ( loc != -1 ){
+                               FoundLocA = loc + LastTextA->GetLength() - count;
+                               FoundTextA->Set( LastTextA );
+#if DEBUG_HITTEXT
+                               DBW("HitA loc=%d Len=%d Text=%ws", FoundLocA, FoundTextA->GetLength(), FoundTextA->c_str());
+#endif
+                       }
+               }
+       }
+
+       return r;
+}
+//__declspec(dllexport)
+BOOL  WINAPI _ExtTextOutW(HDC hdc, int x, int y, UINT option, CONST RECT *rc, LPCWSTR str, UINT count, CONST INT *dx )
+{
+//     DBW("_ExtTextOutW");
+       POINT pt;
+       GetCurrentPositionEx(hdc,&pt);
+
+       BOOL r = ((FNExtTextOutW)ExtTextOutWHook.OrgFunc)( hdc, x, y, option, rc, str, count, dx );
+
+       hdcExtTextOut = hdc;
+
+       if ( r
+#if USE_META
+               && hdcMeta != hdc
+#endif
+               && count > 0 ){
+               RECT _rc;
+               if ( rc ){
+                       _rc.right = rc->right;
+                       _rc.bottom = rc->bottom;
+               } else {
+                       _rc.right = rcClient.right;
+                       _rc.bottom = rcClient.bottom;
+               }
+               if ( GetTextAlign( hdc ) & TA_UPDATECP ){
+                       _rc.left = pt.x;
+                       _rc.top = pt.y;
+               } else {
+                       _rc.left = x;
+                       _rc.top = y;
+               }
+               if ( RetryPhase ){
+                       if ( TargetBitBltCount == BitBltCount ){
+                               _rc.right += CursorPoint.x;     //*+++ bug \82±\82¤\82µ\82È\82¢\82Æ\95\9d\82ª\82¹\82Ü\82­\82Ähit\82µ\82È\82¢
+                               OffsetRect( &_rc, TargetOffset.x, TargetOffset.y );
+                       } else {
+                               return r;
+                       }
+               } else {
+                       ExtTextOutCount++;
+               }
+#if ORG_OFFSET /* fixed 2001.1.14 for IE@win2k */
+               POINT vpt;
+               POINT wpt;
+               GetViewportOrgEx( hdc, &vpt );
+               GetWindowOrgEx( hdc, &wpt );
+               OffsetRect( &_rc, vpt.x-wpt.x, vpt.y-wpt.y);
+#else  // !ORG_OFFSET
+#if USE_DBW
+               POINT vpt;
+               POINT wpt;
+               GetViewportOrgEx( hdc, &vpt );
+               GetWindowOrgEx( hdc, &wpt );
+               if (vpt.x != wpt.x || vpt.y != wpt.y)
+                       DBW("!!!Org DIFF=%d %d",vpt.x-wpt.x, vpt.y-wpt.y);
+#endif // USE_DBW
+#endif // !ORG_OFFSET
+
+               // \98A\91±\82µ\82½\83e\83L\83X\83g\82Ì\8fê\8d\87\82Í\98A\8c\8b\82·\82é
+               if (LastY == _rc.top && LastX == _rc.left ){
+                       // \98A\91±\82µ\82½\83e\83L\83X\83g\95`\89æ\81¨\98A\8c\8b
+                       LastTextW->Cat( str, count );
+               } else {
+                       LastTextW->Set( str, count );
+               }
+               LastX = _rc.left;
+               LastY = _rc.top;
+
+               if ( PtInRect( &_rc, CursorPoint ) )
+               {
+                       DBW("%04X %04X %04X %04X",
+                               str[0],
+                               str[1],
+                               str[2],
+                               str[3]);
+#if DEBUG_HITTEXT
+                       wchar_t *buf = new wchar_t[ count + 1 ];
+                       CopyMemory( buf, str, count*sizeof(wchar_t) );
+                       buf[count] = '\0';
+                       DBW("CheckW -- %d %d %d %d (%d,%d)", _rc.left, _rc.top, _rc.right, _rc.bottom, CursorPoint.x, CursorPoint.y, count);
+                       DBW("%ws", buf);
+                       delete[] buf;
+#endif
+                       int loc = GetTextFromPoint( hdc, str, count, CursorPoint.x - _rc.left, CursorPoint.y - _rc.top, dx );
+                       if ( loc != -1 ){
+                               FoundLocW = loc + LastTextW->GetLength() - count;
+                               FoundTextW->Set( LastTextW );
+#if DEBUG_HITTEXT
+                               DBW("HitW loc=%d Len=%d Text=%ws", FoundLocW, FoundTextW->GetLength(), FoundTextW->c_str());
+#endif
+                       }
+               }
+       }
+
+       return r;
+}
+#endif // !METAEXTTEXTOUT
+
+#if HOOK_BITBLT
+BOOL WINAPI _BitBlt(HDC hdcdest, int xdest, int ydest, int width, int height, HDC hdcsrc, int xsrc, int ysrc, DWORD rop )
+{
+       DBW("BitBlt:%08X %d %d %d %d <- %08X %d %d", hdcdest, xdest, ydest, width, height, hdcsrc, xsrc, ysrc );
+       BOOL r = ((FNBitBlt)BitBltHook.OrgFunc)(hdcdest, xdest, ydest, width, height, hdcsrc, xsrc, ysrc, rop );
+//     DBW("BitBlt:%08X %d %d %d %d <- %08X %d %d", hdcdest, xdest, ydest, width, height, hdcsrc, xsrc, ysrc );
+       if ( r && hdcExtTextOut == hdcsrc ){
+               if ( !RetryPhase ){
+                       // \8d¡\89ñ\82ÌBitBlt\8e\9e\82ÉExtTextOut\82ª\82 \82Á\82½\82©\81H
+                       if ( ExtTextOutCount > 0 ){
+                               // CursorPoint\82ª\8aÜ\82Ü\82ê\82é\82©\81H
+                               DBW("ExtTextOutCount=%d",ExtTextOutCount);
+                               if ( (xdest <= CursorPoint.x)
+                                       && (xdest+width > CursorPoint.x)
+                                       && (ydest <= CursorPoint.y)
+                                       && (ydest+height > CursorPoint.y)
+                               ){
+                                       TargetBitBltCount = BitBltCount;
+                                       TargetOffset.x = xdest - xsrc;
+                                       TargetOffset.y = ydest - ysrc;
+                                       DBW("TargetOffset %d %d (%d,%d %dx%d)<-(%d,%d)",
+                                               TargetOffset.x, TargetOffset.y,xdest,ydest,width,height,xsrc,ysrc);
+#if USE_DBW
+                                       {
+                                       POINT vpt;
+                                       POINT wpt;
+                                       GetViewportOrgEx( hdcdest, &vpt );
+                                       GetWindowOrgEx( hdcdest, &wpt );
+                                       DBW("BitBlt OrgDIFF=%d %d",vpt.x-wpt.x, vpt.y-wpt.y);
+                                       SIZE sz1;
+                                       SIZE sz2;
+                                       GetViewportExtEx( hdcdest, &sz1 );
+                                       GetWindowExtEx( hdcdest, &sz2 );
+                                       DBW("BitBlt Ext %d (%d,%d) (%d,%d)", GetMapMode(hdcdest), sz1.cx, sz1.cy, sz2.cx, sz2.cy );
+#if 1
+                                       XFORM xform;
+                                       GetWorldTransform( hdcdest, &xform );
+                                       {
+                                       char buf[100];
+                                       sprintf(buf,"== [%d] %g %g %g %g %g %g", GetGraphicsMode(hdcdest), xform.eM11, xform.eM12, xform.eM21, xform.eM22, xform.eDx, xform.eDy);
+                                       DBW(buf);
+                                       }
+#endif
+                                       }
+#endif
+                               }
+#if METAEXTTEXTOUT
+                               if ( TargetBitBltCount != -1 ){
+                                       // \82·\82Å\82É\82Ù\82©\82Ìband\82Åhit\82µ\82Ä\82¢\82é\8fê\8d\87\81A
+                                       // Cancel ExtTextOut
+                                       FoundLocA = -1;
+                                       FoundLocW = -1;
+                               }
+#endif
+                       }
+               }
+               BitBltCount++;
+               DBW("BitBltCount=%d",BitBltCount);
+               ExtTextOutCount = 0;
+               return r;
+       } else {
+//             DBW("Unknown destination BitBlt %08X(%d,%d %dx%d)<-%08X(%d,%d)",hdcdest,xdest,ydest,width,height,hdcsrc,xsrc,ysrc);
+       }
+       return r;
+}
+#endif
+
+#if HOOK_TEXT
+#define        HK1( name, ret_type, args ) \
+       ret_type r = ((FN##name)name##Hook.OrgFunc) args; \
+       return r
+LONG WINAPI _TabbedTextOutA( HDC hdc, int x, int y, LPCSTR str, int count, int ntabs, LPINT tabs, int origin )
+{
+       DBW("_TabbedTextOutA");
+       HK1( TabbedTextOutA, LONG, ( hdc, x, y, str, count, ntabs, tabs, origin ) );
+}
+LONG WINAPI _TabbedTextOutW( HDC hdc, int x, int y, LPCWSTR str, int count, int ntabs, LPINT tabs, int origin )
+{
+       DBW("TabbedTextOutW");
+       HK1( TabbedTextOutW, LONG, ( hdc, x, y, str, count, ntabs, tabs, origin ) );
+}
+BOOL WINAPI _TextOutA( HDC hdc, int x, int y, LPCSTR str, int count )
+{
+       DBW("_TextOutA");
+       HK1( TextOutA, BOOL, ( hdc, x, y, str, count ) );
+}
+BOOL WINAPI _TextOutW( HDC hdc, int x, int y, LPCWSTR str, int count )
+{
+       DBW("_TextOutW");
+       HK1( TextOutW, BOOL, ( hdc, x, y, str, count ) );
+}
+int WINAPI _DrawTextA( HDC hdc, LPCSTR str, int count, LPRECT rc, UINT format )
+{
+       DBW("s5");
+       HK1( DrawTextA, int, ( hdc, str, count, rc, format ) );
+}
+int WINAPI _DrawTextW( HDC hdc, LPCWSTR str, int count, LPRECT rc, UINT format )
+{
+       DBW("s6");
+       HK1( DrawTextW, int, ( hdc, str, count, rc, format ) );
+}
+int WINAPI _DrawTextExA( HDC hdc, LPCSTR str, int count, LPRECT rc, UINT format, LPDRAWTEXTPARAMS params )
+{
+       DBW("s7");
+       HK1( DrawTextExA, int, ( hdc, str, count, rc, format, params ) );
+}
+int WINAPI _DrawTextExW( HDC hdc, LPCWSTR str, int count, LPRECT rc, UINT format, LPDRAWTEXTPARAMS params )
+{
+       DBW("s8");
+       HK1( DrawTextExW, int, ( hdc, str, count, rc, format, params ) );
+}
+#endif // HOOK_TEXT
+
+bool CaptureText( HWND hwnd, bool movesend )
+{
+       if ( !hwnd ){
+               return false;
+       }
+
+       MoveSendMode = movesend;
+
+       //DoScale(NULL, &CursorPoint, 1);
+
+#if METAEXTTEXTOUT
+       FoundLocA = -1;
+       FoundLocW = -1;
+       FoundTextA = new TString<char>;
+       FoundTextW = new TString<wchar_t>;
+       LastTextA = new TString<char>;
+       LastTextW = new TString<wchar_t>;
+#endif
+
+#if !USE_REDRAW
+       HRGN hRgn;
+#endif
+
+       GetClientRect( hwnd, &rcClient );
+       GetUpdateRect( hwnd, &rcOrgInvalid, FALSE );
+
+#if USE_OPTIMALINVALID
+       SetRect( &rcInvalid, 0, max(CursorPoint.y - 64,0), rcClient.right, max(CursorPoint.y + 64,0) );
+#else
+       rcInvalid = rcClient;
+#endif
+
+#if !USE_REDRAW
+       hRgn = CreateRectRgn( rcInvalid.left, rcInvalid.top, rcInvalid.right, rcInvalid.bottom );
+
+#if USE_INVALIDATE
+       InvalidateRect( hwnd, &rcInvalid, INVALIDATE_TRUE );
+#endif
+
+       SendMessage( hwnd, WM_PAINT, 0, 0 );
+       SendMessage( hwnd, WM_NCPAINT, (WPARAM)hRgn, 0 );
+#endif
+
+       hwndOrg = hwnd;
+
+#if USE_META
+       HDC hdc;
+#endif
+
+       HINSTANCE hPSAPI = NULL;
+       HMODULE hInst;
+       HMODULE hInstGdi;
+
+       hInst = GetModuleHandleA( STR_KERNEL32 );
+       fnCreateToolhelp32Snapshot = (FNCreateToolhelp32Snapshot)GetProcAddress( hInst, STR_CreateToolhelp32Snapshot );
+       if (fnCreateToolhelp32Snapshot){
+               // Toolhelp\82É\82æ\82émodule enumration\82ª\8eg\97p\89Â\94\
+               fnModule32First = (FNModule32First)GetProcAddress( hInst, STR_Module32First );
+               fnModule32Next = (FNModule32Next)GetProcAddress( hInst, STR_Module32Next );
+       } else {
+               // Toolhelp\82ª\91\8dÝ\82µ\82È\82¢\8fê\8d\87
+               hPSAPI = LoadLibrary( STR_PSAPI );
+               DBW("LoadLibrary : %08X",hPSAPI);
+               if (!hPSAPI){
+                       DBW("Cannot load PSAPI.DLL!!");
+                       return false;
+               }
+               fnEnumProcessModules = (FNEnumProcessModules)GetProcAddress( hPSAPI, STR_EnumProcessModules );
+               fnGetModuleFileNameExA = (FNGetModuleFileNameExA)GetProcAddress( hPSAPI, STR_GetModuleFileNameExA );
+       }
+
+       hInst = GetModuleHandleA( STR_USER32 );
+#if USE_DBW
+       if ( !hInst ){
+               DBW("Cannot load USER32.DLL");
+               return false;
+       }
+#endif
+       hInstGdi = GetModuleHandleA( STR_GDI32 );
+#if USE_DBW
+       if ( !hInstGdi ){
+               DBW("Cannot load GDI32.DLL");
+               goto err9;
+       }
+#endif
+
+#if METAEXTTEXTOUT
+       if ( !ExtTextOutAHook.GetProcOrgFunc( hInstGdi ) ){
+               DBW("Cannot find ExtTextOutA");
+               goto err8;
+       }
+       if ( !ExtTextOutWHook.GetProcOrgFunc( hInstGdi ) ){
+               DBW("Cannot find ExtTextOutW");
+               goto err7;
+       }
+#endif
+
+#if HOOK_BITBLT
+       if ( !BitBltHook.GetProcOrgFunc( hInstGdi ) ){
+               DBW("Cannot find BitBlt");
+               goto err71;
+       }
+#endif
+       RetryPhase = false;
+       TargetBitBltCount = -1;
+       BitBltCount = 0;
+       ExtTextOutCount = 0;
+
+#if HOOK_PAINT
+       if ( !BeginPaintHook.GetProcOrgFunc( hInst ) ){
+               DBW("Cannot hook BeginPaint");
+               goto err73;
+       }
+       if ( !EndPaintHook.GetProcOrgFunc( hInst ) ){
+               DBW("Cannot hook EndPaint");
+               goto err6;
+       }
+#endif
+
+#if HOOK_TEXT
+       TabbedTextOutAHook.GetProcOrgFunc( hInst );
+       TabbedTextOutWHook.GetProcOrgFunc( hInst );
+       TextOutAHook.GetProcOrgFunc( hInstGdi );
+       TextOutWHook.GetProcOrgFunc( hInstGdi );
+       DrawTextAHook.GetProcOrgFunc( hInst );
+       DrawTextWHook.GetProcOrgFunc( hInst );
+       DrawTextExAHook.GetProcOrgFunc( hInst );
+       DrawTextExWHook.GetProcOrgFunc( hInst );
+#endif
+
+#if USE_META
+       hdc = GetDC( hwnd );
+       if ( !hdc ){
+               DBW("Cannot get DC");
+               goto err5;
+       }
+#endif
+
+#if HOOK_GETDC
+       if ( !GetDCHook.GetProcOrgFunc( hInst ) ){
+               DBW("Cannot hook GetDC");
+               goto err4;
+       }
+       if ( !ReleaseDCHook.GetProcOrgFunc( hInst ) ){
+               DBW("Cannot hook ReleaseDC");
+               goto err3;
+       }
+#endif
+
+       {
+       DBW("Hooked successfully");
+//             rect.right = 9999;
+//             rect.bottom = 9999;
+#if 0
+               int iWidthMM = GetDeviceCaps(hdc, HORZSIZE);
+               int iHeightMM = GetDeviceCaps(hdc, VERTSIZE);
+               int iWidthPels = GetDeviceCaps(hdc, HORZRES);
+               int iHeightPels = GetDeviceCaps(hdc, VERTRES);
+
+               // Use iWidthMM, iWidthPels, iHeightMM, and iHeightPels to determine the
+               // number of .01-millimeter units per pixel in the x and y directions.
+
+               int iMMPerPelX = (iWidthMM * 100)/iWidthPels;
+               int iMMPerPelY = (iHeightMM * 100)/iHeightPels;
+               DBW("-%d %d-",iMMPerPelX, iMMPerPelY);
+
+               // Convert client coordinates to .01-mm units.
+
+               rcClient.left = rcClient.left * iMMPerPelX;
+               rcClient.top = rcClient.top * iMMPerPelY;
+               rcClient.right = rcClient.right * iMMPerPelX;
+               rcClient.bottom = rcClient.bottom * iMMPerPelY;
+#endif
+
+#if USE_META
+               hdcMeta = CreateEnhMetaFile(hdc,
+                                 NULL,
+                                 &rcClient, "DCHook\0EnhMetaFile\0");
+               if ( !hdcMeta ){
+                       DBW("Cannot create Meta file");
+                       goto err3;
+               }
+
+               DBW("hdcMeta=%08X", hdcMeta);
+#endif
+
+#if USE_REDRAW
+               RedrawWindow( hwnd, &rcInvalid, NULL, RDW_UPDATENOW | RDW_NOERASE | RDW_NOFRAME | RDW_INVALIDATE );
+#else
+               WNDPROC PaintWndProc = (WNDPROC)GetWindowLong( hwnd, GWL_WNDPROC );
+               SendMessage( hwnd, WM_PAINT, (WPARAM)hdcMeta, 0 );
+#endif
+#if HOOK_GETDC
+               ReleaseDCHook.Finish();
+               GetDCHook.Finish();
+#endif
+
+#if HOOK_TEXT
+               TabbedTextOutAHook.Finish( );
+               TabbedTextOutWHook.Finish( );
+               TextOutAHook.Finish( );
+               TextOutWHook.Finish( );
+               DrawTextAHook.Finish( );
+               DrawTextWHook.Finish( );
+               DrawTextExAHook.Finish( );
+               DrawTextExWHook.Finish( );
+#endif
+
+#if HOOK_PAINT
+               EndPaintHook.Finish();
+               BeginPaintHook.Finish();
+#endif
+
+#if HOOK_BITBLT
+               BitBltHook.Finish();
+#endif
+
+#if METAEXTTEXTOUT
+               ExtTextOutAHook.Finish();
+               ExtTextOutWHook.Finish();
+#endif
+
+               // Notify start enumrate meta-file
+               CallbackMain(DCH_START, &CursorPoint, sizeof(CursorPoint), hwnd);
+
+               HitFound = false;
+
+#if USE_META
+               HENHMETAFILE emf = CloseEnhMetaFile( hdcMeta );
+
+               if ( emf )
+#endif
+               {
+#if METAEXTTEXTOUT
+                       if ( FoundLocA != -1 || FoundLocW != -1 ){
+//                             DBW("Hit ExtText:%d %d",FoundLocA,FoundLocW);
+                               // ExtTextOutx hook\82Ì\82Ù\82¤\82ð\97D\90æ\82·\82é
+                               ExtTextOutHit( );
+                               HitFound = true;
+                       } else
+#endif
+                       {
+#if USE_META
+                               // Create compatible device-context for enumration
+                               HDC _hdc = CreateCompatibleDC( hdc );
+                               HBITMAP hbitmap = CreateCompatibleBitmap( hdc, rcClient.right, rcClient.bottom );
+                               HGDIOBJ gdiobj = SelectObject( _hdc, hbitmap );
+
+                               DBW("Start meta");
+                               // Enumerate meta-file
+                               EnumEnhMetaFile( _hdc, emf, EnumMetaFileProc, NULL, &rcClient );
+                               DBW("End meta");
+
+                               // Delete compatible device-context
+                               SelectObject( _hdc, gdiobj );
+                               DeleteObject( hbitmap );
+                               DeleteDC( _hdc );
+#endif
+                       }
+#if USE_META
+                       DeleteEnhMetaFile( emf );
+#endif
+               }
+#if USE_META
+               else {
+                       DBW("emf is NULL");
+               }
+#endif
+
+#if METAEXTTEXTOUT
+               if ( !HitFound && TargetBitBltCount != -1 ){
+                       DBW("Search from band:%d",TargetBitBltCount);
+#if USE_META
+                       // Band\82©\82ç\8c\9f\8dõ
+                       hdcMeta = CreateCompatibleDC( hdc );
+                       if ( !hdcMeta ){
+                               DBW("Cannot create HDC in retry");
+                       } else
+#endif
+                       {
+#if USE_META
+                               HBITMAP hbitmap = CreateCompatibleBitmap( hdc, rcClient.right, rcClient.bottom );
+                               HGDIOBJ gdiobj = SelectObject( hdcMeta, hbitmap );
+                               DBW("hdcMeata=%08X", hdcMeta);
+#endif
+
+                               BitBltCount = 0;
+                               RetryPhase = true;
+#if METAEXTTEXOUT
+                               FoundLocA = -1;
+                               FoundLocW = -1;
+#endif
+
+#if METAEXTTEXTOUT
+                               ExtTextOutAHook.HookAgain();
+                               ExtTextOutWHook.HookAgain();
+#endif
+#if HOOK_BITBLT
+                               BitBltHook.HookAgain();
+#endif
+#if HOOK_PAINT
+                               BeginPaintHook.HookAgain();
+                               EndPaintHook.HookAgain();
+#endif
+
+//                             DBW("t1:%d %d %d %d",rcClient.left, rcClient.top,rcClient.right,rcClient.bottom);
+
+#if USE_INVALIDATE
+                               InvalidateRect( hwnd, &rcInvalid, INVALIDATE_TRUE );
+#endif
+
+#if USE_REDRAW
+                               RedrawWindow( hwnd, &rcInvalid, NULL, RDW_UPDATENOW | RDW_NOERASE | RDW_NOFRAME | RDW_INVALIDATE );
+#else
+                               CallWindowProc( (WNDPROC)PaintWndProc, hwnd, WM_PAINT, (WPARAM)hdcMeta, 0 );
+#endif
+
+#if HOOK_PAINT
+                               EndPaintHook.Finish();
+                               BeginPaintHook.Finish();
+#endif
+#if HOOK_BITBLT
+                               BitBltHook.Finish();
+#endif
+
+#if METAEXTTEXTOUT
+                               ExtTextOutAHook.Finish();
+                               ExtTextOutWHook.Finish();
+#endif
+#if USE_META
+                               SelectObject( hdcMeta, gdiobj );
+                               DeleteObject( hbitmap );
+                               DeleteDC( hdcMeta );
+#endif
+                               if ( FoundLocA != -1 || FoundLocW != -1 ){
+                                       DBW("Found in BitBlt ExtText:%d %d",FoundLocA,FoundLocW);
+                                       ExtTextOutHit( );
+                                       HitFound = true;
+                               }
+                       }
+               }
+#endif // METAEXTTEXTOUT
+
+#if RETRYMETA
+               if ( !HitFound ){
+                       HENHMETAFILE emf;
+#if !USE_META
+                       HDC hdc = GetDC( hwnd );
+                       if ( !hdc ){
+                               DBW("Cannot get DC");
+                               goto err01;
+                       }
+#endif
+#if HOOK_PAINT
+                       if ( !BeginPaintHook.HookAgain( ) ){
+                               DBW("Cannot hook BeginPaint");
+                               goto err02;
+                       }
+                       if ( !EndPaintHook.HookAgain( ) ){
+                               DBW("Cannot hook EndPaint");
+                               goto err03;
+                       }
+#else
+                       if ( !BeginPaintHook.GetProcOrgFunc( hInst ) ){
+                               DBW("Cannot hook BeginPaint");
+                               goto err02;
+                       }
+                       if ( !EndPaintHook.GetProcOrgFunc( hInst ) ){
+                               DBW("Cannot hook EndPaint");
+                               goto err03;
+                       }
+#endif
+
+                       hdcMeta = CreateEnhMetaFile(hdc,
+                                         NULL,
+                                         &rcClient, _T("DCHook\0EnhMetaFile\0"));
+                       if ( !hdcMeta ){
+                               DBW("Cannot create Meta file");
+                               goto err04;
+                       }
+                       DBW("hdcMeta=%08X", hdcMeta);
+//                     InvalidateRect( hwnd, &rcInvalid, INVALIDATE_TRUE );
+#if 1          // 2000.7.15 NT\82Å\82à\82È\82º\82±\82Á\82¿\82É\82µ\82Ä\82¢\82È\82©\82Á\82½\82Ì\82©\82í\82©\82ç\82È\82¢\82ª\81E\81E\81E
+                       SendMessage( hwnd, WM_PAINT, (WPARAM)hdcMeta, 0 );
+#else
+                       // Notepad\82Å\82Í\88Ù\8fí\8fI\97¹\82·\82é\82½\82ß\8bp\89º
+                       // \89½\82à\82È\82¢\82Æ\82±\82ë\82ÅCtrl+\89E\83N\83\8a\83b\83N
+                       WNDPROC PaintWndProc = (WNDPROC)GetWindowLong( hwnd, GWL_WNDPROC );
+                       if ( PaintWndProc ){
+                               PaintWndProc( hwnd, WM_PAINT, (WPARAM)hdcMeta, 0 );
+                       }
+#endif
+                       EndPaintHook.Finish();
+                       BeginPaintHook.Finish();
+
+                       emf = CloseEnhMetaFile( hdcMeta );
+
+                       if ( emf ){
+                               HDC _hdc = CreateCompatibleDC( hdc );
+                               HBITMAP hbitmap = CreateCompatibleBitmap( hdc, rcClient.right, rcClient.bottom );
+                               HGDIOBJ gdiobj = SelectObject( _hdc, hbitmap );
+
+                               DBW("Start meta-retry");
+                               // Enumerate meta-file
+                               EnumEnhMetaFile( _hdc, emf, EnumMetaFileProc, NULL, &rcClient );
+                               DBW("End meta-retry");
+
+                               // Delete compatible device-context
+                               SelectObject( _hdc, gdiobj );
+                               DeleteObject( hbitmap );
+                               DeleteDC( _hdc );
+                               DeleteEnhMetaFile( emf );
+                       }
+               err04:
+                       EndPaintHook.Finish();
+               err03:
+                       BeginPaintHook.Finish();
+               err02:
+#if !USE_META
+                       ReleaseDC( hwnd, hdc );
+#endif
+               err01:;
+               }
+#endif
+               
+               // Notify end enumrate meta-file
+               CallbackMain(DCH_END | (MoveSendMode ? DCH_MOVESEND : 0), NULL, 0, hwnd);
+       }
+
+#if USE_META
+       ReleaseDC( hwnd, hdc );
+#endif
+
+       if ( rcOrgInvalid.right != 0 ){
+               DBW("Update OrgInvalid--------");
+               InvalidateRect( hwnd, NULL, INVALIDATE_TRUE );
+       }
+
+       goto jreturn;
+
+#if HOOK_GETDC || USE_META
+err3:;
+#endif
+#if HOOK_GETDC
+       GetDCHook.Finish();
+err4:;
+#if USE_META
+       ReleaseDC( hwnd, hdc );
+#endif
+#endif
+#if USE_META
+err5:;
+#endif
+#if HOOK_PAINT
+       EndPaintHook.Finish();
+err6:;
+       BeginPaintHook.Finish();
+err73:;
+#endif
+#if HOOK_BITBLT
+       BitBltHook.Finish();
+#endif
+#if HOOK_BITBLT
+err71:;
+#endif
+#if METAEXTTEXTOUT
+       ExtTextOutWHook.Finish();
+err7:;
+       ExtTextOutAHook.Finish();
+err8:
+#endif
+       if (hPSAPI)
+               FreeLibrary( hPSAPI );
+#if USE_DBW
+err9:
+#endif
+       HitFound = false;
+jreturn:;
+#if USE_VXD
+       if (vxd_Handle!=INVALID_HANDLE_VALUE)
+               UnloadVxD();
+#endif
+#if METAEXTTEXTOUT
+       delete FoundTextA;
+       delete FoundTextW;
+       delete LastTextA;
+       delete LastTextW;
+#endif
+
+       return HitFound;
+}
+#if METAEXTTEXTOUT
+void ExtTextOutHit()
+{
+       if ( FoundLocA != -1 ){
+               // Hit on ANSI
+               DBW("Hit on ANSI@ExtTextOut");
+               CallbackMain(DCH_HITTEXT1, FoundTextA->c_str(), FoundTextA->GetByte(), (HWND)FoundLocA);
+       } else {
+               // Hit on UNICODE
+               DBW("Hit on UNICODE@ExtTextOut");
+               CallbackMain(DCH_HITTEXT2, FoundTextW->c_str(), FoundTextW->GetByte(), (HWND)FoundLocW);
+       }
+}
+#endif // METAEXTTEXTOUT
+
+void DoScale(HDC hdc, POINT *pts, int num)
+{
+       //TODO: hInst, proc\82Íglobal\82É\82µ\82½\82Ù\82¤\82ª\82¢\82¢\82Ì\82Å\82Í\81H
+
+       int scale = 0;
+       if (ScaleX && ScaleY){
+               scale = ScaleX; // \8ew\92è\82µ\82½scaling parameter
+       } else {
+               scale = GetMonitorScale();
+               if (scale == 96) return;
+       }
+
+#if 1
+#if 1
+       PROCESS_DPI_AWARENESS value = Process_DPI_Unaware;
+       if (hInstSHCore){
+               if (!GetProcessDPIAwareness){
+                       GetProcessDPIAwareness = (FNGetProcessDPIAwareness)GetProcAddress(hInstSHCore, "GetProcessDpiAwareness");
+               }
+               if (GetProcessDPIAwareness){
+                       GetProcessDPIAwareness(hProcess, &value);
+                       DBW("DPIAware: value=%d", value);
+               }
+       }
+       if (value != Process_System_DPI_Aware){
+               int dpi_x = scale;
+               int dpi_y = scale;
+               DBW("dpi: %d,%d", dpi_x, dpi_y);
+               for (int i=0;i<num;i++){
+                       pts[i].x = MulDiv(pts[i].x, dpi_x, 96);
+                       pts[i].y = MulDiv(pts[i].y, dpi_y, 96);
+               }
+       }
+#else
+       HINSTANCE hInst = NULL;
+       FNGetProcessDPIAwareness GetProcessDPIAwareness = NULL;
+       //FNSetProcessDPIAwareness SetProcessDPIAwareness = NULL;
+       //if (!GetProcessDPIAwareness)
+       {
+               hInst = LoadLibrary("shcore.dll");
+               if (hInst){
+                       GetProcessDPIAwareness = (FNGetProcessDPIAwareness)GetProcAddress(hInst, "GetProcessDpiAwareness");
+                       //SetProcessDPIAwareness = (FNSetProcessDPIAwareness)GetProcAddress(hInst, "SetProcessDpiAwareness");
+                       //DBW("DPI API:%08X %08X", GetProcessDPIAwareness, SetProcessDPIAwareness);
+                       DBW("DPI API:%08X", GetProcessDPIAwareness);
+               }
+       }
+       if (GetProcessDPIAwareness || (ScaleX && ScaleY)){
+               int dpi_x, dpi_y;
+               PROCESS_DPI_AWARENESS value;
+               if (GetProcessDPIAwareness && hdc){
+                       HRESULT hRes = GetProcessDPIAwareness(hProcess, &value);
+                       DBW("DPIAware: value=%d", value);
+                       //SetProcessDPIAwareness(Process_System_DPI_Aware);
+                       dpi_x = GetDeviceCaps(hdc, LOGPIXELSX);
+                       dpi_y = GetDeviceCaps(hdc, LOGPIXELSY);
+                       DBW("dpi: %d, %d", dpi_x, dpi_y);
+               } else {
+                       dpi_x = ScaleX;
+                       dpi_y = ScaleY;
+               }
+               for (int i=0;i<num;i++){
+                       pts[i].x = MulDiv(pts[i].x, dpi_x, 96);
+                       pts[i].y = MulDiv(pts[i].y, dpi_y, 96);
+               }
+#if 0
+               if (SetProcessDPIAwareness){
+                       SetProcessDPIAwareness(value);
+               }
+#endif
+       }
+       if (hInst){
+               FreeLibrary(hInst);
+       }
+#endif
+#else  // \8b\8c\83R\81[\83h
+       HINSTANCE hInst = NULL;
+       if (!GetProcessDPIAwareness){
+               hInst = LoadLibrary("shcore.dll");
+               DBW("shcore=%08X", hInst);
+               if (hInst){
+                       GetProcessDPIAwareness = (FNGetProcessDPIAwareness)GetProcAddress(hInst, "GetProcessDPIAwareness");
+                       SetProcessDPIAwareness = (FNSetProcessDPIAwareness)GetProcAddress(hInst, "SetProcessDPIAwareness");
+                       DBW("DPI API:%08X %08X", GetProcessDPIAwareness, SetProcessDPIAwareness);
+               }
+       }
+       if (GetProcessDPIAwareness || (ScaleX && ScaleY)){
+               int dpi_x, dpi_y;
+               PROCESS_DPI_AWARENESS value;
+               if (GetProcessDPIAwareness && hdc){
+                       HRESULT hRes = GetProcessDPIAwareness(hProcess, &value);
+                       SetProcessDPIAwareness(Process_System_DPI_Aware);
+                       dpi_x = GetDeviceCaps(hdc, LOGPIXELSX);
+                       dpi_y = GetDeviceCaps(hdc, LOGPIXELSY);
+               } else {
+                       dpi_x = ScaleX;
+                       dpi_y = ScaleY;
+               }
+               for (int i=0;i<num;i++){
+                       pts[i].x = MulDiv(pts[i].x, dpi_x, 96);
+                       pts[i].y = MulDiv(pts[i].y, dpi_y, 96);
+               }
+               if (SetProcessDPIAwareness){
+                       SetProcessDPIAwareness(value);
+               }
+               if (hInst){
+                       FreeLibrary(hInst);
+               }
+       }
+#endif
+}
+
+int CALLBACK EnumMetaFileProc( HDC hdc, HANDLETABLE *ht, CONST ENHMETARECORD *mfr, int nobj, LPARAM /* user */ )
+{
+       PlayEnhMetaFileRecord( hdc, ht, mfr, nobj );
+
+       //DBW("iType=%d",mfr->iType);
+
+       switch ( mfr->iType ){
+               case EMR_EXTTEXTOUTA:
+               case EMR_EXTTEXTOUTW:
+               {
+                       EMREXTTEXTOUTW *emr = (EMREXTTEXTOUTW*)mfr;
+
+                       //DBW("(%d,%d) <%d=%d=%d=%d>", CursorPoint.x, CursorPoint.y, emr->rclBounds.left, emr->rclBounds.top,emr->rclBounds.right, emr->rclBounds.bottom);
+#if 1
+                       if ( PtInRect( (RECT*)&emr->rclBounds, CursorPoint ) ){
+                               DBW("(%d,%d) <%d=%d>", CursorPoint.x, CursorPoint.y, emr->rclBounds.left, emr->emrtext.ptlReference.x);
+#if 0
+                               {
+                               SIZE sz1, sz2;
+                               GetWindowExtEx( hdc, &sz1 );
+                               GetViewportExtEx( hdc, &sz2 );
+                               DBW("%d-%d %d-%d", sz1.cx, sz1.cy, sz2.cx, sz2.cy);
+                               }
+#endif
+                               int loc;
+                               if ( mfr->iType == EMR_EXTTEXTOUTW ){
+                                       //DBW("offString=%d nChars=%d left=%d top=%d offDx=%d", emr->emrtext.offString, emr->emrtext.nChars, emr->rclBounds.left, emr->rclBounds.top, emr->emrtext.offDx);
+                                       //DBW("text=%ws", (wchar_t*) ( ((char*)emr) + emr->emrtext.offString ));
+                                       loc = GetTextFromPoint( hdc, (wchar_t*) ( ((char*)emr) + emr->emrtext.offString ),
+                                               emr->emrtext.nChars,
+                                               CursorPoint.x - emr->rclBounds.left /* + emr->emrtext.ptlReference.x */,
+                                               CursorPoint.y - emr->rclBounds.top  /* + emr->emrtext.ptlReference.y */,
+                                               ((int*)(((char*)emr) + emr->emrtext.offDx)) );
+                               } else {
+                                       loc = GetTextFromPoint( hdc, ((char*)emr) + emr->emrtext.offString,
+                                               emr->emrtext.nChars,
+                                               CursorPoint.x - emr->rclBounds.left /* + emr->emrtext.ptlReference.x */,
+                                               CursorPoint.y - emr->rclBounds.top  /* + emr->emrtext.ptlReference.y */,
+                                               ((int*)(((char*)emr) + emr->emrtext.offDx)) );
+                               }
+                               if ( loc != -1 ){
+//                                     char *buf = NULL;
+                                       const char *text = ((char*)emr) + emr->emrtext.offString;
+                                       int len = emr->emrtext.nChars;
+                                       if ( mfr->iType == EMR_EXTTEXTOUTW ){
+                                               // WIDE
+                                               //DBW("len=%d loc=%d text=%ws", len, loc, text);
+                                               CallbackMain(DCH_HITTEXT2, text, len * sizeof(wchar_t), (HWND)loc);
+#if 0
+                                               // UNICODE->ANSI
+                                               // ANSI\8fã\82Å\82Ìloc\82ð\8b\81\82ß\82é\82½\82ß\81A\91O\94¼\82Æ\8cã\94¼\82ð\95ª\82¯\82Ä\95Ï\8a·
+                                               wchar_t *wp = (wchar_t*) ( ((char*)emr) + emr->emrtext.offString );
+                                               buf = new char[ emr->emrtext.nChars * 2 ];
+                                               memset( buf, 0, emr->emrtext.nChars*2 );
+                                               // \91O\94¼\95\94\95ª
+                                               len = 0;
+                                               if ( loc > 0 ){
+                                                       len = WideCharToMultiByte( CP_ACP, 0, wp, loc,
+                                                               buf, emr->emrtext.nChars * 2, NULL, NULL );
+                                               }
+                                               int newloc = len;
+                                               // \8cã\94¼\95\94\95ª
+                                               if ( emr->emrtext.nChars > (unsigned int)loc ){
+                                                       len += WideCharToMultiByte( CP_ACP, 0, wp+loc, emr->emrtext.nChars - loc,
+                                                               buf+len, emr->emrtext.nChars * 2 - len, NULL, NULL );
+                                               }
+                                               loc = newloc;
+                                               text = buf;
+#endif
+
+                                       } else {
+                                               // ANSI
+                                               CallbackMain(DCH_HITTEXT1, text, len, (HWND)loc);
+                                       }
+
+                                       DBW("Found@Enum");
+#if 0
+                                       CallbackMain(DCH_HITTEXT1, text, len, (HWND)loc);
+                                       if ( buf )
+                                               delete buf;
+#endif
+#if 0
+                                       {
+                                       char b[100];
+                                       sprintf(b,"exScale=%f eyScale=%f ptlReference=(%d,%d)",emr->exScale, emr->eyScale, emr->emrtext.ptlReference.x, emr->emrtext.ptlReference.y );
+                                       DBW(b);
+                                       DBW("iGraphicsMode=%d", emr->iGraphicsMode);
+                                       }
+#endif
+#if 0
+                                       {
+                                               for ( int i=0;i<(int)emr->emrtext.nChars;i++ ){
+                                                       DBW(">%d", ((int*)(((char*)emr) + emr->emrtext.offDx))[i] );
+                                               }
+                                       }
+#endif
+//                                     DBW("[%d %d][%d %d]text=(%s)", emr->rclBounds.left, emr->rclBounds.top, CursorPoint.x, CursorPoint.y, text);
+//                                     result = false; // stop enumration      // \8d\82\91¬\89»\82Ì\82½\82ß\93r\92\86\82Å\8fI\82í\82è\82É\82µ\82½\82¢\82ª\81E\81E\81E\82Ç\82¤\82µ\82æ\82¤\81H
+#if METAEXTTEXTOUT
+                                       // prevent to get from ExtTextOut hook
+                                       FoundLocA = -1;
+                                       FoundLocW = -1;
+#endif
+                                       HitFound = true;
+                               }
+                       }
+#else  // for debug
+                       if ( mfr->iType == EMR_EXTTEXTOUTW ){
+                               CallbackMain(DCH_EXTTEXTOUTW, emr, sizeof(EMREXTTEXTOUTW) + emr->emrtext.nChars * sizeof(wchar_t), (HWND)hdc);
+                       } else {
+                               CallbackMain(DCH_EXTTEXTOUTA, emr, sizeof(EMREXTTEXTOUTA) + emr->emrtext.nChars, (HWND)hdc);
+                       }
+#endif
+               }
+                       break;
+       }
+       return true;
+}
+
+}      // extern "C"
+
+// 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·
+int GetTextFromPoint( HDC hdc, const char *text, int len, int pos_x, int pos_y, const int *dx )
+{
+       if ( pos_x < 0 || pos_y < 0 ) return -1;
+
+       int count = 0;
+       SIZE sz;
+       int *rdx = NULL;
+       if ( dx ){
+               rdx = new int[len];
+               memset( rdx, 0, len*sizeof(int) );
+       }
+       if ( !GetTextExtentExPointA( hdc, text, len, pos_x, &count, rdx, &sz ) ){
+               DBW("GetTextExtentExPointA Failure!!");
+               if ( rdx )
+                       delete rdx;
+               return -1;
+       }
+#if METAEXTTEXTOUT
+       LastX += sz.cx; // update
+#endif
+       // size over check
+       if ( pos_y > sz.cy
+               || pos_x > sz.cx
+               ){
+               if ( rdx ) delete rdx;
+               return -1;
+       }
+       DBW("A:len=%d pos_x=%d sz.cx=%d", len, pos_x, sz.cx);
+       if ( dx && count > 0 ){
+               // ex.
+               // Win98,Notepad\82Ì\93ú\96{\8cê\8fã\82Å
+               //  dx = 0, 8, 0, 8, 0, 8, ...
+               // rdx = 9,10, 9,10, 9,10, ...
+#if 0
+               {
+                       int i;
+                       for ( i=0;i<len;i++ ){
+                               DBW(" dx[%2d]=%d",i,dx[i]);
+                       }
+                       for ( i=0;i<count;i++ ){
+                               DBW("rdx[%2d]=%d",i,rdx[i+1]-rdx[i]);
+                       }
+               }
+#endif
+               // spacing\82Ì\8cë\8d·\82ð\8cv\8eZ
+               // Times New Roman\82È\82Ç\82Å\92²\82×\82é\82Æ\82©\82È\82è\82Ì\8cë\8d·\82ª\82 \82é\81B\82È\82º\81H
+
+               int i = 0;
+               int j = 0;
+               int sumdx = 0;
+//             DBW("rd(x)[0]=%d,%d",dx[0],rdx[0]);
+               if ( rdx[0] ){
+                       if ( dx[0] ){
+                               sumdx = dx[0] - rdx[0];
+                       } else {
+                               sumdx = dx[1] - rdx[0];
+                       }
+                       i++;
+                       j++;
+               }
+               for ( ;i<count;i++,j++ ){
+#if 0
+                       if ( rdx[i] == rdx[i-1] ){ j--; continue;}      // for multi-bytes font
+                                                                                                               //*++ \82 \82Æ\82Å ExtTextOut API manual\82ð\8eQ\8fÆ
+                       sumdx += dx[j] - (rdx[i]-rdx[i-1]);
+//                     DBW("%3d <> %3d", dx[j], rdx[i]-rdx[i-1]);
+#else  // Win98\82Å\82Í\81Amulti-byte\82Å\82à\95ª\8eU\82³\82¹\82Ä\82¢\82é\8fê\8d\87\82ª\82 \82é\82½\82ß\81Adx\82Å\94»\92f
+                       sumdx += (dx[j]?dx[j]:dx[j+1]) - (rdx[i]-rdx[i-1]);
+#endif
+               }
+//             DBW("sumdx=%d",sumdx);
+               if ( !GetTextExtentExPointA( hdc, text, len, pos_x - sumdx, &count, rdx, &sz ) ){
+                       if ( rdx )
+                               delete rdx;
+                       return -1;
+               }
+       }
+       if ( rdx )
+               delete rdx;
+       return count;
+}
+int GetTextFromPoint( HDC hdc, const wchar_t *text, int len, int pos_x, int pos_y, const int *dx )
+{
+#if USE_VXD
+       if (WindowsNT)
+#endif
+       {
+               if ( pos_x < 0 || pos_y < 0 ) return -1;
+
+               int count = 0;
+               SIZE sz;
+               int *rdx = NULL;
+               if ( dx ){
+                       rdx = new int[ len ];
+                       memset( rdx, 0, len );
+               }
+               if ( !GetTextExtentExPointW( hdc, text, len, pos_x, &count, rdx, &sz ) )
+               {
+                       DBW("GetTextExtentExPointW Failure!!");
+                       if ( rdx )
+                               delete[] rdx;
+                       return -1;
+               }
+#if METAEXTTEXTOUT
+               LastX += sz.cx;
+#endif
+               // size over check
+               if ( pos_y > sz.cy
+                       || pos_x > sz.cx
+                       ){
+                       if ( rdx ) delete[] rdx;
+                       return -1;
+               }
+               DBW("W:len=%d pos_x=%d sz.cx=%d", len, pos_x, sz.cx);
+               if ( dx && count > 0 ){
+                       // spacing\82Ì\8cë\8d·\82ð\8cv\8eZ
+                       // Times New Roman\82È\82Ç\82Å\92²\82×\82é\82Æ\82©\82È\82è\82Ì\8cë\8d·\82ª\82 \82é\81B\82È\82º\81H
+                       int i = 0;
+                       int j = 0;
+                       int sumdx = 0;
+       //              DBW("rd(x)[0]=%d,%d",dx[0],rdx[0]);
+                       if ( rdx[0] ){
+                               sumdx = dx[0] - rdx[0];
+                               i++;
+                               j++;
+                       }
+                       for ( ;i<count-1;i++,j++ ){
+#if 0
+                               if ( rdx[i] == rdx[i-1] ){ j--; continue;}      // for multi-bytes font
+                                                                                                               //*++ \82 \82Æ\82Å ExtTextOut API manual\82ð\8eQ\8fÆ
+                               sumdx += dx[j] - (rdx[i]-rdx[i-1]);
+       //                      DBW("%3d <> %3d", dx[j], rdx[i]-rdx[i-1]);
+#else
+                               sumdx += (dx[j]?dx[j]:dx[j+1]) - (rdx[i]-rdx[i-1]);
+#endif
+                       }
+       //              DBW("sumdx=%d",sumdx);
+                       if ( !GetTextExtentExPointW( hdc, text, len, pos_x - sumdx, &count, rdx, &sz ) ){
+                               if ( rdx )
+                                       delete rdx;
+                               return -1;
+                       }
+               }
+               if ( rdx )
+                       delete rdx;
+               return (count == len && sz.cx < pos_x) ? -1 : count;
+       }
+#if USE_VXD
+       else {
+               char *buf = new char[ len * sizeof(wchar_t) ];
+               memset( buf, 0, len * sizeof(wchar_t) );
+               int ansilen = WideCharToMultiByte( CP_ACP, 0, text, len, buf, len*sizeof(wchar_t), NULL, NULL );
+               int r = GetTextFromPoint( hdc, buf, ansilen, pos_x, pos_y, dx );
+               delete buf;
+               return r;
+       }
+#endif
+}
+
+#define        WMCD_EXISTCHECK         0x4000
+#define        WMCD_SETPOINT           0x4001
+
+class TDC {
+       HDC hdc;
+       HWND hwnd;
+public:
+       TDC()
+       :hwnd(NULL)
+       {
+               hdc = GetDC(NULL);
+       }
+       TDC(HWND _hwnd)
+       :hwnd(_hwnd)
+       {
+               hdc = GetWindowDC(hwnd);
+       }
+       ~TDC()
+       {
+               reset();
+       }
+       void reset()
+       {
+               if (hdc){
+                       ReleaseDC(hwnd, hdc);
+                       hdc = NULL;
+               }
+       }
+       operator HDC() { return hdc; }
+       bool operator !() { return hdc==NULL; }
+};
+
+bool CaptureImage(HWND hwnd, bool movesend, bool non_block)
+{
+       MoveSendMode = movesend;
+       CaptureImageBlocking = false;
+
+       bool capture_page = false;
+       if (hwndAMODI){
+               capture_page = SendMessage(hwndAMODI, WM_AMODI, AMODI_CMD_PAGE_CAPTURE, 0) ? true : false;
+       }
+
+       // Get the rect of the target window.
+       RECT rcTarget;
+       if (!GetWindowRect(hwnd, &rcTarget)){
+               // window died?
+               return false;
+       }
+       if (!ExtAMODI){
+               if (!IsWindowEnabled(hwndAMODI)){
+                       // AMODI died?
+                       hwndAMODI = FindAMODI();
+                       if (!hwndAMODI)
+                               return false;
+               }
+       }
+       int w = rcTarget.right - rcTarget.left;
+       int h = rcTarget.bottom - rcTarget.top;
+       if (w==0 || h==0){
+               return false;   // no area in the target.
+       }
+
+       POINT ptCursor; // \89æ\91\9c\8fã\82Ì\83J\81[\83\\83\8b\88Ê\92u
+       int x, y;
+       if (capture_page){
+               x = rcTarget.left;
+               y = rcTarget.top;
+               ptCursor.x = ScreenPoint.x - rcTarget.left;
+               ptCursor.y = ScreenPoint.y - rcTarget.top;
+       } else {
+               // x\95û\8cü : target rect\82Ì\8d\92[\82©\82ç
+               // y\95û\8cü : cursor point\82Ì\8fã\89º100 pixel
+               x = rcTarget.left;
+               int offs = 100;
+               if (ScreenPoint.y - rcTarget.top < offs){
+                       if (ScreenPoint.y < rcTarget.top) return false; // click on out of rect?
+                       y = rcTarget.top;
+                       h = ScreenPoint.y - rcTarget.top + offs;
+               } else {
+                       y = ScreenPoint.y - offs;
+                       h = offs * 2;
+               }
+               if (y+h>rcTarget.bottom){
+                       h = rcTarget.bottom - y;
+               }
+               ptCursor.x = ScreenPoint.x - rcTarget.left;
+               ptCursor.y = ScreenPoint.y - y;
+       }
+
+       if (0){
+               HWND hwnd = GetDesktopWindow();
+               RECT rc;
+               GetWindowRect(hwnd, &rc);
+               x = 0;
+               y = 0;
+               w = rc.right - rc.left;
+               h = rc.bottom - rc.top;
+       }
+
+       if (!capture_page){
+               // Notify start enumrate
+               CallbackMain(DCH_START, &CursorPoint, sizeof(CursorPoint), hwnd);
+       }
+
+       bool ok = false;
+
+       TDC hdc;
+
+       if (!hdc){
+               goto jend;
+       }
+
+#if USE_SCALING
+       POINT pts[3];
+       pts[0].x = x;
+       pts[0].y = y;
+       pts[1].x = w;
+       pts[1].y = h;
+       pts[2].x = ptCursor.x;
+       pts[2].y = ptCursor.y;
+       DoScale(hdc, pts, 3);
+       //DBW("%d,%d %d,%d,%d,%d -> %d,%d %d,%d,%d,%d", ptCursor.x, ptCursor.y, x, y, w, h, pts[2].x, pts[2].y, pts[0].x, pts[0].y, pts[1].x, pts[1].y);
+       x = pts[0].x;
+       y = pts[0].y;
+       w = pts[1].x;
+       h = pts[1].y;
+       ptCursor.x = pts[2].x;
+       ptCursor.y = pts[2].y;
+#endif
+
+       // capture image
+
+       int wlen = (w*3+3)&~3;
+
+       /* \8f\91\82«\8d\9e\82Ý\97p\83o\83b\83t\83@\82Ì\83T\83C\83Y\8cv\8eZ */
+       DWORD dwFSize = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER) + wlen * h;
+
+       /* \83o\83b\83t\83@\8am\95Û\82Æ\83|\83C\83\93\83^\90Ý\92è */
+       LPBYTE lpBuf = (LPBYTE)new char[dwFSize];
+       if (!lpBuf){
+               goto jend;
+       }
+
+       LPBITMAPFILEHEADER lpHead = (LPBITMAPFILEHEADER)lpBuf;
+       LPBITMAPINFOHEADER lpInfo = (LPBITMAPINFOHEADER)(lpBuf+sizeof(BITMAPFILEHEADER));
+       LPBYTE lpPixel = lpBuf+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
+
+       /* 24\83r\83b\83gBMP\83t\83@\83C\83\8b\82Ì\83w\83b\83_\8dì\90¬ */
+       lpHead->bfType = ('M'<<8) +'B';
+       lpHead->bfSize = dwFSize;
+       lpHead->bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
+       lpInfo->biSize = sizeof(BITMAPINFOHEADER);
+       lpInfo->biWidth = w;
+       lpInfo->biHeight = h;
+       lpInfo->biPlanes = 1;
+       lpInfo->biBitCount = 24;
+
+       HBITMAP hBmp = CreateCompatibleBitmap(hdc, w, h);
+       if (hBmp){
+               HDC hdcMem = CreateCompatibleDC(hdc);
+               if (hdcMem){
+                       HDC hOld = (HDC)SelectObject(hdcMem, hBmp);
+                       if (hOld!=(HDC)GDI_ERROR){
+                               BOOL r = BitBlt(hdcMem, 0, 0, w, h, hdc, x, y, SRCCOPY);
+                               SelectObject(hdcMem, hOld);
+                               if (r){
+//                                     int lines = GetDIBits(hdc, hBmp, 0, h, NULL, (LPBITMAPINFO)lpInfo, DIB_RGB_COLORS);
+                                       int lines = GetDIBits(hdc, hBmp, 0, h, lpPixel, (LPBITMAPINFO)lpInfo, DIB_RGB_COLORS);
+                                       if (lines!=0){
+                                               ok = true;
+                                       } else {
+                                               dbw("GetDIBits error??? %d h=%d w=%d bfSize=%d", GetLastError(), h, w, dwFSize);
+                                       }
+                               } else {
+//                                             dbw("BitBlt error??? %d", GetLastError());
+                               }
+                       }
+                       DeleteObject(hdcMem);
+               }
+               DeleteObject(hBmp);
+       }
+
+       hdc.reset();
+
+       if (ok){
+               ok = false;
+
+               //TCHAR path[sizeof(AMODIPath)+40];
+               TCHAR *path = ImageTextPath;
+               size_t path_size = sizeof(ImageTextPath);
+               size_t len;
+               if (ExtAMODI){
+                       len = _tcslen(AMODIPath);
+                       _tcscpy(path, AMODIPath);
+               } else {
+                       memset(path, 0, path_size);
+                       len = GetTempPath((DWORD)path_size, path);
+               }
+               if (len>0){
+                       // send image to AMODI
+                       SYSTEMTIME t;
+                       GetLocalTime(&t);
+                       if (ExtAMODI){
+                               wsprintf(path+len, /*path_size-len,*/ _T("\\%04d-%02d-%02d-%02d%02d%02d-(%d,%d).bmp"),
+                                       t.wYear, t.wMonth, t.wDay, t.wHour, t.wMinute, t.wSecond, ptCursor.x, ptCursor.y);
+                       } else {
+                               wsprintf(path+len, /*path_size-len,*/ _T("\\amodi\\%04d-%02d-%02d-%02d%02d%02d.bmp"),
+                                       t.wYear, t.wMonth, t.wDay, t.wHour, t.wMinute, t.wSecond);
+                               SendAMODI(WMCD_SETPOINT, (char*)&ptCursor, sizeof(ptCursor));
+                       }
+                       HANDLE fh = CreateFile(path,  GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
+                       if (fh!=INVALID_HANDLE_VALUE){
+                               DWORD dwSize;
+                               WriteFile(fh, lpBuf, dwFSize, &dwSize, NULL);
+                               CloseHandle(fh);
+                               SaveImageTime = GetTickCount();
+
+                               if (capture_page){
+                                       ok = true;
+                               } else {
+                                       len = (int)_tcslen(path);
+                                       _tcsncat(path+len, _T(".txt"), path_size-len);
+                                       if (non_block){
+                                               CaptureImageBlocking = true;
+                                       } else {
+                                               if (WaitAndGetResult(path, 3000))
+                                                       ok = true;
+                                       }
+                               }
+                       }
+               }
+       }
+       delete[] lpBuf;
+
+jend:
+       if (!CaptureImageBlocking){
+               if (!capture_page){
+                       CallbackMain(DCH_END | (MoveSendMode ? DCH_MOVESEND : 0), NULL, 0, hwnd );
+               }
+       }
+
+       return ok;
+}
+
+bool WaitAndGetResult(const TCHAR *path, unsigned waittime)
+{
+       bool ok = false;
+
+       // wait and get text from AMODI
+
+       HANDLE fh = WaitForResult(path, waittime);
+
+       CaptureImageBlocking = false;
+
+       if (fh==INVALID_HANDLE_VALUE){
+               DBW("file open timeout");
+               CheckAMODIAlive();
+       } else {
+               DWORD size = GetFileSize(fh, NULL);
+               if (size>0){
+                       unsigned bufsize = size+sizeof(wchar_t);
+                       char *text = new char[bufsize];
+                       if (text){
+                               DWORD rbyte;
+                               if (ReadFile(fh, text, size, &rbyte, NULL)){
+                                       if (rbyte==size){
+                                               *(wchar_t*)&text[size] = '\0';
+                                               // text\82Ì\82P\8ds\96Ú\82Í\89ð\90Í\8fî\95ñ
+                                               // format
+                                               // (\83}\83E\83X\83J\81[\83\\83\8b\82Ì\82 \82é\83e\83L\83X\83g\88Ê\92u[\95\8e\9a\96Ú zero-index])
+                                               int loc = 0;
+                                               int col = 0;
+                                               wchar_t *p = (wchar_t*)text;
+                                               while (*p){
+                                                       wchar_t c = *p++;
+                                                       if (c=='\n'){
+                                                               break;
+                                                       }
+                                                       if (col==0){
+                                                               loc = _wtoi(p);
+                                                               col++;
+                                                       }
+                                               }
+
+                                               DBW("%d:%ws", loc, p);
+                                               CallbackMain(DCH_HITTEXT2, p, bufsize - (int)((char*)p-text), (HWND)loc);
+
+                                               ok = true;
+                                       }
+                               }
+                               delete[] text;
+                       }
+               }
+               CloseHandle(fh);
+               DeleteFile(path);
+       }
+       CallbackMain(DCH_END | (MoveSendMode ? DCH_MOVESEND : 0), NULL, 0, NULL );
+       return ok;
+}
+
+HANDLE WaitForResult(const TCHAR *path, unsigned waittime)
+{
+       HANDLE fh = INVALID_HANDLE_VALUE;
+
+       while (1){
+               fh = CreateFile(path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+               if (fh!=INVALID_HANDLE_VALUE)
+                       break;
+
+               DWORD now = GetTickCount();
+               if (now-SaveImageTime > waittime)
+                       break;
+
+               Sleep(10);
+       }
+
+       return fh;
+}
+
+#define        APPNAME _T("Auto MODI")
+
+static HWND hwndFind;
+static BOOL CALLBACK EnumWindowsProc( HWND hwnd, LPARAM lParam )
+{
+       TCHAR wndname[80];
+       if (GetWindowText(hwnd, wndname, tsizeof(wndname))<0){
+               return TRUE;
+       }
+       if (_tcscmp(wndname, APPNAME)){ return TRUE; }
+
+       COPYDATASTRUCT cd;
+       cd.dwData = WMCD_EXISTCHECK;
+       cd.lpData = (void*)APPNAME;
+       cd.cbData = (DWORD)(_tcslen(APPNAME)+1)*sizeof(TCHAR);
+       if ( SendMessage( hwnd, WM_COPYDATA, 0, (LPARAM)&cd ) )
+       {
+               // found
+               hwndFind = hwnd;
+               return FALSE;
+       }
+       return TRUE;
+}
+
+HWND FindAMODI()
+{
+       hwndFind = NULL;
+       EnumWindows(EnumWindowsProc, 0);
+       return hwndFind;
+}
+
+int SendAMODI(int cmd, const char *data, int len)
+{
+       COPYDATASTRUCT cd;
+       cd.dwData = cmd;
+       cd.lpData = (void*)data;
+       cd.cbData = len;
+       return (int)SendMessage(hwndAMODI, WM_COPYDATA, 0, (LPARAM)&cd);
+}
+
+void CheckAMODIAlive()
+{
+       CallbackMain(DCH_LAUNCH_AMODI, NULL, 0, 0);
+}
+
+void SendMoveMessage()
+{
+#if MOVESEND_POST
+       PostMessage(hwndCallback, WM_MOVESEND, MouseMoving ? 0 : -1, 0);
+#else
+//     CallbackMain(DCH_MOVESEND, pt, sizeof(*pt), 0);
+       MouseMoving = true;
+       if (SendMoveEvent) SetEvent(SendMoveEvent);
+#endif
+}
+void SendCancelMove()
+{
+#if MOVESEND_POST
+       PostMessage(hwndCallback, WM_MOVESEND, MouseMoving ? 0 : -1, 0);
+#else
+//     CallbackMain(DCH_MOVESEND, NULL, 0, (HWND)-1);
+       MouseMoving = false;
+       if (SendMoveEvent) SetEvent(SendMoveEvent);
+#endif
+}
+
+#if !MOVESEND_POST
+// main program\82ÌWindows message\8f\88\97\9d\82ª\8fd\82¢\82Æ\81ACalblackMain\82à\8fd\82­\82È\82é\82½\82ß\81A
+// mouse move\82Í\95Êthread\82Å\8f\88\97\9d
+DWORD WINAPI SendMoveThread(LPVOID vdParam)
+{
+       while(1){
+               if (WaitForSingleObject(SendMoveEvent, INFINITE) != WAIT_OBJECT_0){
+                       break;
+               }
+               CallbackMain(DCH_MOVESEND, NULL, 0, (HWND)(MouseMoving ? 0 : -1));
+       }
+       return 0;
+}
+#endif
+
+#if EXC_WOW64 && defined(_M_X64)
+void CheckWOW64()
+{
+       typedef BOOL (WINAPI *FNIsWow64Process)(HANDLE hProcess, PBOOL Wow64Process);
+
+       FNIsWow64Process _IsWow64Process = (FNIsWow64Process)GetProcAddress(GetModuleHandle("kernel32"),"IsWow64Process");
+       if (_IsWow64Process){
+               BOOL flag = FALSE;
+               if (_IsWow64Process(hProcess, &flag)){
+                       fWow64 = int_bool(flag);
+               }
+       }
+}
+#endif
+
+bool EnablePrivilege(LPTSTR lpszPrivilege, bool bEnable)
+{
+       BOOL             bResult;
+       LUID             luid;
+       HANDLE           hToken;
+       TOKEN_PRIVILEGES tokenPrivileges;
+
+       if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
+               return false;
+       
+       if (!LookupPrivilegeValue(NULL, lpszPrivilege, &luid)) {
+               CloseHandle(hToken);
+               return false;
+       }
+
+       tokenPrivileges.PrivilegeCount           = 1;
+       tokenPrivileges.Privileges[0].Luid       = luid;
+       tokenPrivileges.Privileges[0].Attributes = bEnable ? SE_PRIVILEGE_ENABLED : 0;
+       
+       bResult = AdjustTokenPrivileges(hToken, FALSE, &tokenPrivileges, sizeof(TOKEN_PRIVILEGES), NULL, NULL);
+       
+       CloseHandle(hToken);
+
+       return bResult && GetLastError() == ERROR_SUCCESS;
+}
+
+/*======================================================================//
+//     DllMain
+//----------------------------------------------------------------------//
+// Description:
+//
+// Arguments:
+//
+// Return Value:
+//
+//======================================================================*/
+#ifdef _MSC_VER
+BOOL WINAPI DllMain(HINSTANCE hInst, DWORD reason, LPVOID )
+#else
+int WINAPI DllEntryPoint(HINSTANCE hInst, DWORD reason, LPVOID)
+#endif
+{
+       switch ( reason ){
+               case DLL_PROCESS_ATTACH:
+                       hInstance = hInst;
+                       idProcess = GetCurrentProcessId();
+                       for (int i=0;i<2;i++){
+                               hProcess = OpenProcess( PROCESS_ALL_ACCESS|PROCESS_VM_WRITE|PROCESS_VM_OPERATION, TRUE, idProcess );
+                               if ( hProcess ){
+#if USE_DBW
+                                       DBW("Attach %d(%08X)-%d : %08X", idProcess, hProcess, attach++,_ExtTextOutA);
+#endif
+                                       break;
+                               } else {
+                                       DBW("OpenProcess Error: %08X %d", idProcess, GetLastError());
+                                       if (i==0){
+                                               if (!EnablePrivilege(SE_DEBUG_NAME, true)) {
+                                                       break;  // failed
+                                               }
+                                       }
+                               }
+                       }
+#if EXC_WOW64 && defined(_M_X64)
+                       CheckWOW64();
+#ifdef _WIN64
+                       if (fWow64){
+                               DBW("WOW64 true");
+                               return FALSE;
+                       }
+#else
+                       if (!fWow64){
+                               DBW("WOW64 false");
+                               return FALSE;
+                       }
+#endif
+                       DBW("fWow64=%d", fWow64);
+#endif
+                       if (siPageSize==0){
+                               SYSTEM_INFO si;
+                               GetSystemInfo( &si );
+                               siPageSize = si.dwPageSize;
+                       }
+                       hInstSHCore = LoadLibrary(_T("shcore.dll"));
+#if !MOVESEND_POST
+                       SendMoveEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
+                       CreateThread(NULL , 0 , SendMoveThread , NULL , 0 , &SendMoveThreadId);
+#endif
+                       break;
+               case DLL_PROCESS_DETACH:
+//                     UNPROTECT_SHARE();
+#if !MOVESEND_POST
+                       if (SendMoveEvent){
+                               CloseHandle(SendMoveEvent);
+                               SendMoveEvent = NULL;
+                       }
+#endif
+                       if (hInstSHCore){
+                               FreeLibrary(hInstSHCore);
+                               hInstSHCore = NULL;
+                       }
+#if USE_DBW
+                       DBW("Detach %d-%d", GetCurrentProcessId(),--attach);
+#endif
+                       if ( hProcess ){
+                               CloseHandle( hProcess );
+                       }
+                       break;
+       }
+       return TRUE;
+}
+//---------------------------------------------------------------------------
+static HWND hWin = NULL;
+static const char *clsname = "TDbgMsgForm";
+static const char *winname = "Debug Messenger";
+void dbw( const char *format, ... )
+{
+       if ( !hWin ){
+               hWin = FindWindowA( clsname, winname );
+               if ( !hWin ) return;
+       }
+       va_list ap;
+       va_start( ap, format );
+       char buf[ 2048 ];
+#ifdef _WIN64
+       strcpy(buf, "x64:");
+       wvsprintfA( buf+4, format, ap );
+#else
+       wvsprintfA( buf, format, ap );
+#endif
+       COPYDATASTRUCT cds;
+       cds.dwData = 1; // Indicate String
+       cds.cbData = (DWORD)strlen(buf);
+       cds.lpData = buf;
+       SendMessage( hWin, WM_COPYDATA, NULL, (LPARAM)&cds );
+       va_end( ap );
+}
diff --git a/DCHook/DCHook.def b/DCHook/DCHook.def
new file mode 100644 (file)
index 0000000..85ca43d
--- /dev/null
@@ -0,0 +1,16 @@
+LIBRARY         DCHOOK
+DESCRIPTION     'DC hook for event hot keys'
+
+SECTIONS
+       .sdata          READ WRITE SHARED
+       .sbss           READ WRITE SHARED
+       .stext          READ SHARED
+
+EXPORTS
+       Config  @1
+       Init    @2
+       Uninit  @3
+       Config2 @4
+       Capture @5
+       WaitForCaptureResult @6
+
diff --git a/DCHook/DCHook.h b/DCHook/DCHook.h
new file mode 100644 (file)
index 0000000..d19877b
--- /dev/null
@@ -0,0 +1,67 @@
+#ifndef __DCHOOK_H
+#define        __DCHOOK_H
+
+struct TDCHConfig {
+       int UseAMODI : 1;
+       int OnlyAMODI : 1;
+       int MoveSend : 1;
+       int OnlyImage : 1;
+       int ScaleX;
+       int ScaleY;
+       char AMODIPath[_MAX_PATH];
+};
+
+extern "C" {
+
+__declspec(dllexport) bool WINAPI Init( HWND, const char *module_name, bool windowsnt, const char *vxd_path );
+__declspec(dllexport) void WINAPI Uninit();
+__declspec(dllexport) unsigned int WINAPI Debug();
+
+typedef bool (WINAPI *FNDCHInit)( HWND, const char *module_name, bool windowsnt, const char *vxd_path );
+typedef void (WINAPI *FNDCHUninit)();
+typedef int (WINAPI *FNDCHConfig)( int clickonly, int keyaction, int keyflag );
+typedef int (WINAPI *FNDCHConfig2)( struct TDCHConfig *cfg );
+typedef int (WINAPI *FNDCHCapture)( HWND hwnd, POINT *pt, bool movesend, bool non_block );
+typedef int (WINAPI *FNDCHWaitForCaptureResult)( bool send_text, unsigned waittime );
+typedef unsigned int (WINAPI *FNDebug)();
+
+}
+
+/* WM_COPYSTRUCT message */
+#define        DCH_START               0x1000
+#define        DCH_END                 0x1001
+#define        DCH_EXTTEXTOUTA 0x1002
+#define        DCH_EXTTEXTOUTW 0x1003
+#define        DCH_HITTEXT1    0x1010
+#define        DCH_HITTEXT2    0x1011  // UNICODE\82Ì\82Ý(DCH_HITTEXT2\82Ì\82 \82Æ\81ADCH_HITTEXT3\82ª\82­\82é)
+#define        DCH_HITTEXT3    0x1012  // ANSI\82Ì\82Ý
+// UNICODE\82Å\88µ\82¢\82½\82¢\8fê\8d\87\82Í\81ADCH_HITTEXT2\82ÆDCH_HITTEXT3\82ð\8eg\97p\82·\82é
+// UNICODE\82Å\88µ\82¢\82½\82­\82È\82¢\8fê\8d\87(UNICODE->ANSI\95Ï\8a·\82ð\95K\97v\82Æ\82·\82é\8fê\8d\87)\82Í\81ADCH_HITTEXT1\82Ì\82Ý\82ð\8eg\97p\82·\82é
+#define        DCH_MOVESEND    0x0200  // DCH_END\82Æ\82Ì\91g\82Ý\8d\87\82í\82¹ or \92P\91Ì
+
+#define        DCH_MENU                0x1100  // DokoPop Menu
+#define        DCH_TOGGLE              0x1101  // Toggle Click Only
+#define        DCH_LAUNCH_AMODI 0x1102 // Launch AMODI if not alive
+
+/* Do not use 0x12xx!! */
+
+/* Key Definitions */
+#define        KA_POPUP                1
+#define        KA_MENU                 2
+#define        KA_TOGGLE               3
+#define        KA_POPUP_NC             0x10
+
+#define        KF_SHIFT                0x01
+#define        KF_CONTROL              0x02
+#define        KF_MENU                 0x04
+#define        KF_LWIN                 0x08
+#define        KF_RWIN                 0x10
+#define        KF_APPS                 0x20
+#define        KF_LEFTCLICK    0x40
+#define        KF_CLICKONLY    0x80
+#define        KF_LRCLICK              0x100
+#define        KF_MIDCLICK             0x200
+
+
+#endif // __DCHOOK_H
+
diff --git a/DCHook/DCHook.mak b/DCHook/DCHook.mak
new file mode 100644 (file)
index 0000000..72f5799
--- /dev/null
@@ -0,0 +1,100 @@
+# Microsoft Developer Studio Generated NMAKE File, Based on DCHook.dsp
+
+!IF "$(OS)" == "Windows_NT"
+NULL=
+!ELSE 
+NULL=nul
+!ENDIF 
+
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+OUTDIR=.
+INTDIR=.
+# Begin Custom Macros
+OutDir=.\.
+# End Custom Macros
+
+
+ALL : "$(OUTDIR)\DCHook.dll"
+
+
+
+CLEAN :
+       -@erase "$(INTDIR)\dchook.res"
+       -@erase "$(INTDIR)\dchook.obj"
+       -@erase "$(INTDIR)\dchook.sbr"
+       -@erase "$(OUTDIR)\DCHook.dll"
+       -@erase "$(OUTDIR)\DCHook.exp"
+       -@erase "$(OUTDIR)\DCHook.lib"
+       -@erase "$(OUTDIR)\DCHook.map"
+
+"$(OUTDIR)" :
+    if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP_PROJ=/nologo /ML /W4 /GX /G4 /GA /O1 /I "$(MSAADEV)\inc32" /D "WIN32" /D "NDEBUG"\
+ /D "_WINDOWS" /FR"$(INTDIR)\\" /Fp"$(INTDIR)\DCHook.pch" /YX /Fo"$(INTDIR)\\"\
+ /Fd"$(INTDIR)\\" /FD /c 
+CPP_OBJS=./
+CPP_SBRS=./
+MTL_PROJ=/nologo /I "$(MSAADEV)\inc32" /D "NDEBUG" /mktyplib203 /win32 
+RSC_PROJ=/l 0x409 /fo"$(INTDIR)\dchook.res" /i "$(MSAADEV)\inc32" /d "NDEBUG" 
+
+LINK32=link.exe
+LINK32_FLAGS=user32.lib kernel32.lib gdi32.lib advapi32.lib \
+ /nologo /subsystem:windows /dll /incremental:no\
+ /pdb:"$(OUTDIR)\DCHook.pdb" /map:"$(INTDIR)\DCHook.map" /machine:I386\
+ /def:".\dchook.def" /out:"$(OUTDIR)\DCHook.dll"\
+ /implib:"$(OUTDIR)\DCHook.lib" /libpath:"$(MSAADEV)\lib" 
+DEF_FILE= \
+       ".\dchook.def"
+LINK32_OBJS= \
+       "$(INTDIR)\dchook.res" \
+       "$(INTDIR)\dchook.obj"
+
+"$(OUTDIR)\DCHook.dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+    $(LINK32) @<<
+  $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+.c{$(CPP_OBJS)}.obj::
+   $(CPP) @<<
+   $(CPP_PROJ) $< 
+<<
+
+.cpp{$(CPP_OBJS)}.obj::
+   $(CPP) @<<
+   $(CPP_PROJ) $< 
+<<
+
+.cxx{$(CPP_OBJS)}.obj::
+   $(CPP) @<<
+   $(CPP_PROJ) $< 
+<<
+
+.c{$(CPP_SBRS)}.sbr::
+   $(CPP) @<<
+   $(CPP_PROJ) $< 
+<<
+
+.cpp{$(CPP_SBRS)}.sbr::
+   $(CPP) @<<
+   $(CPP_PROJ) $< 
+<<
+
+.cxx{$(CPP_SBRS)}.sbr::
+   $(CPP) @<<
+   $(CPP_PROJ) $< 
+<<
+
+SOURCE=.\dchook.rc
+
+"$(INTDIR)\dchook.res" : $(SOURCE) "$(INTDIR)"
+       $(RSC) $(RSC_PROJ) $(SOURCE)
+
+SOURCE=.\dchook.cpp
+DEP_CPP_KEYS_= "DCHook.h"
+
+"$(INTDIR)\dchook.obj" : $(SOURCE) $(DEP_CPP_KEYS_) "$(INTDIR)"
+
diff --git a/DCHook/DCHook.sln b/DCHook/DCHook.sln
new file mode 100644 (file)
index 0000000..e8518fa
--- /dev/null
@@ -0,0 +1,25 @@
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DCHook", "DCHook.vcxproj", "{8C65CE15-64F8-43E6-968D-DBBB96858BB2}"
+EndProject
+Global
+       GlobalSection(SolutionConfigurationPlatforms) = preSolution
+               Debug|Win32 = Debug|Win32
+               Debug|x64 = Debug|x64
+               Release|Win32 = Release|Win32
+               Release|x64 = Release|x64
+       EndGlobalSection
+       GlobalSection(ProjectConfigurationPlatforms) = postSolution
+               {8C65CE15-64F8-43E6-968D-DBBB96858BB2}.Debug|Win32.ActiveCfg = Debug|Win32
+               {8C65CE15-64F8-43E6-968D-DBBB96858BB2}.Debug|Win32.Build.0 = Debug|Win32
+               {8C65CE15-64F8-43E6-968D-DBBB96858BB2}.Debug|x64.ActiveCfg = Debug|x64
+               {8C65CE15-64F8-43E6-968D-DBBB96858BB2}.Debug|x64.Build.0 = Debug|x64
+               {8C65CE15-64F8-43E6-968D-DBBB96858BB2}.Release|Win32.ActiveCfg = Release|Win32
+               {8C65CE15-64F8-43E6-968D-DBBB96858BB2}.Release|Win32.Build.0 = Release|Win32
+               {8C65CE15-64F8-43E6-968D-DBBB96858BB2}.Release|x64.ActiveCfg = Release|x64
+               {8C65CE15-64F8-43E6-968D-DBBB96858BB2}.Release|x64.Build.0 = Release|x64
+       EndGlobalSection
+       GlobalSection(SolutionProperties) = preSolution
+               HideSolutionNode = FALSE
+       EndGlobalSection
+EndGlobal
diff --git a/DCHook/DCHook.vcproj b/DCHook/DCHook.vcproj
new file mode 100644 (file)
index 0000000..2023513
--- /dev/null
@@ -0,0 +1,376 @@
+<?xml version="1.0" encoding="shift_jis"?>
+<VisualStudioProject
+       ProjectType="Visual C++"
+       Version="9.00"
+       Name="DCHook"
+       ProjectGUID="{8C65CE15-64F8-43E6-968D-DBBB96858BB2}"
+       Keyword="Win32Proj"
+       TargetFrameworkVersion="131072"
+       >
+       <Platforms>
+               <Platform
+                       Name="Win32"
+               />
+               <Platform
+                       Name="x64"
+               />
+       </Platforms>
+       <ToolFiles>
+       </ToolFiles>
+       <Configurations>
+               <Configuration
+                       Name="Debug|Win32"
+                       OutputDirectory="Debug"
+                       IntermediateDirectory="Debug"
+                       ConfigurationType="2"
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+                       CharacterSet="2"
+                       >
+                       <Tool
+                               Name="VCPreBuildEventTool"
+                       />
+                       <Tool
+                               Name="VCCustomBuildTool"
+                       />
+                       <Tool
+                               Name="VCXMLDataGeneratorTool"
+                       />
+                       <Tool
+                               Name="VCWebServiceProxyGeneratorTool"
+                       />
+                       <Tool
+                               Name="VCMIDLTool"
+                       />
+                       <Tool
+                               Name="VCCLCompilerTool"
+                               Optimization="0"
+                               PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;DCHOOK_EXPORTS"
+                               MinimalRebuild="true"
+                               BasicRuntimeChecks="3"
+                               RuntimeLibrary="1"
+                               UsePrecompiledHeader="0"
+                               WarningLevel="3"
+                               Detect64BitPortabilityProblems="false"
+                               DebugInformationFormat="4"
+                       />
+                       <Tool
+                               Name="VCManagedResourceCompilerTool"
+                       />
+                       <Tool
+                               Name="VCResourceCompilerTool"
+                       />
+                       <Tool
+                               Name="VCPreLinkEventTool"
+                       />
+                       <Tool
+                               Name="VCLinkerTool"
+                               OutputFile="$(OutDir)/DCHook.dll"
+                               LinkIncremental="2"
+                               ModuleDefinitionFile="DCHook.def"
+                               GenerateDebugInformation="true"
+                               ProgramDatabaseFile="$(OutDir)/DCHook.pdb"
+                               SubSystem="2"
+                               RandomizedBaseAddress="1"
+                               DataExecutionPrevention="0"
+                               ImportLibrary="$(OutDir)/DCHook.lib"
+                               TargetMachine="1"
+                       />
+                       <Tool
+                               Name="VCALinkTool"
+                       />
+                       <Tool
+                               Name="VCManifestTool"
+                       />
+                       <Tool
+                               Name="VCXDCMakeTool"
+                       />
+                       <Tool
+                               Name="VCBscMakeTool"
+                       />
+                       <Tool
+                               Name="VCFxCopTool"
+                       />
+                       <Tool
+                               Name="VCAppVerifierTool"
+                       />
+                       <Tool
+                               Name="VCPostBuildEventTool"
+                       />
+               </Configuration>
+               <Configuration
+                       Name="Release|Win32"
+                       OutputDirectory="Release"
+                       IntermediateDirectory="Release"
+                       ConfigurationType="2"
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+                       CharacterSet="2"
+                       >
+                       <Tool
+                               Name="VCPreBuildEventTool"
+                       />
+                       <Tool
+                               Name="VCCustomBuildTool"
+                       />
+                       <Tool
+                               Name="VCXMLDataGeneratorTool"
+                       />
+                       <Tool
+                               Name="VCWebServiceProxyGeneratorTool"
+                       />
+                       <Tool
+                               Name="VCMIDLTool"
+                       />
+                       <Tool
+                               Name="VCCLCompilerTool"
+                               PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;DCHOOK_EXPORTS"
+                               RuntimeLibrary="0"
+                               UsePrecompiledHeader="0"
+                               WarningLevel="3"
+                               Detect64BitPortabilityProblems="false"
+                               DebugInformationFormat="3"
+                       />
+                       <Tool
+                               Name="VCManagedResourceCompilerTool"
+                       />
+                       <Tool
+                               Name="VCResourceCompilerTool"
+                       />
+                       <Tool
+                               Name="VCPreLinkEventTool"
+                       />
+                       <Tool
+                               Name="VCLinkerTool"
+                               OutputFile="$(OutDir)/DCHook.dll"
+                               LinkIncremental="1"
+                               ModuleDefinitionFile="DCHook.def"
+                               GenerateDebugInformation="true"
+                               SubSystem="2"
+                               OptimizeReferences="2"
+                               EnableCOMDATFolding="2"
+                               RandomizedBaseAddress="1"
+                               DataExecutionPrevention="0"
+                               ImportLibrary="$(OutDir)/DCHook.lib"
+                               TargetMachine="1"
+                       />
+                       <Tool
+                               Name="VCALinkTool"
+                       />
+                       <Tool
+                               Name="VCManifestTool"
+                       />
+                       <Tool
+                               Name="VCXDCMakeTool"
+                       />
+                       <Tool
+                               Name="VCBscMakeTool"
+                       />
+                       <Tool
+                               Name="VCFxCopTool"
+                       />
+                       <Tool
+                               Name="VCAppVerifierTool"
+                       />
+                       <Tool
+                               Name="VCPostBuildEventTool"
+                       />
+               </Configuration>
+               <Configuration
+                       Name="Debug|x64"
+                       OutputDirectory="$(SolutionDir)$(PlatformName)\$(ConfigurationName)"
+                       IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
+                       ConfigurationType="2"
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+                       CharacterSet="2"
+                       >
+                       <Tool
+                               Name="VCPreBuildEventTool"
+                       />
+                       <Tool
+                               Name="VCCustomBuildTool"
+                       />
+                       <Tool
+                               Name="VCXMLDataGeneratorTool"
+                       />
+                       <Tool
+                               Name="VCWebServiceProxyGeneratorTool"
+                       />
+                       <Tool
+                               Name="VCMIDLTool"
+                               TargetEnvironment="3"
+                       />
+                       <Tool
+                               Name="VCCLCompilerTool"
+                               Optimization="0"
+                               PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;DCHOOK_EXPORTS"
+                               MinimalRebuild="true"
+                               BasicRuntimeChecks="3"
+                               RuntimeLibrary="1"
+                               UsePrecompiledHeader="0"
+                               WarningLevel="3"
+                               Detect64BitPortabilityProblems="false"
+                               DebugInformationFormat="4"
+                       />
+                       <Tool
+                               Name="VCManagedResourceCompilerTool"
+                       />
+                       <Tool
+                               Name="VCResourceCompilerTool"
+                       />
+                       <Tool
+                               Name="VCPreLinkEventTool"
+                       />
+                       <Tool
+                               Name="VCLinkerTool"
+                               OutputFile="$(OutDir)/DCHook.dll"
+                               LinkIncremental="2"
+                               ModuleDefinitionFile="DCHook.def"
+                               GenerateDebugInformation="true"
+                               ProgramDatabaseFile="$(OutDir)/DCHook.pdb"
+                               SubSystem="2"
+                               RandomizedBaseAddress="1"
+                               DataExecutionPrevention="0"
+                               ImportLibrary="$(OutDir)/DCHook.lib"
+                               TargetMachine="17"
+                       />
+                       <Tool
+                               Name="VCALinkTool"
+                       />
+                       <Tool
+                               Name="VCManifestTool"
+                       />
+                       <Tool
+                               Name="VCXDCMakeTool"
+                       />
+                       <Tool
+                               Name="VCBscMakeTool"
+                       />
+                       <Tool
+                               Name="VCFxCopTool"
+                       />
+                       <Tool
+                               Name="VCAppVerifierTool"
+                       />
+                       <Tool
+                               Name="VCPostBuildEventTool"
+                       />
+               </Configuration>
+               <Configuration
+                       Name="Release|x64"
+                       OutputDirectory="$(SolutionDir)$(PlatformName)\$(ConfigurationName)"
+                       IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
+                       ConfigurationType="2"
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
+                       CharacterSet="2"
+                       >
+                       <Tool
+                               Name="VCPreBuildEventTool"
+                       />
+                       <Tool
+                               Name="VCCustomBuildTool"
+                       />
+                       <Tool
+                               Name="VCXMLDataGeneratorTool"
+                       />
+                       <Tool
+                               Name="VCWebServiceProxyGeneratorTool"
+                       />
+                       <Tool
+                               Name="VCMIDLTool"
+                               TargetEnvironment="3"
+                       />
+                       <Tool
+                               Name="VCCLCompilerTool"
+                               PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;DCHOOK_EXPORTS"
+                               RuntimeLibrary="0"
+                               UsePrecompiledHeader="0"
+                               WarningLevel="3"
+                               Detect64BitPortabilityProblems="false"
+                               DebugInformationFormat="3"
+                       />
+                       <Tool
+                               Name="VCManagedResourceCompilerTool"
+                       />
+                       <Tool
+                               Name="VCResourceCompilerTool"
+                       />
+                       <Tool
+                               Name="VCPreLinkEventTool"
+                       />
+                       <Tool
+                               Name="VCLinkerTool"
+                               OutputFile="$(OutDir)/DCHook.dll"
+                               LinkIncremental="1"
+                               ModuleDefinitionFile="DCHook.def"
+                               GenerateDebugInformation="true"
+                               SubSystem="2"
+                               OptimizeReferences="2"
+                               EnableCOMDATFolding="2"
+                               RandomizedBaseAddress="1"
+                               DataExecutionPrevention="0"
+                               ImportLibrary="$(OutDir)/DCHook.lib"
+                               TargetMachine="17"
+                       />
+                       <Tool
+                               Name="VCALinkTool"
+                       />
+                       <Tool
+                               Name="VCManifestTool"
+                       />
+                       <Tool
+                               Name="VCXDCMakeTool"
+                       />
+                       <Tool
+                               Name="VCBscMakeTool"
+                       />
+                       <Tool
+                               Name="VCFxCopTool"
+                       />
+                       <Tool
+                               Name="VCAppVerifierTool"
+                       />
+                       <Tool
+                               Name="VCPostBuildEventTool"
+                       />
+               </Configuration>
+       </Configurations>
+       <References>
+       </References>
+       <Files>
+               <Filter
+                       Name="\83\\81[\83\83t\83@\83C\83\8b"
+                       Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+                       UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+                       >
+                       <File
+                               RelativePath=".\DCHook.cpp"
+                               >
+                       </File>
+                       <File
+                               RelativePath=".\DCHook.def"
+                               >
+                       </File>
+                       <File
+                               RelativePath=".\MonitorScale.cpp"
+                               >
+                       </File>
+               </Filter>
+               <Filter
+                       Name="\83w\83b\83_\81\83t\83@\83C\83\8b"
+                       Filter="h;hpp;hxx;hm;inl;inc;xsd"
+                       UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+                       >
+               </Filter>
+               <Filter
+                       Name="\83\8a\83\\81[\83\83t\83@\83C\83\8b"
+                       Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
+                       UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+                       >
+                       <File
+                               RelativePath=".\dchook.rc"
+                               >
+                       </File>
+               </Filter>
+       </Files>
+       <Globals>
+       </Globals>
+</VisualStudioProject>
diff --git a/DCHook/DCHook.vcxproj b/DCHook/DCHook.vcxproj
new file mode 100644 (file)
index 0000000..0cba8e7
--- /dev/null
@@ -0,0 +1,167 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup Label="ProjectConfigurations">
+    <ProjectConfiguration Include="Debug|Win32">
+      <Configuration>Debug</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Debug|x64">
+      <Configuration>Debug</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|Win32">
+      <Configuration>Release</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|x64">
+      <Configuration>Release</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+  </ItemGroup>
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{8C65CE15-64F8-43E6-968D-DBBB96858BB2}</ProjectGuid>
+    <Keyword>Win32Proj</Keyword>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
+    <CharacterSet>MultiByte</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
+    <CharacterSet>MultiByte</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
+    <CharacterSet>MultiByte</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
+    <CharacterSet>MultiByte</CharacterSet>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ImportGroup Label="ExtensionSettings">
+  </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <PropertyGroup Label="UserMacros" />
+  <PropertyGroup>
+    <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Platform)\$(Configuration)</OutDir>
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(Platform)\$(Configuration)</OutDir>
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Debug\</IntDir>
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Debug\</IntDir>
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Platform)\$(Configuration)</OutDir>
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(Platform)\$(Configuration)</OutDir>
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Release\</IntDir>
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Release\</IntDir>
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
+  </PropertyGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <ClCompile>
+      <Optimization>Disabled</Optimization>
+      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;DCHOOK_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <MinimalRebuild>true</MinimalRebuild>
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+      <PrecompiledHeader>
+      </PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+    </ClCompile>
+    <Link>
+      <OutputFile>$(OutDir)DCHook.dll</OutputFile>
+      <ModuleDefinitionFile>DCHook.def</ModuleDefinitionFile>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <ProgramDatabaseFile>$(OutDir)DCHook.pdb</ProgramDatabaseFile>
+      <SubSystem>Windows</SubSystem>
+      <ImportLibrary>$(OutDir)DCHook.lib</ImportLibrary>
+      <TargetMachine>MachineX86</TargetMachine>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <ClCompile>
+      <Optimization>Disabled</Optimization>
+      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;DCHOOK_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+      <PrecompiledHeader>
+      </PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+    </ClCompile>
+    <Link>
+      <OutputFile>$(OutDir)DCHook.dll</OutputFile>
+      <ModuleDefinitionFile>DCHook.def</ModuleDefinitionFile>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <ProgramDatabaseFile>$(OutDir)DCHook.pdb</ProgramDatabaseFile>
+      <SubSystem>Windows</SubSystem>
+      <ImportLibrary>$(OutDir)DCHook.lib</ImportLibrary>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <ClCompile>
+      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;DCHOOK_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+      <PrecompiledHeader>
+      </PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+    </ClCompile>
+    <Link>
+      <OutputFile>$(OutDir)DCHook.dll</OutputFile>
+      <ModuleDefinitionFile>DCHook.def</ModuleDefinitionFile>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <SubSystem>Windows</SubSystem>
+      <OptimizeReferences>true</OptimizeReferences>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <ImportLibrary>$(OutDir)DCHook.lib</ImportLibrary>
+      <TargetMachine>MachineX86</TargetMachine>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <ClCompile>
+      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;DCHOOK_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+      <PrecompiledHeader>
+      </PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+    </ClCompile>
+    <Link>
+      <OutputFile>$(OutDir)DCHook.dll</OutputFile>
+      <ModuleDefinitionFile>DCHook.def</ModuleDefinitionFile>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <SubSystem>Windows</SubSystem>
+      <OptimizeReferences>true</OptimizeReferences>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <ImportLibrary>$(OutDir)DCHook.lib</ImportLibrary>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemGroup>
+    <ClCompile Include="DCHook.cpp" />
+    <ClCompile Include="MonitorScale.cpp" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="DCHook.def" />
+  </ItemGroup>
+  <ItemGroup>
+    <ResourceCompile Include="dchook.rc" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+  <ImportGroup Label="ExtensionTargets">
+  </ImportGroup>
+</Project>
\ No newline at end of file
diff --git a/DCHook/DCHook.vcxproj.filters b/DCHook/DCHook.vcxproj.filters
new file mode 100644 (file)
index 0000000..245a5fc
--- /dev/null
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup>
+    <Filter Include="ソース ファイル">
+      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+      <Extensions>cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+    </Filter>
+    <Filter Include="ヘッダー ファイル">
+      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
+    </Filter>
+    <Filter Include="リソース ファイル">
+      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
+      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx</Extensions>
+    </Filter>
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="DCHook.cpp">
+      <Filter>ソース ファイル</Filter>
+    </ClCompile>
+    <ClCompile Include="MonitorScale.cpp">
+      <Filter>ソース ファイル</Filter>
+    </ClCompile>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="DCHook.def">
+      <Filter>ソース ファイル</Filter>
+    </None>
+  </ItemGroup>
+  <ItemGroup>
+    <ResourceCompile Include="dchook.rc">
+      <Filter>リソース ファイル</Filter>
+    </ResourceCompile>
+  </ItemGroup>
+</Project>
\ No newline at end of file
diff --git a/DCHook/MonitorScale.cpp b/DCHook/MonitorScale.cpp
new file mode 100644 (file)
index 0000000..5de8714
--- /dev/null
@@ -0,0 +1,270 @@
+#include <windows.h>
+#include <tchar.h>
+
+#if WINVER<0x0601
+#define QDC_ALL_PATHS                   0x00000001
+#define QDC_ONLY_ACTIVE_PATHS           0x00000002
+#define QDC_DATABASE_CURRENT            0x00000004
+typedef enum
+{
+    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_OTHER                   = -1,
+    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_HD15                    =  0,
+    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SVIDEO                  =  1,
+    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_COMPOSITE_VIDEO         =  2,
+    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_COMPONENT_VIDEO         =  3,
+    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DVI                     =  4,
+    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_HDMI                    =  5,
+    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_LVDS                    =  6,
+    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_D_JPN                   =  8,
+    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SDI                     =  9,
+    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DISPLAYPORT_EXTERNAL    = 10,
+    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DISPLAYPORT_EMBEDDED    = 11,
+    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_UDI_EXTERNAL            = 12,
+    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_UDI_EMBEDDED            = 13,
+    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SDTVDONGLE              = 14,
+    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_INTERNAL                = 0x80000000,
+    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_FORCE_UINT32            = 0xFFFFFFFF
+} DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY;
+typedef enum
+{
+    DISPLAYCONFIG_ROTATION_IDENTITY     = 1,
+    DISPLAYCONFIG_ROTATION_ROTATE90     = 2,
+    DISPLAYCONFIG_ROTATION_ROTATE180    = 3,
+    DISPLAYCONFIG_ROTATION_ROTATE270    = 4,
+    DISPLAYCONFIG_ROTATION_FORCE_UINT32 = 0xFFFFFFFF
+} DISPLAYCONFIG_ROTATION;
+typedef enum
+{
+    DISPLAYCONFIG_SCALING_IDENTITY                  = 1,
+    DISPLAYCONFIG_SCALING_CENTERED                  = 2,
+    DISPLAYCONFIG_SCALING_STRETCHED                 = 3,
+    DISPLAYCONFIG_SCALING_ASPECTRATIOCENTEREDMAX    = 4,
+    DISPLAYCONFIG_SCALING_CUSTOM                    = 5,
+    DISPLAYCONFIG_SCALING_PREFERRED                 = 128,
+    DISPLAYCONFIG_SCALING_FORCE_UINT32              = 0xFFFFFFFF
+} DISPLAYCONFIG_SCALING;
+typedef struct DISPLAYCONFIG_RATIONAL
+{
+    UINT32    Numerator;
+    UINT32    Denominator;
+} DISPLAYCONFIG_RATIONAL;
+typedef enum
+{
+       DISPLAYCONFIG_SCANLINE_ORDERING_UNSPECIFIED                 = 0,
+       DISPLAYCONFIG_SCANLINE_ORDERING_PROGRESSIVE                 = 1,
+       DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED                  = 2,
+       DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED_UPPERFIELDFIRST  = DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED,
+       DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED_LOWERFIELDFIRST  = 3,
+       DISPLAYCONFIG_SCANLINE_ORDERING_FORCE_UINT32                = 0xFFFFFFFF
+} DISPLAYCONFIG_SCANLINE_ORDERING;
+typedef enum
+{
+    DISPLAYCONFIG_MODE_INFO_TYPE_SOURCE = 1,
+    DISPLAYCONFIG_MODE_INFO_TYPE_TARGET = 2,
+    DISPLAYCONFIG_MODE_INFO_TYPE_FORCE_UINT32 = 0xFFFFFFFF
+} DISPLAYCONFIG_MODE_INFO_TYPE;
+typedef struct DISPLAYCONFIG_2DREGION
+{
+    UINT32 cx;
+    UINT32 cy;
+} DISPLAYCONFIG_2DREGION;
+typedef struct DISPLAYCONFIG_VIDEO_SIGNAL_INFO
+{
+       UINT64                          pixelRate;
+       DISPLAYCONFIG_RATIONAL          hSyncFreq;
+       DISPLAYCONFIG_RATIONAL          vSyncFreq;
+       DISPLAYCONFIG_2DREGION          activeSize;
+       DISPLAYCONFIG_2DREGION          totalSize;
+       UINT32                          videoStandard;
+       DISPLAYCONFIG_SCANLINE_ORDERING scanLineOrdering;
+} DISPLAYCONFIG_VIDEO_SIGNAL_INFO;
+typedef enum
+{
+    DISPLAYCONFIG_PIXELFORMAT_8BPP          = 1,
+    DISPLAYCONFIG_PIXELFORMAT_16BPP         = 2,
+    DISPLAYCONFIG_PIXELFORMAT_24BPP         = 3,
+    DISPLAYCONFIG_PIXELFORMAT_32BPP         = 4,
+    DISPLAYCONFIG_PIXELFORMAT_NONGDI        = 5,
+    DISPLAYCONFIG_PIXELFORMAT_FORCE_UINT32  = 0xffffffff
+} DISPLAYCONFIG_PIXELFORMAT;
+typedef enum
+{
+      DISPLAYCONFIG_TOPOLOGY_INTERNAL       = 0x00000001,
+      DISPLAYCONFIG_TOPOLOGY_CLONE          = 0x00000002,
+      DISPLAYCONFIG_TOPOLOGY_EXTEND         = 0x00000004,
+      DISPLAYCONFIG_TOPOLOGY_EXTERNAL       = 0x00000008,
+      DISPLAYCONFIG_TOPOLOGY_FORCE_UINT32   = 0xFFFFFFFF
+} DISPLAYCONFIG_TOPOLOGY_ID;
+typedef enum
+{
+      DISPLAYCONFIG_DEVICE_INFO_GET_SOURCE_NAME             = 1,
+      DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME             = 2,
+      DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_PREFERRED_MODE   = 3,
+      DISPLAYCONFIG_DEVICE_INFO_GET_ADAPTER_NAME            = 4,
+      DISPLAYCONFIG_DEVICE_INFO_SET_TARGET_PERSISTENCE      = 5,
+      DISPLAYCONFIG_DEVICE_INFO_FORCE_UINT32                = 0xFFFFFFFF
+} DISPLAYCONFIG_DEVICE_INFO_TYPE;
+
+typedef struct DISPLAYCONFIG_PATH_SOURCE_INFO
+{
+       LUID    adapterId;
+       UINT32  id;
+       UINT32  modeInfoIdx;
+       UINT32  statusFlags;
+} DISPLAYCONFIG_PATH_SOURCE_INFO;
+typedef struct DISPLAYCONFIG_PATH_TARGET_INFO
+{
+       LUID                                    adapterId;
+       UINT32                                  id;
+       UINT32                                  modeInfoIdx;
+       DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY   outputTechnology;
+       DISPLAYCONFIG_ROTATION                  rotation;
+       DISPLAYCONFIG_SCALING                   scaling;
+       DISPLAYCONFIG_RATIONAL                  refreshRate;
+       DISPLAYCONFIG_SCANLINE_ORDERING         scanLineOrdering;
+       BOOL                                    targetAvailable;
+       UINT32                                  statusFlags;
+} DISPLAYCONFIG_PATH_TARGET_INFO;
+typedef struct DISPLAYCONFIG_PATH_INFO
+{
+       DISPLAYCONFIG_PATH_SOURCE_INFO  sourceInfo;
+       DISPLAYCONFIG_PATH_TARGET_INFO  targetInfo;
+       UINT32                          flags;
+} DISPLAYCONFIG_PATH_INFO;
+typedef struct DISPLAYCONFIG_TARGET_MODE
+{
+    DISPLAYCONFIG_VIDEO_SIGNAL_INFO   targetVideoSignalInfo;
+} DISPLAYCONFIG_TARGET_MODE;
+typedef struct DISPLAYCONFIG_SOURCE_MODE
+{
+    UINT32                      width;
+    UINT32                      height;
+    DISPLAYCONFIG_PIXELFORMAT   pixelFormat;
+    POINTL                      position;
+} DISPLAYCONFIG_SOURCE_MODE;
+typedef struct DISPLAYCONFIG_MODE_INFO
+{
+       DISPLAYCONFIG_MODE_INFO_TYPE    infoType;
+       UINT32                          id;
+       LUID                            adapterId;
+       union
+       {
+               DISPLAYCONFIG_TARGET_MODE   targetMode;
+               DISPLAYCONFIG_SOURCE_MODE   sourceMode;
+       };
+} DISPLAYCONFIG_MODE_INFO;
+typedef struct DISPLAYCONFIG_DEVICE_INFO_HEADER
+{
+       DISPLAYCONFIG_DEVICE_INFO_TYPE  type;
+       UINT32                          size;
+       LUID                            adapterId;
+       UINT32                          id;
+} DISPLAYCONFIG_DEVICE_INFO_HEADER;
+
+#endif
+
+typedef WINUSERAPI LONG (WINAPI *FNGetDisplayConfigBufferSizes)(UINT32 flags, UINT32* numPathArrayElements, UINT32* numModeInfoArrayElements);
+typedef WINUSERAPI LONG (WINAPI *FNSetDisplayConfig)(UINT32 numPathArrayElements, DISPLAYCONFIG_PATH_INFO* pathArray, UINT32 numModeInfoArrayElements, DISPLAYCONFIG_MODE_INFO* modeInfoArray, UINT32 flags);
+typedef WINUSERAPI LONG (WINAPI *FNQueryDisplayConfig)(UINT32 flags, UINT32* numPathArrayElements, DISPLAYCONFIG_PATH_INFO* pathArray, UINT32* numModeInfoArrayElements, DISPLAYCONFIG_MODE_INFO* modeInfoArray, DISPLAYCONFIG_TOPOLOGY_ID* currentTopologyId);
+typedef WINUSERAPI LONG (WINAPI *FNDisplayConfigGetDeviceInfo)(DISPLAYCONFIG_DEVICE_INFO_HEADER* requestPacket);
+
+class TDllHandle {
+protected:
+       HINSTANCE hInst;
+public:
+       TDllHandle(HINSTANCE _hInst)
+               :hInst(_hInst)
+       {
+       }
+       ~TDllHandle(){
+               if (hInst) FreeLibrary(hInst);
+       }
+       HINSTANCE inst(){ return hInst; }
+       operator HINSTANCE (){ return hInst; }
+       FARPROC GetProcAddress(LPCSTR name)
+               { return ::GetProcAddress(hInst, name); }
+};
+
+static TDllHandle *dllHandle = NULL;
+static FNGetDisplayConfigBufferSizes _GetDisplayConfigBufferSizes;
+static FNQueryDisplayConfig _QueryDisplayConfig;
+static bool called = false;
+static HMONITOR hPrevMonitor = NULL;
+static int prevDpi = 0;
+class TDestructor {
+public:
+       ~TDestructor(){ if (dllHandle){ delete dllHandle; dllHandle = NULL; } }
+} destructor;
+
+int GetMonitorScale()
+{
+       int dpi = 96;
+
+       if (!called){
+               called = true;
+               HINSTANCE hDll = LoadLibrary( _T("user32") );
+               if (!hDll)
+                       return dpi;
+
+               TDllHandle hInst(hDll);
+               dllHandle = new TDllHandle(hDll);
+
+               _GetDisplayConfigBufferSizes = (FNGetDisplayConfigBufferSizes)dllHandle->GetProcAddress("GetDisplayConfigBufferSizes");
+               if (!_GetDisplayConfigBufferSizes) return dpi;
+               _QueryDisplayConfig = (FNQueryDisplayConfig)dllHandle->GetProcAddress("QueryDisplayConfig");
+               if (!_QueryDisplayConfig) return dpi;
+       }
+
+       if (!dllHandle) return dpi;
+
+       POINT pt;
+       GetCursorPos( &pt );
+       HMONITOR hMonitor = MonitorFromPoint( pt, MONITOR_DEFAULTTONULL );
+       if (!hMonitor) return dpi;
+
+       if (hMonitor == hPrevMonitor){
+               return prevDpi;
+       }
+       hPrevMonitor = hMonitor;
+
+       MONITORINFOEX LogicalMonitorInfo;
+       LogicalMonitorInfo.cbSize = sizeof(MONITORINFOEX);
+       GetMonitorInfo(hMonitor, &LogicalMonitorInfo);
+       int LogicalMonitorWidth = LogicalMonitorInfo.rcMonitor.right - LogicalMonitorInfo.rcMonitor.left;
+
+       int LogicalDesktopWidth = GetSystemMetrics(SM_CXVIRTUALSCREEN);
+
+       UINT32 numofpath;
+       UINT32 numofmode;
+       _GetDisplayConfigBufferSizes(QDC_DATABASE_CURRENT, &numofpath, &numofmode);
+
+       DISPLAYCONFIG_PATH_INFO *dpis = new DISPLAYCONFIG_PATH_INFO[numofpath];
+       DISPLAYCONFIG_MODE_INFO *pModeInfoArray = new DISPLAYCONFIG_MODE_INFO[numofmode];
+       DISPLAYCONFIG_TOPOLOGY_ID tid;
+       _QueryDisplayConfig(QDC_DATABASE_CURRENT, &numofpath, dpis, &numofmode, pModeInfoArray, &tid);  //TODO: Windows7 or later
+
+       int PhysicalDesktopWidth = LogicalDesktopWidth;
+       int PhysicalMonitorWidth = LogicalMonitorWidth;
+       
+       for (int i=0;i<(int)numofmode;i++){
+               if (pModeInfoArray[i].infoType == DISPLAYCONFIG_MODE_INFO_TYPE_SOURCE){
+                       //DBW("%d: %d", i, pModeInfoArray[i].sourceMode.width);
+                       PhysicalDesktopWidth = pModeInfoArray[i].sourceMode.width;
+                       //int PhysicalDesktopWidth = 
+                       //int ScaleFactor = (LogicalMonitorWidth/LogicalDesktopWidth) / (PhysicalMonitorWidth/PhysicalDesktopWidth)
+                       //return 96 * 1;
+               } else
+               if (pModeInfoArray[i].infoType == DISPLAYCONFIG_MODE_INFO_TYPE_TARGET){
+                       PhysicalMonitorWidth = pModeInfoArray[i].targetMode.targetVideoSignalInfo.activeSize.cx;
+                       //DBW("%d: %d", i, PhysicalMonitorWidth);
+               }
+       }
+
+       //int PhysicalMonitorWidth = pModeInfoArray[i].sourceMode.width;
+       //int ScaleFactor = (LogicalMonitorWidth/LogicalDesktopWidth) / (PhysicalMonitorWidth/PhysicalDesktopWidth)
+
+       delete[] dpis;
+       delete[] pModeInfoArray;
+
+       return prevDpi = dpi * PhysicalDesktopWidth / LogicalDesktopWidth;
+}
diff --git a/DCHook/MonitorScale.h b/DCHook/MonitorScale.h
new file mode 100644 (file)
index 0000000..c900b8e
--- /dev/null
@@ -0,0 +1,6 @@
+#ifndef __MonitorScale_h
+#define        __MonitorScale_h
+
+int GetMonitorScale();
+
+#endif
diff --git a/DCHook/VS2003/DCHook.sln b/DCHook/VS2003/DCHook.sln
new file mode 100644 (file)
index 0000000..9b639fc
--- /dev/null
@@ -0,0 +1,21 @@
+Microsoft Visual Studio Solution File, Format Version 8.00
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DCHook", "DCHook.vcproj", "{8C65CE15-64F8-43E6-968D-DBBB96858BB2}"
+       ProjectSection(ProjectDependencies) = postProject
+       EndProjectSection
+EndProject
+Global
+       GlobalSection(SolutionConfiguration) = preSolution
+               Debug = Debug
+               Release = Release
+       EndGlobalSection
+       GlobalSection(ProjectConfiguration) = postSolution
+               {8C65CE15-64F8-43E6-968D-DBBB96858BB2}.Debug.ActiveCfg = Debug|Win32
+               {8C65CE15-64F8-43E6-968D-DBBB96858BB2}.Debug.Build.0 = Debug|Win32
+               {8C65CE15-64F8-43E6-968D-DBBB96858BB2}.Release.ActiveCfg = Release|Win32
+               {8C65CE15-64F8-43E6-968D-DBBB96858BB2}.Release.Build.0 = Release|Win32
+       EndGlobalSection
+       GlobalSection(ExtensibilityGlobals) = postSolution
+       EndGlobalSection
+       GlobalSection(ExtensibilityAddIns) = postSolution
+       EndGlobalSection
+EndGlobal
diff --git a/DCHook/VS2003/DCHook.vcproj b/DCHook/VS2003/DCHook.vcproj
new file mode 100644 (file)
index 0000000..c7274d2
--- /dev/null
@@ -0,0 +1,145 @@
+<?xml version="1.0" encoding="shift_jis"?>
+<VisualStudioProject
+       ProjectType="Visual C++"
+       Version="7.10"
+       Name="DCHook"
+       ProjectGUID="{8C65CE15-64F8-43E6-968D-DBBB96858BB2}"
+       Keyword="Win32Proj">
+       <Platforms>
+               <Platform
+                       Name="Win32"/>
+       </Platforms>
+       <Configurations>
+               <Configuration
+                       Name="Debug|Win32"
+                       OutputDirectory="Debug"
+                       IntermediateDirectory="Debug"
+                       ConfigurationType="2"
+                       CharacterSet="2">
+                       <Tool
+                               Name="VCCLCompilerTool"
+                               Optimization="0"
+                               PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;DCHOOK_EXPORTS"
+                               MinimalRebuild="TRUE"
+                               BasicRuntimeChecks="3"
+                               RuntimeLibrary="1"
+                               UsePrecompiledHeader="2"
+                               WarningLevel="3"
+                               Detect64BitPortabilityProblems="TRUE"
+                               DebugInformationFormat="4"/>
+                       <Tool
+                               Name="VCCustomBuildTool"/>
+                       <Tool
+                               Name="VCLinkerTool"
+                               OutputFile="$(OutDir)/DCHook.dll"
+                               LinkIncremental="2"
+                               ModuleDefinitionFile="DCHook.def"
+                               GenerateDebugInformation="TRUE"
+                               ProgramDatabaseFile="$(OutDir)/DCHook.pdb"
+                               SubSystem="2"
+                               ImportLibrary="$(OutDir)/DCHook.lib"
+                               TargetMachine="1"/>
+                       <Tool
+                               Name="VCMIDLTool"/>
+                       <Tool
+                               Name="VCPostBuildEventTool"/>
+                       <Tool
+                               Name="VCPreBuildEventTool"/>
+                       <Tool
+                               Name="VCPreLinkEventTool"/>
+                       <Tool
+                               Name="VCResourceCompilerTool"/>
+                       <Tool
+                               Name="VCWebServiceProxyGeneratorTool"/>
+                       <Tool
+                               Name="VCXMLDataGeneratorTool"/>
+                       <Tool
+                               Name="VCWebDeploymentTool"/>
+                       <Tool
+                               Name="VCManagedWrapperGeneratorTool"/>
+                       <Tool
+                               Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+               </Configuration>
+               <Configuration
+                       Name="Release|Win32"
+                       OutputDirectory="Release"
+                       IntermediateDirectory="Release"
+                       ConfigurationType="2"
+                       CharacterSet="2">
+                       <Tool
+                               Name="VCCLCompilerTool"
+                               PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;DCHOOK_EXPORTS"
+                               RuntimeLibrary="0"
+                               UsePrecompiledHeader="2"
+                               WarningLevel="3"
+                               Detect64BitPortabilityProblems="TRUE"
+                               DebugInformationFormat="3"/>
+                       <Tool
+                               Name="VCCustomBuildTool"/>
+                       <Tool
+                               Name="VCLinkerTool"
+                               OutputFile="$(OutDir)/DCHook.dll"
+                               LinkIncremental="1"
+                               ModuleDefinitionFile="DCHook.def"
+                               GenerateDebugInformation="TRUE"
+                               SubSystem="2"
+                               OptimizeReferences="2"
+                               EnableCOMDATFolding="2"
+                               ImportLibrary="$(OutDir)/DCHook.lib"
+                               TargetMachine="1"/>
+                       <Tool
+                               Name="VCMIDLTool"/>
+                       <Tool
+                               Name="VCPostBuildEventTool"/>
+                       <Tool
+                               Name="VCPreBuildEventTool"/>
+                       <Tool
+                               Name="VCPreLinkEventTool"/>
+                       <Tool
+                               Name="VCResourceCompilerTool"/>
+                       <Tool
+                               Name="VCWebServiceProxyGeneratorTool"/>
+                       <Tool
+                               Name="VCXMLDataGeneratorTool"/>
+                       <Tool
+                               Name="VCWebDeploymentTool"/>
+                       <Tool
+                               Name="VCManagedWrapperGeneratorTool"/>
+                       <Tool
+                               Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+               </Configuration>
+       </Configurations>
+       <References>
+       </References>
+       <Files>
+               <Filter
+                       Name="\83\\81[\83\83t\83@\83C\83\8b"
+                       Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+                       UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
+                       <File
+                               RelativePath="..\DCHook.cpp">
+                       </File>
+                       <File
+                               RelativePath="..\DCHook.def">
+                       </File>
+                       <File
+                               RelativePath="..\MonitorScale.cpp">
+                       </File>
+               </Filter>
+               <Filter
+                       Name="\83w\83b\83_\81\83t\83@\83C\83\8b"
+                       Filter="h;hpp;hxx;hm;inl;inc;xsd"
+                       UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
+               </Filter>
+               <Filter
+                       Name="\83\8a\83\\81[\83\83t\83@\83C\83\8b"
+                       Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
+                       UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
+                       <File
+                               RelativePath="..\dchook.rc">
+                       </File>
+               </Filter>
+       </Files>
+       <Globals>
+       </Globals>
+</VisualStudioProject>
diff --git a/DCHook/VS2008/DCHook.sln b/DCHook/VS2008/DCHook.sln
new file mode 100644 (file)
index 0000000..a89cf9d
--- /dev/null
@@ -0,0 +1,26 @@
+
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual Studio 2008
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DCHook", "DCHook.vcproj", "{B8C9A2E3-2767-45C7-91B5-1B717C3653F3}"
+EndProject
+Global
+       GlobalSection(SolutionConfigurationPlatforms) = preSolution
+               Debug|Win32 = Debug|Win32
+               Debug|x64 = Debug|x64
+               Release|Win32 = Release|Win32
+               Release|x64 = Release|x64
+       EndGlobalSection
+       GlobalSection(ProjectConfigurationPlatforms) = postSolution
+               {B8C9A2E3-2767-45C7-91B5-1B717C3653F3}.Debug|Win32.ActiveCfg = Debug|Win32
+               {B8C9A2E3-2767-45C7-91B5-1B717C3653F3}.Debug|Win32.Build.0 = Debug|Win32
+               {B8C9A2E3-2767-45C7-91B5-1B717C3653F3}.Debug|x64.ActiveCfg = Debug|x64
+               {B8C9A2E3-2767-45C7-91B5-1B717C3653F3}.Debug|x64.Build.0 = Debug|x64
+               {B8C9A2E3-2767-45C7-91B5-1B717C3653F3}.Release|Win32.ActiveCfg = Release|Win32
+               {B8C9A2E3-2767-45C7-91B5-1B717C3653F3}.Release|Win32.Build.0 = Release|Win32
+               {B8C9A2E3-2767-45C7-91B5-1B717C3653F3}.Release|x64.ActiveCfg = Release|x64
+               {B8C9A2E3-2767-45C7-91B5-1B717C3653F3}.Release|x64.Build.0 = Release|x64
+       EndGlobalSection
+       GlobalSection(SolutionProperties) = preSolution
+               HideSolutionNode = FALSE
+       EndGlobalSection
+EndGlobal
diff --git a/DCHook/VS2008/DCHook.vcproj b/DCHook/VS2008/DCHook.vcproj
new file mode 100644 (file)
index 0000000..c356754
--- /dev/null
@@ -0,0 +1,359 @@
+<?xml version="1.0" encoding="shift_jis"?>
+<VisualStudioProject
+       ProjectType="Visual C++"
+       Version="9.00"
+       Name="DCHook"
+       ProjectGUID="{B8C9A2E3-2767-45C7-91B5-1B717C3653F3}"
+       RootNamespace="DCHook"
+       Keyword="Win32Proj"
+       TargetFrameworkVersion="196613"
+       >
+       <Platforms>
+               <Platform
+                       Name="Win32"
+               />
+               <Platform
+                       Name="x64"
+               />
+       </Platforms>
+       <ToolFiles>
+       </ToolFiles>
+       <Configurations>
+               <Configuration
+                       Name="Debug|Win32"
+                       OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+                       IntermediateDirectory="$(ConfigurationName)"
+                       ConfigurationType="2"
+                       CharacterSet="2"
+                       >
+                       <Tool
+                               Name="VCPreBuildEventTool"
+                       />
+                       <Tool
+                               Name="VCCustomBuildTool"
+                       />
+                       <Tool
+                               Name="VCXMLDataGeneratorTool"
+                       />
+                       <Tool
+                               Name="VCWebServiceProxyGeneratorTool"
+                       />
+                       <Tool
+                               Name="VCMIDLTool"
+                       />
+                       <Tool
+                               Name="VCCLCompilerTool"
+                               Optimization="0"
+                               PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;DCHOOK_EXPORTS"
+                               MinimalRebuild="true"
+                               BasicRuntimeChecks="3"
+                               RuntimeLibrary="3"
+                               UsePrecompiledHeader="0"
+                               WarningLevel="3"
+                               DebugInformationFormat="4"
+                       />
+                       <Tool
+                               Name="VCManagedResourceCompilerTool"
+                       />
+                       <Tool
+                               Name="VCResourceCompilerTool"
+                       />
+                       <Tool
+                               Name="VCPreLinkEventTool"
+                       />
+                       <Tool
+                               Name="VCLinkerTool"
+                               LinkIncremental="2"
+                               ModuleDefinitionFile="DCHook.def"
+                               GenerateDebugInformation="true"
+                               SubSystem="2"
+                               TargetMachine="1"
+                       />
+                       <Tool
+                               Name="VCALinkTool"
+                       />
+                       <Tool
+                               Name="VCManifestTool"
+                       />
+                       <Tool
+                               Name="VCXDCMakeTool"
+                       />
+                       <Tool
+                               Name="VCBscMakeTool"
+                       />
+                       <Tool
+                               Name="VCFxCopTool"
+                       />
+                       <Tool
+                               Name="VCAppVerifierTool"
+                       />
+                       <Tool
+                               Name="VCPostBuildEventTool"
+                       />
+               </Configuration>
+               <Configuration
+                       Name="Release|Win32"
+                       OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+                       IntermediateDirectory="$(ConfigurationName)"
+                       ConfigurationType="2"
+                       CharacterSet="2"
+                       WholeProgramOptimization="1"
+                       >
+                       <Tool
+                               Name="VCPreBuildEventTool"
+                       />
+                       <Tool
+                               Name="VCCustomBuildTool"
+                       />
+                       <Tool
+                               Name="VCXMLDataGeneratorTool"
+                       />
+                       <Tool
+                               Name="VCWebServiceProxyGeneratorTool"
+                       />
+                       <Tool
+                               Name="VCMIDLTool"
+                       />
+                       <Tool
+                               Name="VCCLCompilerTool"
+                               Optimization="2"
+                               EnableIntrinsicFunctions="true"
+                               PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;DCHOOK_EXPORTS"
+                               RuntimeLibrary="2"
+                               EnableFunctionLevelLinking="true"
+                               UsePrecompiledHeader="0"
+                               WarningLevel="3"
+                               DebugInformationFormat="3"
+                       />
+                       <Tool
+                               Name="VCManagedResourceCompilerTool"
+                       />
+                       <Tool
+                               Name="VCResourceCompilerTool"
+                       />
+                       <Tool
+                               Name="VCPreLinkEventTool"
+                       />
+                       <Tool
+                               Name="VCLinkerTool"
+                               LinkIncremental="1"
+                               ModuleDefinitionFile="DCHook.def"
+                               GenerateDebugInformation="true"
+                               SubSystem="2"
+                               OptimizeReferences="2"
+                               EnableCOMDATFolding="2"
+                               TargetMachine="1"
+                       />
+                       <Tool
+                               Name="VCALinkTool"
+                       />
+                       <Tool
+                               Name="VCManifestTool"
+                       />
+                       <Tool
+                               Name="VCXDCMakeTool"
+                       />
+                       <Tool
+                               Name="VCBscMakeTool"
+                       />
+                       <Tool
+                               Name="VCFxCopTool"
+                       />
+                       <Tool
+                               Name="VCAppVerifierTool"
+                       />
+                       <Tool
+                               Name="VCPostBuildEventTool"
+                       />
+               </Configuration>
+               <Configuration
+                       Name="Debug|x64"
+                       OutputDirectory="$(SolutionDir)$(PlatformName)\$(ConfigurationName)"
+                       IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
+                       ConfigurationType="2"
+                       CharacterSet="2"
+                       >
+                       <Tool
+                               Name="VCPreBuildEventTool"
+                       />
+                       <Tool
+                               Name="VCCustomBuildTool"
+                       />
+                       <Tool
+                               Name="VCXMLDataGeneratorTool"
+                       />
+                       <Tool
+                               Name="VCWebServiceProxyGeneratorTool"
+                       />
+                       <Tool
+                               Name="VCMIDLTool"
+                               TargetEnvironment="3"
+                       />
+                       <Tool
+                               Name="VCCLCompilerTool"
+                               Optimization="0"
+                               PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;DCHOOK_EXPORTS"
+                               MinimalRebuild="true"
+                               BasicRuntimeChecks="3"
+                               RuntimeLibrary="3"
+                               UsePrecompiledHeader="0"
+                               WarningLevel="3"
+                               DebugInformationFormat="3"
+                       />
+                       <Tool
+                               Name="VCManagedResourceCompilerTool"
+                       />
+                       <Tool
+                               Name="VCResourceCompilerTool"
+                       />
+                       <Tool
+                               Name="VCPreLinkEventTool"
+                       />
+                       <Tool
+                               Name="VCLinkerTool"
+                               LinkIncremental="2"
+                               ModuleDefinitionFile="DCHook.def"
+                               GenerateDebugInformation="true"
+                               SubSystem="2"
+                               TargetMachine="17"
+                       />
+                       <Tool
+                               Name="VCALinkTool"
+                       />
+                       <Tool
+                               Name="VCManifestTool"
+                       />
+                       <Tool
+                               Name="VCXDCMakeTool"
+                       />
+                       <Tool
+                               Name="VCBscMakeTool"
+                       />
+                       <Tool
+                               Name="VCFxCopTool"
+                       />
+                       <Tool
+                               Name="VCAppVerifierTool"
+                       />
+                       <Tool
+                               Name="VCPostBuildEventTool"
+                       />
+               </Configuration>
+               <Configuration
+                       Name="Release|x64"
+                       OutputDirectory="$(SolutionDir)$(PlatformName)\$(ConfigurationName)"
+                       IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
+                       ConfigurationType="2"
+                       CharacterSet="2"
+                       WholeProgramOptimization="1"
+                       >
+                       <Tool
+                               Name="VCPreBuildEventTool"
+                       />
+                       <Tool
+                               Name="VCCustomBuildTool"
+                       />
+                       <Tool
+                               Name="VCXMLDataGeneratorTool"
+                       />
+                       <Tool
+                               Name="VCWebServiceProxyGeneratorTool"
+                       />
+                       <Tool
+                               Name="VCMIDLTool"
+                               TargetEnvironment="3"
+                       />
+                       <Tool
+                               Name="VCCLCompilerTool"
+                               Optimization="2"
+                               EnableIntrinsicFunctions="true"
+                               PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;DCHOOK_EXPORTS"
+                               RuntimeLibrary="2"
+                               EnableFunctionLevelLinking="true"
+                               UsePrecompiledHeader="0"
+                               WarningLevel="3"
+                               DebugInformationFormat="3"
+                       />
+                       <Tool
+                               Name="VCManagedResourceCompilerTool"
+                       />
+                       <Tool
+                               Name="VCResourceCompilerTool"
+                       />
+                       <Tool
+                               Name="VCPreLinkEventTool"
+                       />
+                       <Tool
+                               Name="VCLinkerTool"
+                               LinkIncremental="1"
+                               ModuleDefinitionFile="DCHook.def"
+                               GenerateDebugInformation="true"
+                               SubSystem="2"
+                               OptimizeReferences="2"
+                               EnableCOMDATFolding="2"
+                               TargetMachine="17"
+                       />
+                       <Tool
+                               Name="VCALinkTool"
+                       />
+                       <Tool
+                               Name="VCManifestTool"
+                       />
+                       <Tool
+                               Name="VCXDCMakeTool"
+                       />
+                       <Tool
+                               Name="VCBscMakeTool"
+                       />
+                       <Tool
+                               Name="VCFxCopTool"
+                       />
+                       <Tool
+                               Name="VCAppVerifierTool"
+                       />
+                       <Tool
+                               Name="VCPostBuildEventTool"
+                       />
+               </Configuration>
+       </Configurations>
+       <References>
+       </References>
+       <Files>
+               <Filter
+                       Name="\83\\81[\83\83t\83@\83C\83\8b"
+                       Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+                       UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+                       >
+                       <File
+                               RelativePath="..\DCHook.cpp"
+                               >
+                       </File>
+                       <File
+                               RelativePath="..\DCHook.def"
+                               >
+                       </File>
+                       <File
+                               RelativePath="..\MonitorScale.cpp"
+                               >
+                       </File>
+               </Filter>
+               <Filter
+                       Name="\83w\83b\83_\81\83t\83@\83C\83\8b"
+                       Filter="h;hpp;hxx;hm;inl;inc;xsd"
+                       UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+                       >
+               </Filter>
+               <Filter
+                       Name="\83\8a\83\\81[\83\83t\83@\83C\83\8b"
+                       Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
+                       UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+                       >
+                       <File
+                               RelativePath="..\dchook.rc"
+                               >
+                       </File>
+               </Filter>
+       </Files>
+       <Globals>
+       </Globals>
+</VisualStudioProject>
diff --git a/DCHook/VS2015/DCHook.sln b/DCHook/VS2015/DCHook.sln
new file mode 100644 (file)
index 0000000..05c95f6
--- /dev/null
@@ -0,0 +1,28 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 14
+VisualStudioVersion = 14.0.23107.0
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DCHook", "DCHook.vcxproj", "{16E6F306-BD26-4E7E-9A8E-96A5231AD6A3}"
+EndProject
+Global
+       GlobalSection(SolutionConfigurationPlatforms) = preSolution
+               Debug|x64 = Debug|x64
+               Debug|x86 = Debug|x86
+               Release|x64 = Release|x64
+               Release|x86 = Release|x86
+       EndGlobalSection
+       GlobalSection(ProjectConfigurationPlatforms) = postSolution
+               {16E6F306-BD26-4E7E-9A8E-96A5231AD6A3}.Debug|x64.ActiveCfg = Debug|x64
+               {16E6F306-BD26-4E7E-9A8E-96A5231AD6A3}.Debug|x64.Build.0 = Debug|x64
+               {16E6F306-BD26-4E7E-9A8E-96A5231AD6A3}.Debug|x86.ActiveCfg = Debug|Win32
+               {16E6F306-BD26-4E7E-9A8E-96A5231AD6A3}.Debug|x86.Build.0 = Debug|Win32
+               {16E6F306-BD26-4E7E-9A8E-96A5231AD6A3}.Release|x64.ActiveCfg = Release|x64
+               {16E6F306-BD26-4E7E-9A8E-96A5231AD6A3}.Release|x64.Build.0 = Release|x64
+               {16E6F306-BD26-4E7E-9A8E-96A5231AD6A3}.Release|x86.ActiveCfg = Release|Win32
+               {16E6F306-BD26-4E7E-9A8E-96A5231AD6A3}.Release|x86.Build.0 = Release|Win32
+       EndGlobalSection
+       GlobalSection(SolutionProperties) = preSolution
+               HideSolutionNode = FALSE
+       EndGlobalSection
+EndGlobal
diff --git a/DCHook/VS2015/DCHook.vcxproj b/DCHook/VS2015/DCHook.vcxproj
new file mode 100644 (file)
index 0000000..e66c96d
--- /dev/null
@@ -0,0 +1,158 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup Label="ProjectConfigurations">
+    <ProjectConfiguration Include="Debug|Win32">
+      <Configuration>Debug</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|Win32">
+      <Configuration>Release</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Debug|x64">
+      <Configuration>Debug</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|x64">
+      <Configuration>Release</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+  </ItemGroup>
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{16E6F306-BD26-4E7E-9A8E-96A5231AD6A3}</ProjectGuid>
+    <Keyword>Win32Proj</Keyword>
+    <RootNamespace>DCHook</RootNamespace>
+    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <PlatformToolset>v140</PlatformToolset>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <PlatformToolset>v140</PlatformToolset>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <PlatformToolset>v140</PlatformToolset>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <PlatformToolset>v140</PlatformToolset>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ImportGroup Label="ExtensionSettings">
+  </ImportGroup>
+  <ImportGroup Label="Shared">
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <PropertyGroup Label="UserMacros" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <LinkIncremental>true</LinkIncremental>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <LinkIncremental>true</LinkIncremental>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <LinkIncremental>false</LinkIncremental>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <LinkIncremental>false</LinkIncremental>
+  </PropertyGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <ClCompile>
+      <PrecompiledHeader>
+      </PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>Disabled</Optimization>
+      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;DCHOOK_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <SDLCheck>true</SDLCheck>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <ClCompile>
+      <PrecompiledHeader>
+      </PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>Disabled</Optimization>
+      <PreprocessorDefinitions>_DEBUG;_WINDOWS;_USRDLL;DCHOOK_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <SDLCheck>true</SDLCheck>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <ClCompile>
+      <WarningLevel>Level3</WarningLevel>
+      <PrecompiledHeader>
+      </PrecompiledHeader>
+      <Optimization>MaxSpeed</Optimization>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;DCHOOK_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <SDLCheck>true</SDLCheck>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <OptimizeReferences>true</OptimizeReferences>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <ClCompile>
+      <WarningLevel>Level3</WarningLevel>
+      <PrecompiledHeader>
+      </PrecompiledHeader>
+      <Optimization>MaxSpeed</Optimization>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <PreprocessorDefinitions>NDEBUG;_WINDOWS;_USRDLL;DCHOOK_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <SDLCheck>true</SDLCheck>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <OptimizeReferences>true</OptimizeReferences>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemGroup>
+    <ClCompile Include="..\DCHook.cpp" />
+    <ClCompile Include="..\MonitorScale.cpp" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="..\DCHook.def" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+  <ImportGroup Label="ExtensionTargets">
+  </ImportGroup>
+</Project>
\ No newline at end of file
diff --git a/DCHook/VS2015/DCHook.vcxproj.filters b/DCHook/VS2015/DCHook.vcxproj.filters
new file mode 100644 (file)
index 0000000..883d488
--- /dev/null
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup>
+    <Filter Include="ソース ファイル">
+      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+    </Filter>
+    <Filter Include="ヘッダー ファイル">
+      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+      <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
+    </Filter>
+    <Filter Include="リソース ファイル">
+      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
+      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
+    </Filter>
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="..\DCHook.cpp">
+      <Filter>ソース ファイル</Filter>
+    </ClCompile>
+    <ClCompile Include="..\MonitorScale.cpp">
+      <Filter>ソース ファイル</Filter>
+    </ClCompile>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="..\DCHook.def">
+      <Filter>ソース ファイル</Filter>
+    </None>
+  </ItemGroup>
+</Project>
\ No newline at end of file
diff --git a/DCHook/dchook.rc b/DCHook/dchook.rc
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/DCHook64/DCHook64.h b/DCHook64/DCHook64.h
new file mode 100644 (file)
index 0000000..6029090
--- /dev/null
@@ -0,0 +1,38 @@
+#ifndef __DCHook64_h
+#define __DCHook64_h
+
+// App -> dchk64.exe
+
+enum eHookDllCmd {
+       HDC_Load = WM_APP+0x100,
+       HDC_Unload,
+       HDC_Init,
+       HDC_Uninit,
+       HDC_Config,
+       HDC_Config2,
+       HDC_Capture,
+       HDC_CaptureAsync,
+       HDC_CaptureAsyncWait,
+       HDC_Debug,
+};
+
+struct HDCInitParam {
+       HWND hwnd;
+       //char module_name[];
+       //bool windowsnt;
+       //const char *vxd_path;
+};
+
+struct HDCConfigParam {
+       int clickonly;
+       int keyaction;
+       int keyflag;
+};
+
+// dchk64.exe -> App
+#define        UM_SHORTCUT                     (WM_APP+33)
+
+// WPARAM value
+#define        SCINX_NOTIFY64  (0x1000)        // notify from 64bit HookDll
+
+#endif
diff --git a/DCHook64/dchk64/ReadMe.txt b/DCHook64/dchk64/ReadMe.txt
new file mode 100644 (file)
index 0000000..9a4113d
--- /dev/null
@@ -0,0 +1,69 @@
+========================================================================
+    Win32 アプリケーション: dchk64 プロジェクトの概要
+========================================================================
+
+この dchk64 アプリケーションは、AppWizard により作成されました。
+
+このファイルには、dchk64 
+アプリケーションを構成する各ファイルの内容の概要が含まれています。
+
+
+dchk64.vcxproj
+    これは、アプリケーション ウィザードを使用して生成された VC++ 
+    プロジェクトのメイン プロジェクト ファイルです。
+    ファイルを生成した Visual C++ のバージョンに関する情報と、アプリケーション 
+    ウィザードで選択されたプラットフォーム、
+    構成、およびプロジェクト機能に関する情報が含まれています。
+
+dchk64.vcxproj.filters
+    これは、アプリケーション ウィザードで生成された VC++ プロジェクトのフィルター 
+    ファイルです。 
+    このファイルには、プロジェクト内のファイルとフィルターとの間の関連付けに関する
+    情報が含まれています。 この関連付けは、特定のノー
+    ドで同様の拡張子を持つファイルのグループ化を
+    示すために IDE で使用されます (たとえば、".cpp" ファイルは "ソース ファイル" 
+    フィルターに関連付けられています)。
+
+dchk64.cpp
+    これは、メインのアプリケーション ソース ファイルです。
+
+/////////////////////////////////////////////////////////////////////////////
+AppWizard によって、次のリソースが作成されました。
+
+dchk64.rc
+    これは、プログラムが使用するすべての Microsoft Windows リソースの一覧です。RES 
+    サブディレクトリに格納されるアイコン、ビットマップ、
+    およびカーソルをインクルードしています。  このファイルは、Microsoft Visual C++ 
+    で直接編集できます。
+
+Resource.h
+    これは、新しいリソース ID を定義する標準のヘッダー ファイルです。
+    このファイルの読み込みおよび更新は、Microsoft Visual C++ で行います。
+
+dchk64.ico
+    これは、アプリケーションのアイコン (32x32) として使用されるアイコン 
+    ファイルです。
+    このアイコンは、メイン リソース ファイル dchk64.rc 
+    にインクルードされます。
+
+small.ico
+    これは、アプリケーションのアイコンの小さいバージョン (16x16) を含むアイコン 
+    ファイルです。 このアイコンは、メイン リソース ファイル dchk64.rc 
+    にインクルードされます。
+
+/////////////////////////////////////////////////////////////////////////////
+その他の標準ファイル :
+
+StdAfx.h、StdAfx.cpp
+    これらのファイルは、dchk64.pch 
+    という名前のプリコンパイル済みヘッダー (PCH) ファイルと、StdAfx.obj 
+    という名前のプリコンパイル済みの型ファイルを構築するために使用されます。
+
+/////////////////////////////////////////////////////////////////////////////
+その他のメモ :
+
+AppWizard では "TODO:" 
+コメントを使用して、ユーザーが追加またはカスタマイズする必要のあるソース 
+コードを示します。
+
+/////////////////////////////////////////////////////////////////////////////
diff --git a/DCHook64/dchk64/Resource.h b/DCHook64/dchk64/Resource.h
new file mode 100644 (file)
index 0000000..87a7c48
--- /dev/null
@@ -0,0 +1,31 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Visual C++ generated include file.
+// Used by dchk64.rc
+//
+
+#define IDS_APP_TITLE                  103
+
+#define IDR_MAINFRAME                  128
+#define IDD_DCHK64_DIALOG      102
+#define IDD_ABOUTBOX                   103
+#define IDM_ABOUT                              104
+#define IDM_EXIT                               105
+#define IDI_DCHK64                     107
+#define IDI_SMALL                              108
+#define IDC_DCHK64                     109
+#define IDC_MYICON                             2
+#ifndef IDC_STATIC
+#define IDC_STATIC                             -1
+#endif
+// \90V\82µ\82¢\83I\83u\83W\83F\83N\83g\82Ì\8e\9f\82Ì\8aù\92è\92l
+//
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+
+#define _APS_NO_MFC                                    130
+#define _APS_NEXT_RESOURCE_VALUE       129
+#define _APS_NEXT_COMMAND_VALUE                32771
+#define _APS_NEXT_CONTROL_VALUE                1000
+#define _APS_NEXT_SYMED_VALUE          110
+#endif
+#endif
diff --git a/DCHook64/dchk64/dchk64.cpp b/DCHook64/dchk64/dchk64.cpp
new file mode 100644 (file)
index 0000000..8812dd7
--- /dev/null
@@ -0,0 +1,336 @@
+// dchk64.cpp : \83A\83v\83\8a\83P\81[\83V\83\87\83\93\82Ì\83G\83\93\83g\83\8a \83|\83C\83\93\83g\82ð\92è\8b`\82µ\82Ü\82·\81B
+//
+
+#include "stdafx.h"
+#include "dchk64.h"
+#include "../../DCHookTest/HookLoader.h"
+#include "../DCHook64.h"
+
+#define MAX_LOADSTRING 100
+
+// \83O\83\8d\81[\83o\83\8b\95Ï\90\94:
+HINSTANCE hInst;                                                               // \8c»\8dÝ\82Ì\83C\83\93\83^\81[\83t\83F\83C\83X
+TCHAR szTitle[MAX_LOADSTRING];                                 // \83^\83C\83g\83\8b \83o\81[\82Ì\83e\83L\83X\83g
+TCHAR szWindowClass[MAX_LOADSTRING];                   // \83\81\83C\83\93 \83E\83B\83\93\83h\83\83N\83\89\83X\96¼
+
+const char *StrDCHOOKDLL = "DKPUHK64.dll";
+THookLoader HookDll(StrDCHOOKDLL);
+
+HWND hWnd = NULL;
+HWND hwndParent = NULL;
+HANDLE hMutex = NULL;
+bool WindowsNT = true;
+
+#ifdef _DEBUG
+#define        DBW     dbw
+#else
+#define        DBW
+#endif
+void dbw( const char *format, ... );
+
+// \82±\82Ì\83R\81[\83\83\82\83W\83\85\81[\83\8b\82É\8aÜ\82Ü\82ê\82é\8aÖ\90\94\82Ì\90é\8c¾\82ð\93]\91\97\82µ\82Ü\82·:
+ATOM MyRegisterClass(HINSTANCE hInstance);
+BOOL InitInstance(HINSTANCE, LPTSTR lpCmdLine, int);
+void Cleanup();
+LRESULT CALLBACK       WndProc(HWND, UINT, WPARAM, LPARAM);
+
+int atox( const TCHAR *str, TCHAR **next );
+
+int APIENTRY _tWinMain(HINSTANCE hInstance,
+                     HINSTANCE hPrevInstance,
+                     LPTSTR    lpCmdLine,
+                     int       nCmdShow)
+{
+       UNREFERENCED_PARAMETER(hPrevInstance);
+       //UNREFERENCED_PARAMETER(lpCmdLine);
+
+       MSG msg;
+       HACCEL hAccelTable;
+
+       // \83O\83\8d\81[\83o\83\8b\95\8e\9a\97ñ\82ð\8f\89\8aú\89»\82µ\82Ä\82¢\82Ü\82·\81B
+       LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
+       LoadString(hInstance, IDC_DCHK64, szWindowClass, MAX_LOADSTRING);
+       MyRegisterClass(hInstance);
+
+       // \83A\83v\83\8a\83P\81[\83V\83\87\83\93\82Ì\8f\89\8aú\89»\82ð\8eÀ\8ds\82µ\82Ü\82·:
+       if (!InitInstance (hInstance, lpCmdLine, nCmdShow))
+       {
+               return FALSE;
+       }
+
+       hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_DCHK64));
+
+       // \83\81\83C\83\93 \83\81\83b\83Z\81[\83\83\8b\81[\83v:
+       while (GetMessage(&msg, NULL, 0, 0))
+       {
+               if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
+               {
+                       TranslateMessage(&msg);
+                       DispatchMessage(&msg);
+               }
+       }
+
+       Cleanup();
+
+       return (int) msg.wParam;
+}
+
+
+
+//
+//  \8aÖ\90\94: MyRegisterClass()
+//
+//  \96Ú\93I: \83E\83B\83\93\83h\83\83N\83\89\83X\82ð\93o\98^\82µ\82Ü\82·\81B
+//
+//  \83R\83\81\83\93\83g:
+//
+//    \82±\82Ì\8aÖ\90\94\82¨\82æ\82Ñ\8eg\82¢\95û\82Í\81A'RegisterClassEx' \8aÖ\90\94\82ª\92Ç\89Á\82³\82ê\82½
+//    Windows 95 \82æ\82è\91O\82Ì Win32 \83V\83X\83e\83\80\82Æ\8cÝ\8a·\82³\82¹\82é\8fê\8d\87\82É\82Ì\82Ý\95K\97v\82Å\82·\81B
+//    \83A\83v\83\8a\83P\81[\83V\83\87\83\93\82ª\81A\8aÖ\98A\95t\82¯\82ç\82ê\82½
+//    \90³\82µ\82¢\8c`\8e®\82Ì\8f¬\82³\82¢\83A\83C\83R\83\93\82ð\8eæ\93¾\82Å\82«\82é\82æ\82¤\82É\82·\82é\82É\82Í\81A
+//    \82±\82Ì\8aÖ\90\94\82ð\8cÄ\82Ñ\8fo\82µ\82Ä\82­\82¾\82³\82¢\81B
+//
+ATOM MyRegisterClass(HINSTANCE hInstance)
+{
+       WNDCLASSEX wcex;
+
+       wcex.cbSize = sizeof(WNDCLASSEX);
+
+       wcex.style                      = CS_HREDRAW | CS_VREDRAW;
+       wcex.lpfnWndProc        = WndProc;
+       wcex.cbClsExtra         = 0;
+       wcex.cbWndExtra         = 0;
+       wcex.hInstance          = hInstance;
+       wcex.hIcon                      = NULL; //LoadIcon(hInstance, MAKEINTRESOURCE(IDI_PDHK64));
+#ifdef _DEBUG
+       wcex.hCursor            = LoadCursor(NULL, IDC_ARROW);
+       wcex.hbrBackground      = (HBRUSH)(COLOR_WINDOW+1);
+#else
+       wcex.hCursor            = NULL; //LoadCursor(NULL, IDC_ARROW);
+       wcex.hbrBackground      = NULL; //(HBRUSH)(COLOR_WINDOW+1);
+#endif
+       wcex.lpszMenuName       = NULL; //MAKEINTRESOURCE(IDC_PDHK64);
+       wcex.lpszClassName      = szWindowClass;
+       wcex.hIconSm            = NULL; //LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
+
+       return RegisterClassEx(&wcex);
+}
+
+//
+//   \8aÖ\90\94: InitInstance(HINSTANCE, LPTSTR, int)
+//
+//   \96Ú\93I: \83C\83\93\83X\83^\83\93\83\83n\83\93\83h\83\8b\82ð\95Û\91\82µ\82Ä\81A\83\81\83C\83\93 \83E\83B\83\93\83h\83E\82ð\8dì\90¬\82µ\82Ü\82·\81B
+//
+//   \83R\83\81\83\93\83g:
+//
+//        \82±\82Ì\8aÖ\90\94\82Å\81A\83O\83\8d\81[\83o\83\8b\95Ï\90\94\82Å\83C\83\93\83X\83^\83\93\83\83n\83\93\83h\83\8b\82ð\95Û\91\82µ\81A
+//        \83\81\83C\83\93 \83v\83\8d\83O\83\89\83\80 \83E\83B\83\93\83h\83E\82ð\8dì\90¬\82¨\82æ\82Ñ\95\\8e¦\82µ\82Ü\82·\81B
+//
+BOOL InitInstance(HINSTANCE hInstance, LPTSTR lpCmdLine, int nCmdShow)
+{
+   hInst = hInstance; // \83O\83\8d\81[\83o\83\8b\95Ï\90\94\82É\83C\83\93\83X\83^\83\93\83X\8f\88\97\9d\82ð\8ai\94[\82µ\82Ü\82·\81B
+
+       TCHAR ModuleName[_MAX_PATH];
+       GetModuleFileName(NULL, ModuleName, sizeof(ModuleName)/sizeof(TCHAR));
+       hMutex = CreateMutex(NULL, FALSE, ModuleName);
+       if (GetLastError()==ERROR_ALREADY_EXISTS){
+               return FALSE;   // dup launched
+       }
+
+#ifdef _DEBUG
+       const int width = 800;
+       const int height = 400;
+#else
+       const int width = 0;
+       const int height = 0;
+#endif
+
+   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
+      CW_USEDEFAULT, CW_USEDEFAULT, width, height, NULL, NULL, hInstance, NULL);
+
+   if (!hWnd)
+   {
+      return FALSE;
+   }
+
+       hwndParent = (HWND)(LONG_PTR)atox(lpCmdLine, NULL);
+       //DBW("hwndParent=%d", (int)(LONG_PTR)hwndParent);
+       if (hwndParent){
+               PostMessage(hwndParent, UM_SHORTCUT, SCINX_NOTIFY64, (LPARAM)hWnd);
+               //DBW("Posted");
+       }
+
+#ifdef _DEBUG
+   ShowWindow(hWnd, nCmdShow);
+   UpdateWindow(hWnd);
+#endif
+
+   return TRUE;
+}
+
+void Cleanup()
+{
+       if (hMutex){
+               CloseHandle(hMutex);
+               hMutex = NULL;
+       }
+}
+
+//
+//  \8aÖ\90\94: WndProc(HWND, UINT, WPARAM, LPARAM)
+//
+//  \96Ú\93I:  \83\81\83C\83\93 \83E\83B\83\93\83h\83E\82Ì\83\81\83b\83Z\81[\83W\82ð\8f\88\97\9d\82µ\82Ü\82·\81B
+//
+//  WM_COMMAND - \83A\83v\83\8a\83P\81[\83V\83\87\83\93 \83\81\83j\83\85\81[\82Ì\8f\88\97\9d
+//  WM_PAINT   - \83\81\83C\83\93 \83E\83B\83\93\83h\83E\82Ì\95`\89æ
+//  WM_DESTROY - \92\86\8e~\83\81\83b\83Z\81[\83W\82ð\95\\8e¦\82µ\82Ä\96ß\82é
+//
+//
+LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
+{
+       //int wmId, wmEvent;
+       PAINTSTRUCT ps;
+       HDC hdc;
+
+       switch (message)
+       {
+       case WM_CREATE:
+               HookDll.Load(hWnd);
+#ifdef _DEBUG
+               {
+               if (!HookDll.Init(hWnd)){
+                       DBW("Hook.Init error");
+               }
+#if 0
+               HookDll.Config(-1, KA_POPUP, KF_CONTROL);
+               TDCHConfig cfg;
+               memset(&cfg, 0, sizeof(cfg));
+               cfg.UseAMODI = 0;
+               cfg.MoveSend = 0;
+               cfg.ScaleX = 0;
+               cfg.ScaleY = 0;
+               HookDll.Config2(&cfg);
+#endif
+               }
+#endif
+               break;
+#if 0
+       case WM_COMMAND:
+               wmId    = LOWORD(wParam);
+               wmEvent = HIWORD(wParam);
+               // \91I\91ð\82³\82ê\82½\83\81\83j\83\85\81[\82Ì\89ð\90Í:
+               switch (wmId)
+               {
+               case IDM_ABOUT:
+                       DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
+                       break;
+               case IDM_EXIT:
+                       DestroyWindow(hWnd);
+                       break;
+               default:
+                       return DefWindowProc(hWnd, message, wParam, lParam);
+               }
+               break;
+#endif
+       case WM_PAINT:
+               hdc = BeginPaint(hWnd, &ps);
+               EndPaint(hWnd, &ps);
+               break;
+       case WM_DESTROY:
+               PostQuitMessage(0);
+               break;
+
+       case WM_COPYDATA:
+               {
+               COPYDATASTRUCT *cds = (COPYDATASTRUCT*)lParam;
+               if ( !cds ) break;
+               switch (cds->dwData){
+                       case HDC_Init:
+                               {
+                               HDCInitParam &p = *(HDCInitParam*)cds->lpData;
+                               return HookDll.Init(p.hwnd);
+                               }
+                       case HDC_Uninit:
+                               HookDll.Uninit();
+                               break;
+                       case HDC_Config:
+                               {
+                               HDCConfigParam &p = *(HDCConfigParam*)cds->lpData;
+                               return HookDll.Config(p.clickonly, p.keyaction, p.keyflag);
+                               }
+                       case HDC_Config2:
+                               return HookDll.Config2((TDCHConfig*)cds->lpData);
+                       case HDC_Capture:
+                               return HookDll.Capture();
+                       case HDC_CaptureAsync:
+                               return HookDll.CaptureAsync();
+                       case HDC_CaptureAsyncWait:
+                               return HookDll.CaptureAsyncWait();
+                       case HDC_Debug:
+                               return HookDll.Debug();
+               }
+               }
+               break;
+       default:
+               return DefWindowProc(hWnd, message, wParam, lParam);
+       }
+       return 0;
+}
+
+int atox( const TCHAR *str, TCHAR **next )
+{
+       unsigned val = 0;
+       while ( 1 )
+       {
+               TCHAR c = *str;
+               if ( c >= '0' && c <= '9' ){
+                       val = (val<<4) + (c - '0');
+               } else if ( c >= 'A' && c <= 'F' ){
+                       val = (val<<4) + ( c - 'A' + 10 );
+               } else if ( c >= 'a' && c <= 'f' ){
+                       val = (val<<4) + ( c - 'a' + 10 );
+               } else {
+                       break;
+               }
+               str++;
+       }
+       if ( next ) *next = (TCHAR*)str;
+       return val;
+}
+
+static HWND hWin = NULL;
+static const TCHAR *clsnameW = _T("TDbgMsgForm");
+static const TCHAR *winnameW = _T("Debug Messenger");
+
+void dbw( const char *format, ... )
+{
+       if ( !hWin ){
+               hWin = FindWindow( clsnameW, winnameW );
+               if ( !hWin ) return;
+       }
+       va_list ap;
+       va_start( ap, format );
+       char buf[ 2048 ];
+       wvsprintfA( buf, format, ap );
+       COPYDATASTRUCT cds;
+       cds.dwData = 1; // Indicate String
+       cds.cbData = (DWORD)strlen(buf)+1;
+       cds.lpData = buf;
+       SendMessageA( hWin, WM_COPYDATA, NULL, (LPARAM)&cds );
+       va_end( ap );
+}
+
+static const char *MyWinTitle = "<Processing...>";
+HANDLE WinExecEx( const char *cmd, int show, const char *dir, const char *title )
+{
+       STARTUPINFO sui;
+       memset( &sui, 0, sizeof(STARTUPINFO) );
+       sui.cb = sizeof(STARTUPINFO);
+       sui.dwFlags = STARTF_USESHOWWINDOW;
+       sui.wShowWindow = (WORD)show;
+       sui.lpTitle = (LPTSTR)(title ? title : MyWinTitle);
+       PROCESS_INFORMATION pi;
+       if ( !CreateProcess( NULL, (LPTSTR)cmd, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, dir, &sui, &pi ) )
+               return NULL;
+       return pi.hProcess;
+}
diff --git a/DCHook64/dchk64/dchk64.h b/DCHook64/dchk64/dchk64.h
new file mode 100644 (file)
index 0000000..d00d47e
--- /dev/null
@@ -0,0 +1,3 @@
+#pragma once
+
+#include "resource.h"
diff --git a/DCHook64/dchk64/dchk64.ico b/DCHook64/dchk64/dchk64.ico
new file mode 100644 (file)
index 0000000..d551aa3
Binary files /dev/null and b/DCHook64/dchk64/dchk64.ico differ
diff --git a/DCHook64/dchk64/dchk64.rc b/DCHook64/dchk64/dchk64.rc
new file mode 100644 (file)
index 0000000..11dfb49
Binary files /dev/null and b/DCHook64/dchk64/dchk64.rc differ
diff --git a/DCHook64/dchk64/dchk64.sln b/DCHook64/dchk64/dchk64.sln
new file mode 100644 (file)
index 0000000..4f667e0
--- /dev/null
@@ -0,0 +1,26 @@
+
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dchk64", "dchk64.vcxproj", "{5CBB6025-CCD7-40F7-8279-2B633DFA63CA}"
+EndProject
+Global
+       GlobalSection(SolutionConfigurationPlatforms) = preSolution
+               Debug|Win32 = Debug|Win32
+               Debug|x64 = Debug|x64
+               Release|Win32 = Release|Win32
+               Release|x64 = Release|x64
+       EndGlobalSection
+       GlobalSection(ProjectConfigurationPlatforms) = postSolution
+               {5CBB6025-CCD7-40F7-8279-2B633DFA63CA}.Debug|Win32.ActiveCfg = Debug|Win32
+               {5CBB6025-CCD7-40F7-8279-2B633DFA63CA}.Debug|Win32.Build.0 = Debug|Win32
+               {5CBB6025-CCD7-40F7-8279-2B633DFA63CA}.Debug|x64.ActiveCfg = Debug|x64
+               {5CBB6025-CCD7-40F7-8279-2B633DFA63CA}.Debug|x64.Build.0 = Debug|x64
+               {5CBB6025-CCD7-40F7-8279-2B633DFA63CA}.Release|Win32.ActiveCfg = Release|x64
+               {5CBB6025-CCD7-40F7-8279-2B633DFA63CA}.Release|Win32.Build.0 = Release|x64
+               {5CBB6025-CCD7-40F7-8279-2B633DFA63CA}.Release|x64.ActiveCfg = Release|x64
+               {5CBB6025-CCD7-40F7-8279-2B633DFA63CA}.Release|x64.Build.0 = Release|x64
+       EndGlobalSection
+       GlobalSection(SolutionProperties) = preSolution
+               HideSolutionNode = FALSE
+       EndGlobalSection
+EndGlobal
diff --git a/DCHook64/dchk64/dchk64.suo b/DCHook64/dchk64/dchk64.suo
new file mode 100644 (file)
index 0000000..e43c8d0
Binary files /dev/null and b/DCHook64/dchk64/dchk64.suo differ
diff --git a/DCHook64/dchk64/dchk64.vcxproj b/DCHook64/dchk64/dchk64.vcxproj
new file mode 100644 (file)
index 0000000..2d169ec
--- /dev/null
@@ -0,0 +1,162 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup Label="ProjectConfigurations">
+    <ProjectConfiguration Include="Debug|Win32">
+      <Configuration>Debug</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Debug|x64">
+      <Configuration>Debug</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|Win32">
+      <Configuration>Release</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|x64">
+      <Configuration>Release</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+  </ItemGroup>
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{5CBB6025-CCD7-40F7-8279-2B633DFA63CA}</ProjectGuid>
+    <Keyword>Win32Proj</Keyword>
+    <RootNamespace>dchk64</RootNamespace>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <CharacterSet>MultiByte</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <CharacterSet>MultiByte</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>MultiByte</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>MultiByte</CharacterSet>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ImportGroup Label="ExtensionSettings">
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <PropertyGroup Label="UserMacros" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <LinkIncremental>true</LinkIncremental>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <LinkIncremental>true</LinkIncremental>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <LinkIncremental>false</LinkIncremental>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <LinkIncremental>false</LinkIncremental>
+  </PropertyGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <ClCompile>
+      <PrecompiledHeader>Use</PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>Disabled</Optimization>
+      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);USE_UNICODE</PreprocessorDefinitions>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <ClCompile>
+      <PrecompiledHeader>Use</PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>Disabled</Optimization>
+      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions);USE_UNICODE</PreprocessorDefinitions>
+      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <ClCompile>
+      <WarningLevel>Level3</WarningLevel>
+      <PrecompiledHeader>Use</PrecompiledHeader>
+      <Optimization>MaxSpeed</Optimization>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);USE_UNICODE</PreprocessorDefinitions>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <OptimizeReferences>true</OptimizeReferences>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <ClCompile>
+      <WarningLevel>Level3</WarningLevel>
+      <PrecompiledHeader>Use</PrecompiledHeader>
+      <Optimization>MaxSpeed</Optimization>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions);USE_UNICODE</PreprocessorDefinitions>
+      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <OptimizeReferences>true</OptimizeReferences>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemGroup>
+    <None Include="dchk64.ico" />
+    <None Include="ReadMe.txt" />
+    <None Include="small.ico" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="dchk64.h" />
+    <ClInclude Include="Resource.h" />
+    <ClInclude Include="stdafx.h" />
+    <ClInclude Include="targetver.h" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="..\..\DCHookTest\HookLoader.cpp" />
+    <ClCompile Include="dchk64.cpp" />
+    <ClCompile Include="stdafx.cpp">
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
+    </ClCompile>
+  </ItemGroup>
+  <ItemGroup>
+    <ResourceCompile Include="dchk64.rc" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+  <ImportGroup Label="ExtensionTargets">
+  </ImportGroup>
+</Project>
\ No newline at end of file
diff --git a/DCHook64/dchk64/dchk64.vcxproj.filters b/DCHook64/dchk64/dchk64.vcxproj.filters
new file mode 100644 (file)
index 0000000..25f1275
--- /dev/null
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup>
+    <Filter Include="ソース ファイル">
+      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+    </Filter>
+    <Filter Include="ヘッダー ファイル">
+      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
+    </Filter>
+    <Filter Include="リソース ファイル">
+      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
+      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
+    </Filter>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="ReadMe.txt" />
+    <None Include="small.ico">
+      <Filter>リソース ファイル</Filter>
+    </None>
+    <None Include="dchk64.ico">
+      <Filter>リソース ファイル</Filter>
+    </None>
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="stdafx.h">
+      <Filter>ヘッダー ファイル</Filter>
+    </ClInclude>
+    <ClInclude Include="targetver.h">
+      <Filter>ヘッダー ファイル</Filter>
+    </ClInclude>
+    <ClInclude Include="Resource.h">
+      <Filter>ヘッダー ファイル</Filter>
+    </ClInclude>
+    <ClInclude Include="dchk64.h">
+      <Filter>ヘッダー ファイル</Filter>
+    </ClInclude>
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="stdafx.cpp">
+      <Filter>ソース ファイル</Filter>
+    </ClCompile>
+    <ClCompile Include="dchk64.cpp">
+      <Filter>ソース ファイル</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\DCHookTest\HookLoader.cpp">
+      <Filter>ソース ファイル</Filter>
+    </ClCompile>
+  </ItemGroup>
+  <ItemGroup>
+    <ResourceCompile Include="dchk64.rc">
+      <Filter>リソース ファイル</Filter>
+    </ResourceCompile>
+  </ItemGroup>
+</Project>
\ No newline at end of file
diff --git a/DCHook64/dchk64/small.ico b/DCHook64/dchk64/small.ico
new file mode 100644 (file)
index 0000000..d551aa3
Binary files /dev/null and b/DCHook64/dchk64/small.ico differ
diff --git a/DCHook64/dchk64/stdafx.cpp b/DCHook64/dchk64/stdafx.cpp
new file mode 100644 (file)
index 0000000..392ff0d
--- /dev/null
@@ -0,0 +1,8 @@
+// stdafx.cpp : \95W\8f\80\83C\83\93\83N\83\8b\81[\83h dchk64.pch \82Ì\82Ý\82ð
+// \8aÜ\82Þ\83\\81[\83\83t\83@\83C\83\8b\82Í\81A\83v\83\8a\83R\83\93\83p\83C\83\8b\8dÏ\82Ý\83w\83b\83_\81[\82É\82È\82è\82Ü\82·\81B
+// stdafx.obj \82É\82Í\83v\83\8a\83R\83\93\83p\83C\83\8b\8dÏ\82Ý\8c^\8fî\95ñ\82ª\8aÜ\82Ü\82ê\82Ü\82·\81B
+
+#include "stdafx.h"
+
+// TODO: \82±\82Ì\83t\83@\83C\83\8b\82Å\82Í\82È\82­\81ASTDAFX.H \82Å\95K\97v\82È
+// \92Ç\89Á\83w\83b\83_\81[\82ð\8eQ\8fÆ\82µ\82Ä\82­\82¾\82³\82¢\81B
diff --git a/DCHook64/dchk64/stdafx.h b/DCHook64/dchk64/stdafx.h
new file mode 100644 (file)
index 0000000..b5cf71f
--- /dev/null
@@ -0,0 +1,21 @@
+// stdafx.h : \95W\8f\80\82Ì\83V\83X\83e\83\80 \83C\83\93\83N\83\8b\81[\83\83t\83@\83C\83\8b\82Ì\83C\83\93\83N\83\8b\81[\83\83t\83@\83C\83\8b\81A\82Ü\82½\82Í
+// \8eQ\8fÆ\89ñ\90\94\82ª\91½\82­\81A\82©\82Â\82 \82Ü\82è\95Ï\8dX\82³\82ê\82È\82¢\81A\83v\83\8d\83W\83F\83N\83g\90ê\97p\82Ì\83C\83\93\83N\83\8b\81[\83\83t\83@\83C\83\8b
+// \82ð\8bL\8fq\82µ\82Ü\82·\81B
+//
+
+#pragma once
+
+#include "targetver.h"
+
+#define WIN32_LEAN_AND_MEAN             // Windows \83w\83b\83_\81[\82©\82ç\8eg\97p\82³\82ê\82Ä\82¢\82È\82¢\95\94\95ª\82ð\8f\9c\8aO\82µ\82Ü\82·\81B
+// Windows \83w\83b\83_\81\83t\83@\83C\83\8b:
+#include <windows.h>
+
+// C \83\89\83\93\83^\83C\83\80 \83w\83b\83_\81\83t\83@\83C\83\8b
+#include <stdlib.h>
+#include <malloc.h>
+#include <memory.h>
+#include <tchar.h>
+
+
+// TODO: \83v\83\8d\83O\83\89\83\80\82É\95K\97v\82È\92Ç\89Á\83w\83b\83_\81[\82ð\82±\82±\82Å\8eQ\8fÆ\82µ\82Ä\82­\82¾\82³\82¢\81B
diff --git a/DCHook64/dchk64/targetver.h b/DCHook64/dchk64/targetver.h
new file mode 100644 (file)
index 0000000..10b7ccd
--- /dev/null
@@ -0,0 +1,8 @@
+#pragma once
+
+// SDKDDKVer.h \82ð\83C\83\93\83N\83\8b\81[\83h\82·\82é\82Æ\81A\97\98\97p\82Å\82«\82é\8dÅ\82à\8fã\88Ê\82Ì Windows \83v\83\89\83b\83g\83t\83H\81[\83\80\82ª\92è\8b`\82³\82ê\82Ü\82·\81B
+
+// \88È\91O\82Ì Windows \83v\83\89\83b\83g\83t\83H\81[\83\80\97p\82É\83A\83v\83\8a\83P\81[\83V\83\87\83\93\82ð\83r\83\8b\83h\82·\82é\8fê\8d\87\82Í\81AWinSDKVer.h \82ð\83C\83\93\83N\83\8b\81[\83h\82µ\81A
+// SDKDDKVer.h \82ð\83C\83\93\83N\83\8b\81[\83h\82·\82é\91O\82É\81A\83T\83|\81[\83g\91Î\8fÛ\82Æ\82·\82é\83v\83\89\83b\83g\83t\83H\81[\83\80\82ð\8e¦\82·\82æ\82¤\82É _WIN32_WINNT \83}\83N\83\8d\82ð\90Ý\92è\82µ\82Ü\82·\81B
+
+#include <SDKDDKVer.h>
diff --git a/DCHookTest/DCHookLoader.cpp b/DCHookTest/DCHookLoader.cpp
new file mode 100644 (file)
index 0000000..dbf85b0
--- /dev/null
@@ -0,0 +1,292 @@
+#include <windows.h>
+#pragma        hdrstop
+#include <tchar.h>
+#include <System.hpp>
+#include "StringLib.h"
+#include "DCHookLoader.h"
+#include "HookLoader.h"
+#include "Util.h"
+
+// LoadHook()\82Íapplication\97§\82¿\8fã\82ª\82è\8e\9e\81A\82Ü\82½\82ÍConfiguration\8e\9e\82É\82P\89ñ\82¾\82¯\8cÄ\82Î\82ê\82é
+// UnloadHook()\82ÍLoadHook()\82Æ\95K\82¸\91Î\82Å\8eg\97p\82·\82é
+
+#define        USE_HOOK64              1
+
+#if USE_HOOK64
+#define        IsWow64()       (fWow64)
+#else
+#define        IsWow64()       (false)
+#endif
+
+/// THookArray ///
+THookArray::~THookArray()
+{
+       clear();
+}
+
+bool THookArray::Load(HWND hwnd)
+{
+       bool ret = true;
+       foreach(Hooks, it, hook_vec){
+               if (!(*it)->Load(hwnd)){
+                       ret = false;
+                       break;
+               }
+       }
+       return ret;
+}
+void THookArray::Unload()
+{
+       foreach(Hooks, it, hook_vec){
+               (*it)->Unload();
+       }
+}
+void THookArray::Uninit()
+{
+       foreach(Hooks, it, hook_vec){
+               (*it)->Uninit();
+       }
+}
+bool THookArray::Init(HWND hwnd)
+{
+       DBW("HookArray::Init");
+       bool ret = true;
+#if 0  // debug code
+       DBW("Init1"); Hooks[1]->Init(hwnd);     // 64bit
+       DBW("Init0"); Hooks[0]->Init(hwnd);     // 32bit
+#else
+       foreach(Hooks, it, hook_vec){
+               if (!(*it)->Init(hwnd)){
+                       ret = false;
+               }
+       }
+#endif
+       return ret;
+}
+void THookArray::Init32(HWND hwnd)
+{
+       Hooks[0]->Init(hwnd);
+}
+int THookArray::Config( int clickonly, int keyaction, int keyflag )
+{
+       foreach(Hooks, it, hook_vec){
+               (*it)->Config(clickonly, keyaction, keyflag);
+       }
+       return 0;
+}
+int THookArray::Config2( struct TDCHConfig *cfg )
+{
+       foreach(Hooks, it, hook_vec){
+               (*it)->Config2(cfg);
+       }
+       return 0;
+}
+int THookArray::Capture()
+{
+       int ret = 0;
+       foreach(Hooks, it, hook_vec){
+               if ((*it)->Capture())
+                       ret = 1;
+       }
+       return ret;
+}
+int THookArray::CaptureAsync()
+{
+       int ret = 0;
+       foreach(Hooks, it, hook_vec){
+               if ((*it)->CaptureAsync())
+                       ret = 1;
+       }
+       return ret;
+}
+int THookArray::CaptureAsyncWait()
+{
+       int ret = 0;
+       foreach(Hooks, it, hook_vec){
+               int r = (*it)->CaptureAsyncWait();
+               if (r!=0){
+                       ret = r;
+                       break;
+               }
+       }
+       return ret;
+}
+int THookArray::Debug()
+{
+       int ret = 0;
+       foreach(Hooks, it, hook_vec){
+               int r = (*it)->Debug();
+               if (r)
+                       ret = r;
+       }
+       return ret;
+}
+
+void THookArray::clear()
+{
+       Uninit();
+       foreach(Hooks, it, hook_vec){
+               delete *it;
+       }
+       Hooks.clear();
+}
+
+bool THookArray::IsLoaded()
+{
+       if (Hooks.size()==0)
+               return false;
+       return Hooks[0]->IsLoaded();
+}
+
+/// TDCHookLoader ///
+TDCHookLoader::TDCHookLoader(bool use64)
+       :Use64(use64)
+{
+       EnableSendAllKeys = false;
+       Hook64 = NULL;
+       Hook32 = NULL;
+       LoadPending = false;
+}
+#if !defined(DSKSVR) && !defined(DCHOOK)
+void TDCHookLoader::SaveProfile(const tchar *param_string)
+{
+       prof.WriteString(PFS_SHORTCUT, StrParams, param_string);
+}
+
+tnstr TDCHookLoader::LoadProfile()
+{
+       return prof.ReadString(PFS_SHORTCUT, StrParams, _T(""));
+}
+#endif
+
+bool TDCHookLoader::LoadHook( HWND hwndParent )
+{
+       if (Hooks.IsLoaded() || LoadPending) return true;
+
+       if (Hooks.size()==0){
+               Hooks.add(Hook32 = new THookLoader(NAME_DKPPHKDLL) );
+#ifdef _DEBUG
+               if (!DebugHook)
+#endif
+               {
+                       if (Use64 && IsWow64()){
+                               Hooks.add(Hook64 = new THookLoader64(hwndParent));
+                       }
+               }
+       }
+
+       if (!Hooks.Load(hwndParent)){
+               DBW("Hooks.Load failed");
+               return false;
+       }
+
+       if (Hook64 && Hook64->IsPending()){
+               LoadPending = true;
+               hwndSavedParent = hwndParent;
+               return true;
+       }
+
+       LoadHookPost(hwndParent);
+
+       return true;
+}
+
+void TDCHookLoader::LoadHookPost(HWND hwndParent)
+{
+       Hooks.Init(hwndParent);
+#if 0
+       int num = LoadKeyProfiles();
+       if ( num > 0 || EnableSendAllKeys ){
+               if ( !Hooks.InitHook( hwndParent, UM_SHORTCUT ) ){
+                       num = 0;
+               }
+       }
+
+#if !defined(DSKSVR) && !defined(DCHOOK)
+       //Note: SendAllKeys\82ð\97L\8cø\82É\82·\82é\82Æ32bitApp\8fã\82Å\93ñ\8fd\82É\83C\83x\83\93\83g\82ª\91\97\82ç\82ê\82Ä\82­\82é\81B\81i\8c´\88ö\95s\96¾\81j
+       // \82»\82Ì\82½\82ß\82±\82Ì\90Ý\92è\82¾\82¯\82Í32bit\91¤\82¾\82¯\97L\8cø\82É\82·\82é\81B
+       // \81i64bitApp\8fã\82Å\82Í\93ñ\8fd\82É\82È\82ç\82È\82¢\81j
+       // \82È\82¨\81A64bitHook\82¾\82¯\82ðload\82µ\82½\8fê\8d\87\82Í\83C\83x\83\93\83g\82ª\82Ü\82Á\82½\82­\82±\82È\82­\82È\82é\81i\82±\82ê\82à\8c´\88ö\95s\96¾\81j
+       if (Hook32)
+               Hook32->Add( NULL, EnableSendAllKeys, FUNC_SENDALLKEYS );
+#endif
+
+       if ( num == 0 && !EnableSendAllKeys ){
+               Hooks.Unload();
+       }
+#endif
+}
+
+void TDCHookLoader::UnloadHook()
+{
+       LoadPending = false;
+       if (!Hooks.IsLoaded()){
+               return;
+       }
+       //Hooks.FinishHook();
+       Hooks.Uninit();
+       Hooks.Unload();
+       //if ( fWindowsNT )
+       {
+#if 1  // \82µ\82Î\82ç\82­\82Í\82±\82Á\82¿\82Ì\95û\96@(C++Builder\82ª\91Î\89\9e\82µ\82Ä\82¢\82È\82¢ - \82Æ\82¢\82¤\82©\81AMS\82Ìbug\82Å\82¤\82Ü\82­link\82Å\82«\82È\82¢)
+               typedef long (WINAPI *FNBroadcastSystemMessage)
+                       (DWORD dwFlags,LPDWORD lpdwRecipients,UINT uiMessage,WPARAM wParam,LPARAM lParam);
+               HINSTANCE hDll = LoadLibrary( _T("user32") );
+               if ( hDll ){
+                       FNBroadcastSystemMessage _BroadcastSystemMessage = (FNBroadcastSystemMessage)GetProcAddress( hDll, "BroadcastSystemMessage");
+                       if ( _BroadcastSystemMessage ){
+                               UINT msg = RegisterWindowMessage( _T("wmBroadcastForUnhook") );
+                               if ( msg ){
+                                       DWORD receipt = BSM_APPLICATIONS;
+                                       _BroadcastSystemMessage( BSF_POSTMESSAGE, &receipt, msg, 0, 0 );        // Win95\82Å\82Ísupport\82³\82ê\82Ä\82¢\82È\82¢\8aÖ\90\94
+                               }
+                       }
+                       FreeLibrary( hDll );
+               }
+#else
+               UINT msg = RegisterWindowMessage( "wmBroadcastForUnhook" );
+               DWORD receipt = BSM_APPLICATIONS;
+               BroadcastSystemMessage( BSF_POSTMESSAGE, &receipt, msg, 0, 0 ); // Win95\82Å\82Ísupport\82³\82ê\82Ä\82¢\82È\82¢\8aÖ\90\94
+#endif
+       }
+}
+
+void TDCHookLoader::Config( int clickonly, int keyaction, int keyflag )
+{
+       Hooks.Config(clickonly, keyaction, keyflag);
+}
+void TDCHookLoader::Config2( struct TDCHConfig *cfg )
+{
+       Hooks.Config2(cfg);
+}
+
+void TDCHookLoader::Capture()
+{
+       Hooks.Capture();
+}
+void TDCHookLoader::CaptureAsync()
+{
+       Hooks.CaptureAsync();
+}
+void TDCHookLoader::CaptureAsyncWait()
+{
+       Hooks.CaptureAsyncWait();
+}
+void TDCHookLoader::Init32(HWND hwnd)
+{
+       Hooks.Init32(hwnd);
+}
+
+void TDCHookLoader::Notify64(LPARAM lParam)
+{
+       DBW("Notify64 : lParam=%08X Hook64=%08X", lParam, Hook64);
+       if (!Hook64 || !lParam)
+               return;
+       Hook64->Notify64();
+       Hook64->SetTarget((HWND)lParam);
+       if (LoadPending){
+               LoadHookPost(hwndSavedParent);
+               LoadPending = false;
+       }
+}
+
diff --git a/DCHookTest/DCHookLoader.h b/DCHookTest/DCHookLoader.h
new file mode 100644 (file)
index 0000000..d89325f
--- /dev/null
@@ -0,0 +1,96 @@
+#ifndef __DCHookLoader_h
+#define        __DCHookLoader_h
+
+#include <vector>
+using namespace std;
+
+enum eShortCutIndexes {
+       SCINX_AUTOSRCH_TOGGLE,
+       SCINX_AUTOSRCH_ON,
+       SCINX_AUTOSRCH_OFF,
+       SCINX_TOPMOST,
+       SCINX_TO_MAIN,
+       SCINX_QUICK_POPUP,
+       SCINX_POPUP_WINDOW,
+       SCINX_GROUP_CHANGE_1,
+       SCINX_GROUP_CHANGE_2,
+       SCINX_GROUP_CHANGE_3,
+       SCINX_GROUP_CHANGE_4,
+       SCINX_CBDSRCH,
+       SCINX_CLIPHISTORY,
+       SCINX_TAB_CHANGE_1,
+       SCINX_TAB_CHANGE_2,
+       SCINX_TAB_CHANGE_3,
+       SCINX_TAB_CHANGE_4,
+       SCINX_LAST,
+};
+
+#define        SCINX_NOTIFY64  (0x1000)        // notify from 64bit HookDll
+
+#include "HookDll.h"
+
+class THookArray : public THookDllI {
+protected:
+       typedef vector<THookDllI*> hook_vec;
+       vector<THookDllI*> Hooks;
+public:
+       virtual ~THookArray();
+       void add(THookDllI*dll)
+       {
+               Hooks.push_back(dll);
+       }
+       int size() const
+               { return Hooks.size(); }
+       virtual bool Load(HWND hwnd);
+       virtual void Unload();
+
+       virtual bool Init(HWND hwnd);
+       void Init32(HWND hwnd);
+       virtual void Uninit();
+       virtual int Config( int clickonly, int keyaction, int keyflag );
+       virtual int Config2( struct TDCHConfig *cfg );
+       virtual int Capture();
+       virtual int CaptureAsync();
+       virtual int CaptureAsyncWait();
+       virtual int Debug();
+       virtual bool IsLoaded();
+       THookDllI &operator [](int i)
+               { return *Hooks[i]; }
+protected:
+       void clear();
+};
+
+class TDCHookLoader {
+protected:
+       bool Use64;
+       bool EnableSendAllKeys;
+       THookArray Hooks;
+       class THookLoader64 *Hook64;    // reference pointer
+       class THookLoader *Hook32;              // reference pointer
+       bool LoadPending;
+       HWND hwndSavedParent;
+public:
+       TDCHookLoader(bool use64);
+       bool LoadHook( HWND hwndParent );
+       void UnloadHook();
+       void Config( int clickonly, int keyaction, int keyflag );
+       void Config2( struct TDCHConfig *cfg );
+       void Capture();
+       void CaptureAsync();
+       void CaptureAsyncWait();
+
+       // for 64bit OS
+       void Notify64(LPARAM lParam);
+       bool IsReady() const
+               { return !LoadPending; }
+
+       void Init32(HWND hwnd); // for debug
+protected:
+       void LoadHookPost(HWND hwndParent);
+       int LoadKeyProfiles( );
+};
+
+extern ::TDCHookLoader shortcut;
+
+#endif // __DCHookLoader_h
+
diff --git a/DCHookTest/DCHookMain.cpp b/DCHookTest/DCHookMain.cpp
new file mode 100644 (file)
index 0000000..cab3929
--- /dev/null
@@ -0,0 +1,1680 @@
+//---------------------------------------------------------------------------
+#include <vcl.h>
+#pragma hdrstop
+#include <tchar.h>
+#include "DCHookMain.h"
+#include <stdio.h>
+#include <shellapi.h>
+#include "StringLib.h"
+#include "PopupConfig.h"
+#include "Notify.h"
+#include "DCHookLoader.h"
+#include "prgprof.h"
+#include "MODINotifyDlg.h"
+#include "prgconfig.h"
+#include "OCRTextFrm.h"
+//---------------------------------------------------------------------------
+#pragma package(smart_init)
+
+/*------------------------------------------*/
+/*             Configuration                                           */
+/*------------------------------------------*/
+// Popup\82Ì\82½\82Ñ\82ÉDLL\82ðUnload/Load\82·\82é
+// \94½\89\9e\82µ\82È\82­\82È\82Á\82½\82Æ\82«\82Ì\82½\82ß\82Ì\91Î\8fÇ\97Ã\96@
+// Note: 2013.3.12
+//     inc.srch ON\82Ì\82Æ\82«\81AMoveSent\82ª\8fí\82Éreset\82³\82ê\82Ä\82µ\82Ü\82¤\82½\82ß\81A
+//     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
+//     \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
+#define        DETACHRELEASE           0
+
+#define        MIGROUP_INDEX           1               // \8e«\8f\91\83O\83\8b\81[\83v\95Ï\8dX\83\81\83j\83\85\81[\82Ìindex
+
+// PDIC\8bN\93®\8cã\82ÌOpenLink()\8e¸\94s\8e\9e\82Ìretry\82¨\82æ\82Ñwaittime
+#define        OPEN_RETRY                      5
+#define        OPEN_WAITTIME           500             // [mSec]
+
+#define        DPI_DETECT                      0               // DPI Detect in main (monitor\82²\82Æ\82Ì\90Ý\92è\82ª\82Å\82«\82È\82¢\82½\82ßdebug\97p)
+
+#define        DEF_USE64                       (false)
+
+/*------------------------------------------*/
+/*             Definitions                                                     */
+/*------------------------------------------*/
+#define        URL_MODI_INSTALL        "http://support.microsoft.com/kb/982760"
+
+#define        DEF_POPUPKEY            (KF_CONTROL)
+#define        DEF_TOGGLEKEY           (KF_CONTROL+KF_MENU)
+
+#define        WM_AMODI                        (WM_APP+0x400)  // app communication message with AMODI
+
+#define        FLG_MOVESEND            0x40000000      // mouse move send
+
+#pragma resource "*.dfm"
+TDCHookMainForm *DCHookMainForm;
+
+#define        COMPANYNAME     "Software\\DokoPopProject\\"
+
+bool Reboot = false;
+
+/*------------------------------------------*/
+/*             Prototypes                                                      */
+/*------------------------------------------*/
+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 );
+#endif;
+void GetGroupList(TMyIni &ini, TStringList &list);
+#if DPI_DETECT
+int GetMonitorScale();
+#endif
+
+//---------------------------------------------------------------------------
+__fastcall TDCHookMainForm::TDCHookMainForm(TComponent* Owner)
+       : TForm(Owner)
+{
+       hDll = NULL;
+       EnablePopup = true;
+
+       WindowsNT = false;
+
+       OSVERSIONINFO VersionInfo;
+       VersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+       GetVersionEx(&VersionInfo);
+       switch (VersionInfo.dwPlatformId){
+               case VER_PLATFORM_WIN32_NT:
+                       WindowsNT = true;
+                       break;
+       }
+       CheckWOW64();
+       BootUp = true;
+       Capturing = false;
+       PopupText = NULL;
+       DoPopupRetry = 0;
+       CaptureMode = CM_TEXT | CM_IMAGE;
+       AMODIAvail = false;
+       MouseIncSrch = false;
+}
+//---------------------------------------------------------------------------
+void __fastcall TDCHookMainForm::FormCreate(TObject *Sender)
+{
+       Ini = new TMyIni( HKEY_CURRENT_USER, COMPANYNAME APPREGNAME, true );
+//     DBW("Handle=%08X",Handle);
+
+#ifdef _DEBUG
+       Left = Ini->ReadInteger( PFS_MAIN, "Left", Left );
+       Top = Ini->ReadInteger( PFS_MAIN, "Top", Top );
+       Width = Ini->ReadInteger( PFS_MAIN, "Width", Width );
+       Height = Ini->ReadInteger( PFS_MAIN, "Height", Height );
+#endif
+
+       GroupOpen = Ini->ReadInteger( PFS_CONFIG, PFS_GROUPOPEN, false );
+       GroupName = Ini->ReadString( PFS_CONFIG, PFS_GROUPNAME, "" );
+       CtrlClose = Ini->ReadInteger( PFS_CONFIG, PFS_CTRLCLOSE, false );
+       IgnoreJ   = Ini->ReadInteger( PFS_CONFIG, PFS_IGNOREJ, true );
+       Banner    = Ini->ReadInteger( PFS_CONFIG, PFS_BANNER, true );
+
+#ifndef _DEBUG
+       BorderStyle = bsNone;
+
+       Memo->Visible = false;
+       Panel1->Visible = false;
+       Splitter1->Visible = false;
+       Menu->Items->Delete( 0 );
+       Image->Visible = true;
+//     Title->Caption = Title->Caption + "   " + StrVersion;
+//     Title->Align = alBottom;
+#if 0
+       Title->Visible = true;
+#endif
+
+       AnsiString bmp = ExtractFilePath( Application->ExeName );
+       bmp += NAME_BMPFILE;
+       if ( FileExists( bmp ) ){
+               Image->Picture->Bitmap->LoadFromFile( bmp );
+       }
+
+       Width = Image->Picture->Width;
+       Height = Image->Picture->Height;
+
+       // To center
+       Left += ( ( ( GetSystemMetrics( SM_CXSCREEN ) - ( Width ) ) / 2 + 4 ) & ~7 ) - Left;
+       Top += ( ( GetSystemMetrics( SM_CYSCREEN ) - ( Height ) ) / 2 ) - Top;
+#endif
+
+       SavedWidth = Width;
+
+#ifdef _DEBUG
+       BootTimer->Interval = 100;
+       Width = SavedWidth;
+       WindowState = wsNormal;
+#else
+       if ( !Banner ){
+               BootTimer->Interval = 10;
+               // \82È\82ñ\82ÆVisible = false;\82É\82·\82é\82Æ\81A
+               // \83A\83C\83R\83\93\89»\82µ\82½\82Æ\82«\81E\81E\81E\83A\83C\83R\83\93\82ª\95\\8e¦\82³\82ê\82é
+               // \83A\83C\83R\83\93\89»\82µ\82È\82¢\82Æ\82«\81E\81E\83A\83C\83R\83\93\82Í\8fo\82Ä\82±\82È\82¢
+               // \95Ï\82È\8ed\97l\81H
+               // \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@
+               // \8dÅ\8f\89\82©\82ç\82¸\82Á\82ÆVisible=false\82Æ\82¢\82¤\95û\96@\82à\82 \82é\82ª\81A
+               // 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\
+               // \82Ù\82©\82É\82¢\82¢\95û\96@\82ª\82 \82Á\82½\82æ\82¤\82È\8bC\82ª\82·\82é\82ª\81A\81A\81A\81
+               Width = 0;
+       } else {
+               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
+                                               // \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
+                                               // (\82½\82Ü\82½\82Ü\82¤\82Ü\82­\93®\82¢\82½:-)
+               Width = SavedWidth;
+               WindowState = wsNormal;
+       }
+#endif
+
+       //TODO: default=ON\82É\82·\82é\82Æ\95s\88À\92è\82É\82È\82é\82Ì\82Å\82µ\82Î\82ç\82­def=false
+       //MouseIncSrch = Ini->ReadInteger( PFS_CONFIG, PFS_INCSRCH, MouseIncSrch );
+       CaptureMode = Ini->ReadInteger( PFS_CONFIG, PFS_CAPTURE_MODE, CaptureMode );
+       InitAMODI();
+       btnOK->Left = (SavedWidth - btnOK->Width)>>1;
+       btnOK->Top = Height - btnOK->Height - 8;
+       lbVersion->Caption = StrVersion;
+       lbVersion->Left = btnOK->Left + btnOK->Width + 4;
+       lbVersion->Top = btnOK->Top;
+       
+       BootTimer->Enabled = true;
+
+       if (!AMODIAvail && (CaptureMode & CM_IMAGE)){
+               tmMODINotify->Enabled = true;
+       }
+
+//     Application->OnIdle = IdleHandler;
+}
+//---------------------------------------------------------------------------
+void __fastcall TDCHookMainForm::FormCloseQuery(TObject *Sender,
+         bool &CanClose)
+{
+       if (AMODIAvail){
+               TerminateAMODI();
+       }
+       if (OCRTextForm){
+               OCRTextForm->Visible = false;
+               delete OCRTextForm;
+               OCRTextForm = NULL;
+       }
+       RegisterTrayIcon( false );
+#ifdef _DEBUG
+       WINDOWPLACEMENT wp;
+       wp.length = sizeof(WINDOWPLACEMENT);
+       GetWindowPlacement( Handle, &wp );
+       RECT &rc = wp.rcNormalPosition;
+       Ini->WriteInteger( PFS_MAIN, "Left", rc.left );
+       Ini->WriteInteger( PFS_MAIN, "Top", rc.top );
+       Ini->WriteInteger( PFS_MAIN, "Width", rc.right - rc.left );
+       Ini->WriteInteger( PFS_MAIN, "Height", rc.bottom - rc.top );
+#endif
+
+       miUnhookClick( this );
+
+       delete Ini;
+       if (PopupText){
+               delete[] PopupText;
+               PopupText = NULL;
+       }
+}
+//---------------------------------------------------------------------------
+void __fastcall TDCHookMainForm::FormKeyPress(TObject *Sender, char &Key)
+{
+#ifndef _DEBUG
+       if ( Key == 0x1b ){
+               Key = 0;
+               Start();
+       }
+#endif
+}
+#if 0
+void __fastcall TDCHookMainForm::IdleHandler(TObject *sender, bool &done)
+{
+       if (NotifyAMODIEnabled){
+               NotifyAMODIEnabled = false;
+               NotifyAMODI();
+       }
+}
+#endif
+//---------------------------------------------------------------------------
+// Menu event
+//---------------------------------------------------------------------------
+void __fastcall TDCHookMainForm::miDicGroup(TObject *Sender)
+{
+       // \8e«\8f\91\83O\83\8b\81[\83v
+       AnsiString name = ((TMenuItem*)Sender)->Caption;
+       if ( name.Length() ){
+               OpenDicGroup( name.c_str() );
+       }
+}
+//---------------------------------------------------------------------------
+void __fastcall TDCHookMainForm::miClickOnlyClick(TObject *Sender)
+{
+       miClickOnly->Checked = !miClickOnly->Checked;
+       EnableClickOnly( miClickOnly->Checked );
+       MenuClosed();
+}
+//---------------------------------------------------------------------------
+void __fastcall TDCHookMainForm::miIncSearchClick(TObject *Sender)
+{
+       miIncSearch->Checked = !miIncSearch->Checked;
+       MouseIncSrch = miIncSearch->Checked;
+       Ini->WriteInteger( PFS_CONFIG, PFS_INCSRCH, MouseIncSrch );
+       SetupConfig2();
+       if (MouseIncSrch){
+               HWND hwnd = FindPdic();
+               if (hwnd){
+                       MoveToTop(hwnd);
+               }
+       }
+}
+//---------------------------------------------------------------------------
+#if 0  // change capture mode
+       if (!AMODIAvail && (CaptureMode & CM_IMAGE)){
+               InitAMODI();
+       }
+       if (AMODIAvail){
+               SetupConfig2();
+       } else {
+               NotifyAMODI();
+       }
+
+       MenuClosed();
+#endif
+//---------------------------------------------------------------------------
+void __fastcall TDCHookMainForm::miEnablePopupClick(TObject *Sender)
+{
+       if ( miEnablePopup->Checked ){
+               miUnhookClick( this );
+               EnablePopup = false;
+       } else {
+               miHookClick( this );
+               EnablePopup = true;
+       }
+       MenuClosed();
+}
+//---------------------------------------------------------------------------
+void __fastcall TDCHookMainForm::miOCRTextClick(TObject *Sender)
+{
+       if (!OCRTextForm) OCRTextForm = new TOCRTextForm(this);
+       OCRTextForm->Visible = true;
+}
+//---------------------------------------------------------------------------
+void __fastcall TDCHookMainForm::miOptionClick(TObject *Sender)
+{
+       if (PopupConfigDlg){
+               MoveToTop(PopupConfigDlg->Handle);
+               return;
+       }
+
+       // Configuration //
+       PopupConfigDlg = new TPopupConfigDlg( this );
+       PopupConfigDlg->cbGroupOpen->Checked = GroupOpen;
+       PopupConfigDlg->edGroupName->Text = GroupName;
+       PopupConfigDlg->SetPopupKey( Ini->ReadInteger( PFS_CONFIG, PFS_POPUPKEY, DEF_POPUPKEY ) );
+       PopupConfigDlg->SetToggleKey( Ini->ReadInteger( PFS_CONFIG, PFS_TOGGLEKEY, DEF_TOGGLEKEY ) );
+       PopupConfigDlg->cbCtrlClose->Checked = CtrlClose;
+       PopupConfigDlg->cbIgnoreJ->Checked = IgnoreJ;
+       PopupConfigDlg->cbBanner->Checked = Banner;
+       bool useAMODI = CaptureMode & CM_IMAGE ? true : false;
+       PopupConfigDlg->SetCaptureMode( CaptureMode );
+       PopupConfigDlg->SetScaler( Ini->ReadInteger(PFS_CONFIG, PFS_SCALE, 0) );
+       PopupConfigDlg->edAMODIPath->Text = AMODIPath;
+       PopupConfigDlg->SetMODIAvail( AMODIAvail );
+       bool use64 = Ini->ReadInteger(PFS_CONFIG, PFS_USE64, DEF_USE64);
+       PopupConfigDlg->cbUse64->Checked = use64;
+       SetForegroundWindow( PopupConfigDlg->Handle );
+       if ( PopupConfigDlg->ShowModal() == IDOK ){
+               GroupOpen = PopupConfigDlg->cbGroupOpen->Checked;
+               GroupName = PopupConfigDlg->edGroupName->Text;
+               CtrlClose = PopupConfigDlg->cbCtrlClose->Checked;
+               IgnoreJ = PopupConfigDlg->cbIgnoreJ->Checked;
+               Banner = PopupConfigDlg->cbBanner->Checked;
+               AMODIPath = PopupConfigDlg->edAMODIPath->Text;
+               Ini->WriteInteger( PFS_CONFIG, PFS_POPUPKEY,
+                       PopupConfigDlg->GetPopupKey() );
+               Ini->WriteInteger( PFS_CONFIG, PFS_TOGGLEKEY,
+                       PopupConfigDlg->GetToggleKey() );
+               CaptureMode = PopupConfigDlg->GetCaptureMode();
+               Ini->WriteInteger( PFS_CONFIG, PFS_CAPTURE_MODE, CaptureMode );
+               Ini->WriteInteger( PFS_CONFIG, PFS_SCALE, PopupConfigDlg->GetScaler() );
+               Ini->WriteString(PFS_CONFIG, PFS_AMODIPATH, AMODIPath.c_str());
+               Ini->WriteInteger(PFS_CONFIG, PFS_USE64, PopupConfigDlg->cbUse64->Checked);
+               SaveConfig();
+               SetupConfig();
+               if (!useAMODI && (CaptureMode & CM_IMAGE) && !AMODIAvail){
+                       // AMODI off->ON \82©\82 AMODI\82ª\82¢\82È\82¢\8fê\8d\87
+                       NotifyAMODI();
+               }
+               if (PopupConfigDlg->cbUse64->Checked != use64){
+                       // 64bit hook \95Ï\8dX\8e\9e
+                       Unhook();
+                       Hook();
+               }
+       }
+       delete PopupConfigDlg;
+       PopupConfigDlg = NULL;
+}
+void __fastcall TDCHookMainForm::miReadMeClick(TObject *Sender)
+{
+       ShowManual(Handle);
+}
+//---------------------------------------------------------------------------
+void __fastcall TDCHookMainForm::miAboutClick(TObject *Sender)
+{
+       // show version dialog
+#if 1
+       Width = SavedWidth;
+       btnOK->Visible = true;
+       btnOK->SetFocus();
+       Visible = true;
+#else
+       VersionDlg = new TVersionDlg( this );
+       VersionDlg->ShowModal();
+       delete VersionDlg;
+#endif
+}
+//---------------------------------------------------------------------------
+void __fastcall TDCHookMainForm::miCheckLatestClick(TObject *Sender)
+{
+       ShowLatestVersion();
+}
+//---------------------------------------------------------------------------
+void __fastcall TDCHookMainForm::miCloseClick(TObject *Sender)
+{
+       MenuClosed();
+}
+//---------------------------------------------------------------------------
+void __fastcall TDCHookMainForm::miReloadClick(TObject *Sender)
+{
+       // \8dÄ\8bN\93®
+       Unhook();
+       Hook();
+       MenuClosed();
+}
+//---------------------------------------------------------------------------
+void __fastcall TDCHookMainForm::miHookClick(TObject *Sender)
+{
+       if ( !Hook() ){
+               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 );
+               Close();
+       }
+}
+//---------------------------------------------------------------------------
+void __fastcall TDCHookMainForm::miUnhookClick(TObject *Sender)
+{
+       Unhook();
+}
+//---------------------------------------------------------------------------
+void __fastcall TDCHookMainForm::miConfigClick(TObject *Sender)
+{
+       miOptionClick(Sender);
+}
+//---------------------------------------------------------------------------
+void __fastcall TDCHookMainForm::miDdeTestClick(TObject *Sender)
+{
+#ifdef _DEBUG
+       DoPopup( _t("test"), NULL, false );
+#endif
+}
+//---------------------------------------------------------------------------
+void __fastcall TDCHookMainForm::miTestClick(TObject *Sender)
+{
+#ifdef _DEBUG
+#if 1
+       hDll->Init32(Handle);
+#endif
+#if 0
+       NotifyAMODI();
+#endif
+#if 0
+       miIncSearchClick(Sender);
+#endif
+#if 0
+       if (hDll){
+               hDll->Capture();
+       }
+#endif
+#endif // _DEBUG
+}
+//---------------------------------------------------------------------------
+void __fastcall TDCHookMainForm::miExitClick(TObject *Sender)
+{
+       Close();
+}
+//---------------------------------------------------------------------------
+// Popup on tray icon //
+void __fastcall TDCHookMainForm::pmTrayIconPopup(TObject *Sender)
+{
+       // Add group names to menu
+       TAppIni ini;
+       if ( !ini.hroot ){
+               return;
+       }
+
+       int sel = ini.ReadInteger( PFS_COMMON, PFS_GRPSEL, -1 );
+
+       TStringList *strs = new TStringList;
+       TMenuItem *sub = pmTrayIcon->Items->Items[MIGROUP_INDEX];
+       for ( ;sub->Count;){
+               sub->Delete(0);
+       }
+       GetGroupList(ini, *strs);
+       int index = 0;
+       for ( int i=0;i<strs->Count;i++ ){
+               AnsiString name = strs->Strings[i];
+               if (name.IsEmpty() || name.AnsiPos("::")==1){
+                       continue;       // Ignore the group.
+               }
+               TMenuItem *item = new TMenuItem( this );
+               item->Caption = name;
+               item->OnClick = miDicGroup;
+               sub->Add( item );
+               // Check current group name //
+               if ( sel == index ){
+                       item->Checked = true;
+               }
+               index++;
+       }
+       delete strs;
+       miGroup->Visible = sub->Count != 0;
+       // Check enable popup item //
+       miIncSearch->Checked = MouseIncSrch;
+       miEnablePopup->Checked = EnablePopup;
+
+       miOCRText->Visible = CaptureMode & CM_IMAGE ? true : false;
+}
+//---------------------------------------------------------------------------
+void __fastcall TDCHookMainForm::btnOKClick(TObject *Sender)
+{
+#ifndef _DEBUG
+       Width = 0;
+#endif
+       MenuClosed();
+}
+//---------------------------------------------------------------------------
+// Timers
+//---------------------------------------------------------------------------
+void __fastcall TDCHookMainForm::TestTimerTimer(TObject *Sender)
+{
+#ifdef _DEBUG
+#if 0
+       if ( DCDebug ){
+               char *p = (char*)DCDebug( );
+               if ( memcmp( share, p, COMPSIZE ) ){
+                       DBW("Different");
+                       for ( int i=0;i<COMPSIZE;i++ ){
+                               DBW("[%02X:%02X]", (unsigned char)share[i],(unsigned char)p[i]);
+                       }
+                       memcpy( share, p, COMPSIZE );
+               }
+       }
+#endif
+#endif
+}
+//---------------------------------------------------------------------------
+void __fastcall TDCHookMainForm::BootTimerTimer(TObject *Sender)
+{
+       Start();
+}
+//---------------------------------------------------------------------------
+// \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
+// \83A\83C\83R\83\93\82ª\83^\83X\83N\83o\81[\82É\8ec\82Á\82Ä\82µ\82Ü\82¤\81B\82È\82º\81H\81H
+void __fastcall TDCHookMainForm::tmMenuCloseTimer(TObject *Sender)
+{
+       Visible = true;
+       Visible = false;
+       ShowWindow( Application->Handle, SW_HIDE );
+       tmMenuClose->Enabled = false;
+}
+//---------------------------------------------------------------------------
+void __fastcall TDCHookMainForm::tmNotifyTimer(TObject *Sender)
+{
+       if ( NotifyForm ){
+               tmNotify->Enabled = false;
+               delete NotifyForm;
+               NotifyForm = NULL;
+       }
+}
+//---------------------------------------------------------------------------
+void __fastcall TDCHookMainForm::tmPopupTimer(TObject *Sender)
+{
+       PostMessage( Handle, WM_POPUP, PopupLoc | (PopupMoveSend ? FLG_MOVESEND :  0), (LPARAM)PopupText );
+       PopupText = NULL;       // release ownership
+       tmPopup->Enabled = false;       // stop timer
+}
+//---------------------------------------------------------------------------
+void __fastcall TDCHookMainForm::tmMouseMoveTimer(TObject *Sender)
+{
+       tmMouseMove->Enabled = false;
+
+       if (!hDll)
+               return;
+       //hDll->Capture();
+       hDll->CaptureAsync();
+}
+//---------------------------------------------------------------------------
+void __fastcall TDCHookMainForm::tmMODIInstallCheckTimer(TObject *Sender)
+{
+       if (MODIInstalled()){
+#if 0
+               Reboot();
+#else
+               // \8dÅ\8f\89\82Ìpopup\82Å\97\8e\82¿\82Ä\82µ\82Ü\82¤\81H
+               if (!AMODIAvail && (CaptureMode & CM_IMAGE)){
+                       InitAMODI();
+               }
+               if (AMODIAvail){
+                       SetupConfig2();
+               }
+#endif
+       }
+}
+//---------------------------------------------------------------------------
+void __fastcall TDCHookMainForm::tmMODINotifyTimer(TObject *Sender)
+{
+       tmMODINotify->Enabled = false;
+       if (!AMODIRunable()){
+               NotifyAMODI();
+       }
+}
+//---------------------------------------------------------------------------
+// Mouse Events
+//---------------------------------------------------------------------------
+void __fastcall TDCHookMainForm::ImageMouseDown(TObject *Sender,
+         TMouseButton Button, TShiftState Shift, int X, int Y)
+{
+       if ( BootUp ) return;
+       Capturing = true;
+       SetCapture( Handle );
+       CapPoint.x = X;
+       CapPoint.y = Y;
+}
+//---------------------------------------------------------------------------
+void __fastcall TDCHookMainForm::ImageMouseMove(TObject *Sender,
+         TShiftState Shift, int X, int Y)
+{
+       if ( Capturing ){
+               POINT pt;
+               GetCursorPos( &pt );
+               Left = pt.x - CapPoint.x;
+               Top = pt.y - CapPoint.y;
+       }
+}
+//---------------------------------------------------------------------------
+void __fastcall TDCHookMainForm::ImageMouseUp(TObject *Sender,
+         TMouseButton Button, TShiftState Shift, int X, int Y)
+{
+       if ( BootUp )
+               Start();
+       Capturing = false;
+}
+//---------------------------------------------------------------------------
+// User Functions
+//---------------------------------------------------------------------------
+void TDCHookMainForm::InitAMODI()
+{
+       AMODIPath = Ini->ReadString(PFS_CONFIG, PFS_AMODIPATH, AMODIPath.c_str());
+       SetupAMODI();
+}
+void TDCHookMainForm::Start()
+{
+       BootTimer->Enabled = false;
+#ifndef _DEBUG
+       ShowWindow( Application->Handle, SW_HIDE );
+       Visible = false;
+       Width = 0;
+#endif
+       if ( BootUp ){
+               RegisterTrayIcon( true );
+               miHookClick( this );
+               BootUp = false;
+       }
+}
+//---------------------------------------------------------------------------
+bool TDCHookMainForm::Hook()
+{
+       if ( hDll ){
+               DBW("Already hooked");
+               return true;    // already loaded
+       }
+
+       bool use64 = Ini->ReadInteger(PFS_CONFIG, PFS_USE64, false);
+       hDll = new TDCHookLoader(use64);
+       if (!hDll->LoadHook(Handle)){
+               DBW("Load failed");
+               delete hDll;
+               hDll = NULL;
+               return false;
+       }
+
+       miHook->Enabled = false;
+       miUnhook->Enabled = true;
+
+       if (hDll->IsReady()){
+               SetupConfig();
+               extern HWND hwnd64;
+               PostMessage(Handle, UM_SHORTCUT, SCINX_NOTIFY64, (LPARAM)hwnd64);
+       }
+
+       DBW("Hook OK");
+       
+       return true;
+}
+void TDCHookMainForm::Unhook()
+{
+       if ( !hDll ) return;
+
+       hDll->UnloadHook();
+       delete hDll;
+       hDll = NULL;
+
+       miHook->Enabled = true;
+       miUnhook->Enabled = false;
+}
+//---------------------------------------------------------------------------
+#ifdef _DEBUG
+// 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·
+int GetTextFromPoint( HDC hdc, const char *text, int pos )
+{
+       int len = lstrlen(text);
+       int left = 0;
+       int right = len;
+       SIZE sz;
+       int loc;
+       for(;;){
+               loc = (right + left)/2;
+               if ( right - left <= 1 ){
+                       break;
+               }
+               GetTextExtentPoint32A( hdc, text, loc, &sz );
+//             DBW("%08X %d %d %d %d", hdc, left, right, loc, sz.cx);
+               if ( pos < sz.cx ){
+                       right = loc;
+               } else {
+                       left = loc;
+               }
+       }
+       return (right+left)/2;
+}
+int GetTextFromPoint( HDC hdc, const wchar_t *text, int pos )
+{
+       int len = lstrlenW(text);
+       int left = 0;
+       int right = len;
+       SIZE sz;
+       int loc;
+       for(;;){
+               loc = (right + left)/2;
+               if ( right - left <= 1 ){
+                       break;
+               }
+               GetTextExtentPoint32W( hdc, text, loc, &sz );
+//             DBW("%08X %d %d %d %d", hdc, left, right, loc, sz.cx);
+               if ( pos < sz.cx ){
+                       right = loc;
+               } else {
+                       left = loc;
+               }
+       }
+       return (right+left)/2;
+}
+#endif
+void TDCHookMainForm::EvCopyData(TMessage& msg )
+{
+       COPYDATASTRUCT *cds = (COPYDATASTRUCT*)msg.LParam;
+       if ( !cds ){ return; }
+       switch ( cds->dwData ){
+               case DCH_MOVESEND:
+                       //DBW("DCH_MOVESEND");
+                       // mouse move message
+                       EvMoveSend(msg.WParam==0);
+                       break;
+               case DCH_START:
+                       CursorPoint = *(POINT*)cds->lpData;
+#ifdef _DEBUG
+                       PaintBox->Canvas->FillRect( PaintBox->Canvas->ClipRect );
+#endif
+                       if (PopupText){
+                               delete[] PopupText;
+                               PopupText = NULL;
+                       }
+                       break;
+               case DCH_END:
+               case DCH_END | DCH_MOVESEND:
+                       if ( PopupText ){
+                               PopupMoveSend = cds->dwData & DCH_MOVESEND ? true : false;
+                               PostMessage( Handle, WM_POPUP, PopupLoc | (PopupMoveSend ? FLG_MOVESEND : 0), (LPARAM)PopupText );
+                               if (OCRTextForm) OCRTextForm->SetText(PopupText);
+                               PopupText = NULL;       // release ownership
+                       }
+                       break;
+               case DCH_HITTEXT1:      // single char
+               {
+                       DBW("DCH_HITTEXT1");
+                       if (PopupText)
+                               delete[] PopupText;
+#ifdef USE_UNICODE
+                       // ANSI -> Unicode
+                       //*+++ \93®\8dì\96¢\8am\94F 2002.12.4
+                       PopupText = new tchar[ cds->cbData*2 + 1 ];
+                       // \91O\94¼\95\94\95ª
+                       PopupLoc = MultiByteToWideChar( CP_ACP, 0,
+                               (LPCSTR)cds->lpData, msg.WParam, PopupText, cds->cbData*2 );
+                       // \8cã\94¼\95\94\95ª
+                       int r = MultiByteToWideChar( CP_ACP, 0,
+                               &((char*)cds->lpData)[msg.WParam], cds->cbData-msg.WParam, &PopupText[PopupLoc], cds->cbData-PopupLoc );
+                       PopupText[PopupLoc+r] = '\0';
+#else  // !USE_UNICODE
+                       PopupText = new tchar[ cds->cbData + 1 ];
+                       memcpy( PopupText, cds->lpData, cds->cbData );
+                       PopupText[cds->cbData] = '\0';
+                       PopupLoc = msg.WParam;
+#ifdef _DEBUG
+                       Memo->Lines->Add( PopupText );
+                       edFound->Text = PopupText + msg.WParam;
+                       TestTimer->Enabled = true;
+                       if ( DCDebug ){
+                               char *p = (char*)DCDebug( );
+                               memcpy( share, p, COMPSIZE );
+                       }
+#endif
+#endif
+               }
+                       break;
+               case DCH_HITTEXT2:      // wide char
+               {
+                       DBW("DCH_HITTEXT2");
+                       if (PopupText)
+                               delete[] PopupText;
+#ifdef USE_UNICODE
+                       PopupText = new tchar[ cds->cbData + 1 ];
+                       memcpy( PopupText, cds->lpData, cds->cbData );
+                       PopupText[cds->cbData/sizeof(tchar)] = '\0';
+                       PopupLoc = msg.WParam;
+#else  // !USE_UNICODE
+                       // Unicode -> ANSI
+                       //*+++ \93®\8dì\96¢\8am\94F 2002.12.4
+                       PopupText = new tchar[ cds->cbData + 1 ];
+                       // \91O\94¼\95\94\95ª
+                       BOOL defchar;
+                       PopupLoc = WideCharToMultiByte( CP_ACP, 0,
+                               (wchar_t*)cds->lpData, msg.WParam,
+                               PopupText, cds->cbData, 0, &defchar );
+                       // \8cã\94¼\95\94\95ª
+                       int r = WideCharToMultiByte( CP_ACP, 0,
+                               &((wchar_t*)cds->lpData)[msg.WParam], (cds->cbData>>1)-msg.WParam,
+                               &PopupText[PopupLoc], cds->cbData-PopupLoc, 0, &defchar );
+                       PopupText[PopupLoc+r] = '\0';
+#endif
+               }
+                       break;
+#ifdef _DEBUG
+               case DCH_EXTTEXTOUTA:
+               case DCH_EXTTEXTOUTW:
+               {
+                       EMREXTTEXTOUTW *emr = (EMREXTTEXTOUTW*)cds->lpData;
+                       wchar_t *p = (wchar_t*) ( ((char*)emr) + emr->emrtext.offString );
+                       char *buf = NULL;
+#if 0
+                       char b[200];
+                       sprintf(b,"exScale=%f eyScale=%f ptlReference=(%d,%d)",emr->exScale, emr->eyScale, emr->emrtext.ptlReference.x, emr->emrtext.ptlReference.y );
+                       DBW(b);
+#endif
+                       if ( cds->dwData == DCH_EXTTEXTOUTW ){
+                               buf = new char[ emr->emrtext.nChars * 2 ];
+                               memset( buf, 0, emr->emrtext.nChars*2 );
+                               WideCharToMultiByte( CP_ACP, 0, p, emr->emrtext.nChars, buf, emr->emrtext.nChars * 2, NULL, NULL );
+                       }
+                       const char *text = buf ? buf : (char*)p;
+                       Memo->Lines->Add( text );
+                       PaintBox->Canvas->TextOut( emr->rclBounds.left, emr->rclBounds.top, text );
+
+                       if ( PtInRect( (RECT*)&emr->rclBounds, CursorPoint ) ){
+                               int loc = GetTextFromPoint( (HDC)msg.WParam, text, CursorPoint.x - emr->rclBounds.left );
+                               if ( loc != -1 ){
+                                       edFound->Text = text + loc;
+                               }
+                       }
+                       if ( buf )
+                               delete[] buf;
+               }
+                       break;
+#endif
+               case DCH_MENU:
+                       DokoPopMenu( false );
+                       break;
+               case DCH_TOGGLE:
+                       PostMessage( Handle, WM_TOGGLE, 0, 0 );
+                       break;
+               case WMCD_EXISTCHECK:   // exist check
+                       if ( cds->cbData != strlen(APPNAME)+1 ){
+                               msg.Result = false;
+                               return;
+                       }
+                       msg.Result = (memcmp( cds->lpData, APPNAME, strlen(APPNAME)+1 ) == 0);
+                       return;
+               case DCH_LAUNCH_AMODI:
+                       SetupAMODI();
+                       //Reboot();             // AMODI.exe\8dÄ\8bN\93®\82Å\82Í\89ð\8c\88\82Å\82«\82È\82¢\82½\82ß
+                       break;
+       }
+       return;
+}
+//---------------------------------------------------------------------------
+bool WaitTransaction( TDdeClientConv *dde )
+{
+#if 1
+       for ( int i=0;i<100000;i++ ){
+               Application->ProcessMessages();
+               if ( !dde->WaitStat ){
+//                     DBW("DCHook:Wait OK");
+                       return true;
+               }
+       }
+       DBW("DCHook:Wait failure");
+       return false;
+#else
+       return true;
+#endif
+}
+// ANSI\82Å\93n\82·\8fê\8d\87
+bool DdePoke( TDdeClientConv *dde, AnsiString Item, AnsiString Data )
+{
+#ifdef USE_UNICODE
+       int ansilen = Data.Length();
+       wchar_t *buf = new wchar_t[ansilen*2+1];
+       int len = MultiByteToWideChar( CP_ACP, 0,
+               (LPCSTR)Data.c_str(), ansilen, buf, ansilen*2 );
+       buf[len] = '\0';
+       bool r = DdePoke( dde, Item, (wchar_t*)buf );
+       delete[] buf;
+       return r;
+#else  // !USE_UNICODE
+       HSZ hszItem = DdeCreateStringHandle(ddeMgr->DdeInstId, Item.c_str(), CP_WINANSI );
+       if ( !hszItem ) return false;
+       HDDEDATA hszDat = DdeCreateDataHandle( ddeMgr->DdeInstId, Data.c_str(), Data.Length() + 1,
+               0, hszItem, dde->DdeFmt, 0);
+       bool r = false;
+       if ( hszDat ){
+               HDDEDATA hdata = DdeClientTransaction( (LPBYTE)hszDat, (DWORD)-1, (HCONV)dde->Conv, hszItem,
+               dde->DdeFmt, XTYP_POKE, 10000, NULL);
+               r = hdata ? true : false;
+       }
+       DdeFreeStringHandle (ddeMgr->DdeInstId, hszItem);
+       return r;
+#endif
+}
+#ifdef USE_UNICODE
+// Unicode\82Å\93n\82·\8fê\8d\87
+bool DdePoke( TDdeClientConv *dde, AnsiString Item, const wchar_t *Data )
+{
+       // Item\96¼\82ÍANSI\81A\83f\81[\83^\82ÍUNICODE //
+       int ddeFmt = /*dde->DdeFmt*/CF_UNICODETEXT;
+       HSZ hszItem = DdeCreateStringHandle(ddeMgr->DdeInstId, Item.c_str(), CP_WINANSI );
+       if ( !hszItem ) return false;
+       HDDEDATA hszDat = DdeCreateDataHandle( ddeMgr->DdeInstId, (LPBYTE)Data, (_tcslen(Data)+1)*sizeof(wchar_t),
+               0, hszItem, ddeFmt, 0);
+       bool r = false;
+       if ( hszDat ){
+               HDDEDATA hdata = DdeClientTransaction( (LPBYTE)hszDat, (DWORD)-1, (HCONV)dde->Conv, hszItem,
+               ddeFmt, XTYP_POKE, 10000, NULL);
+               r = hdata ? true : false;
+       }
+       DdeFreeStringHandle (ddeMgr->DdeInstId, hszItem);
+       return r;
+}
+#endif
+TDdeClientConv *TDCHookMainForm::OpenPdic( const char *topic )
+{
+       TDdeClientConv *PdicDde = new TDdeClientConv( this );
+
+       PdicDde->ConnectMode = ddeManual;
+       static int entry = 0;
+       PdicDde->Name = AnsiString("PdicDde") + (++entry);
+       PdicDde->ServiceApplication = DDE_SERVICE_NAME;
+       if ( !PdicDde->SetLink( DDE_SERVICE_NAME, topic ) ){
+               DBW("DCHook:Cannot SetLink");
+               delete PdicDde;
+               return NULL;
+       }
+       if ( !PdicDde->OpenLink( ) ){   // \82±\82±\82ª\92x\82¢\81I\81I
+               // PDIC auto launch
+               if ( LaunchPdic() ){
+                       for(int i=0;i<OPEN_RETRY;i++){
+                               if ( PdicDde->OpenLink() ){
+                                       return PdicDde;
+                               }
+                               Sleep(OPEN_WAITTIME);
+                       }
+               }
+               DBW("PDIC\82ª\8c©\82Â\82©\82è\82Ü\82¹\82ñ(OpenPdic)");
+               Application->MessageBox( "PDIC\82ª\8c©\82Â\82©\82è\82Ü\82¹\82ñ(OpenPdic)", APPNAME, MB_OK );
+               delete PdicDde;
+               return NULL;
+       }
+       return PdicDde;
+}
+#ifdef USE_UNICODE
+static const TCHAR *clsname = TEXT("TPdicMain.UnicodeClass");
+#else
+static const TCHAR *clsname = TEXT(DDE_SERVICE_NAME);
+#endif
+static const TCHAR *winname = NULL;
+HWND TDCHookMainForm::FindPdic( )
+{
+       HWND hWin = FindWindow( clsname, winname );
+       if ( !hWin ){
+               // PDIC auto launch
+               if ( LaunchPdic() ){
+                       hWin = FindWindow( clsname, winname );
+                       if ( !hWin ){
+                               DBW("PDIC\82ª\8c©\82Â\82©\82è\82Ü\82¹\82ñ(FindPdic)");
+                               Application->MessageBox( "PDIC\82ª\8c©\82Â\82©\82è\82Ü\82¹\82ñ(FindPdic)", APPNAME, MB_OK );
+                               return NULL;
+                       }
+               }
+       }
+       return hWin;
+}
+#if !USE_DDE
+LRESULT TDCHookMainForm::SendCopyData( HWND hwnd, int message, const char *str )
+{
+       COPYDATASTRUCT cds;
+       cds.dwData = message;
+       cds.lpData = (LPSTR)str;
+       cds.cbData = lstrlen(str)+1;
+       SendMessage( hwnd, WM_COPYDATA, (WPARAM)Handle, (LPARAM)&cds );
+}
+#endif
+void TDCHookMainForm::ClosePdic( TDdeClientConv *dde )
+{
+       dde->CloseLink();
+       delete dde;
+}
+bool TDCHookMainForm::DoPopup( const tchar *text, const tchar *prevtext, bool movesend )
+{
+       static int ct = 0;
+       if ( ct >= 1 ){
+               if (PopupText){
+                       // already pending
+                       DBW("Reentrant!!!!!");
+                       return true;
+               }
+               HWND hwnd = FindPopupWindow( );
+               if (hwnd){
+                       HWND hwndParent = GetParent( hwnd );
+                       if (hwndParent){
+                               DBW("Parent exist!!!!");
+                               hwnd = hwndParent;
+                       }
+                       DBW("Retry again:%d:%08X",ct,hwnd);
+                       // \95K\82¸PostMessage()\82Åclose\82·\82é\82±\82Æ\81B
+                       // CloseWindow()\82Å\82ÍPopup Winodow\82Ì\8f\89\8aú\89»\92\86\82É
+                       // close\8f\88\97\9d\82ð\8eÀ\8ds\82µ\82Ä\82µ\82Ü\82¢\81A
+                       // popup window\82ª\82¨\82©\82µ\82È\8fó\91Ô\82É\82Í\82¢\82Á\82Ä\82µ\82Ü\82¤\8fê\8d\87\82ª\82 \82é
+                       PostMessage( hwnd, WM_CLOSE, 0, 0 );
+                       return false;
+               } else {
+                       if (ct >= 1 ){
+                               DBW("Not found popup window");
+                               if (DoPopupRetry++ > 10){
+                                       DoPopupRetry = 0;
+                                       return true;    // abort
+                               } else {
+                                       return false;   // retry
+                               }
+                       }
+               }
+       }
+       DoPopupRetry = 0;
+       ct++;
+
+#if USE_DDE
+       // Windows9x\82Å\82Í\81ADDE transaction\82ª\92x\82¢\82Æ\82«\82ª\82 \82é
+       // why? - because of 24bit OS:-)
+       // ->\82Æ\8ev\82Á\82Ä\81AWM_COPYDATA version\82ð\8dì\82Á\82Ä\82¢\82½\82ç\91¬\82­\82È\82Á\82½\81H\81H\81H
+       // ->WM_COPYDATA\89» project\82Í\92\86\92f
+       TDdeClientConv *PdicDde;
+       bool r;
+
+       if (movesend){
+               // incremental search
+               PdicDde = OpenPdic("Simulate");
+               if (!PdicDde){
+                       ct--;
+                       return true;
+               }
+               r = DdePoke(PdicDde, "InputWord3", text);
+               if (!r){
+                       DBW("PDIC DDE : InputWord3 failure");
+                       delete PdicDde;
+                       ct--;
+                       return true;
+               }
+       } else {
+               // popup
+               if (GroupOpen){
+                       PdicDde = OpenPdic( "Simulate" );
+                       if (PdicDde){
+                               DdePoke( PdicDde, "Open", GroupName );
+                               PdicDde->CloseLink();
+                               delete PdicDde;
+                       }
+               }
+               PdicDde = OpenPdic( "Dictionary" );
+               if ( !PdicDde ){
+                       ct--;
+                       return true;
+               }
+
+               r = DdePoke( PdicDde, "Open", "" );
+               if ( !r ){
+                       DBW("PDIC DDE : Open failure");
+                       PdicDde->CloseLink();
+                       delete PdicDde;
+                       ct--;
+                       if ( GroupOpen ){
+                               static int ct = 0;
+                               ct++;
+                               if ( ct == 1 ){
+                                       Application->MessageBox(
+                                               "\8e«\8f\91\83O\83\8b\81[\83v\82ª\8aJ\82¯\82Ü\82¹\82ñ\r"
+                                               "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"
+                                               "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"
+                                               "\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"
+                                               "\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·"
+                                               ,
+                                               APPNAME, MB_OK );
+                               } else {
+                                       SetForegroundWindow( Handle );
+                               }
+                               ct--;
+                       }
+                       return true;
+               }
+               if ( CtrlClose )
+                       DdePoke( PdicDde, "PopupSearchConfig", "c1" );  // Ctrl close
+       //      Sleep(1000);
+               DdePoke( PdicDde, "PopupSearchConfig", "o1w1" );        // overlap window and no wait transaction
+               if ( prevtext && (prevtext != text) ){
+                       //DBW("prevtext="FMTS,prevtext);
+                       DdePoke( PdicDde, "PopupSearch2", (tchar*)prevtext );
+       //              ExecuteMacro( "PopupSearch2", true );
+                       WaitTransaction( PdicDde );
+               } else {
+                       //DBW("text="FMTS,text);
+                       DdePoke( PdicDde, "PopupSearch", (tchar*)text );
+       //              PdicDde->ExecuteMacro( "PopupSearch", true );
+                       WaitTransaction( PdicDde );
+               }
+               DdePoke( PdicDde, "Close", "" );
+       }
+       ClosePdic( PdicDde );
+#else  // !USE_DDE
+               // WM_COPYDATA\82É\82æ\82é\95û\96@(\82Ü\82¾document\89»\82³\82ê\82Ä\82¢\82È\82¢\95û\96@(Ver.4.30)
+               // PDIC/W32 Ver.4.22\81`\82É\91Î\89\9e
+               // \82½\82¾\82µ\81AVer.4.29\82Ü\82Å\82Í\81AWMCD_POPUPSEARCH\82ÆWMCD_POPUPSEARCH2\82Í\93¯\82
+
+       // WM_COPYDATA code //
+       // \88È\89º\82Ì\90\94\92l\82Í\8f«\97\88\95Ï\82í\82é\89Â\94\\90«\82ª\82 \82é(undocumented) //
+       #define WMCD_GETVERSION         0x0001
+       #define WMCD_CHECKOPEN          0x0010
+       #define WMCD_AUTOSEARCH         0x0020
+       #define WMCD_AUTOSEARCHMODE     0x0021
+
+       #define WMCD_ISOPENED                   0x0080
+       #define WMCD_CLOSE                              0x0081
+
+       #define WMCD_POPUPSEARCH                0x0100
+       #define WMCD_POPUPSEARCH2               0x0101
+       #define WMCD_POPUPSEARCHPOINT   0x0102
+       #define WMCD_POPUPSEARCHCONFIG  0x0103
+       #define WMCD_POPUPSEARCHDIALOG  0x0104
+       #define WMCD_POPUPSEARCHWINDOW  0x0105
+
+       #define WMCD_SPELLCHECK                 0x0110
+
+       HWND hwnd = FindPdic();
+       if ( !hwnd ){
+               ct--;
+               return;
+       }
+
+       bool r;
+       if ( CtrlClose )
+               SendCopyData( hwnd, WMCD_POPUPSEARCHCONFIG, "c1" );
+       POINT pt;
+       GetCursorPos( &pt );
+       char buf[20];
+       wsprintf( buf, "%d,%d", pt.x, pt.y );
+       SendCopyData( hwnd, WMCD_POPUPSEARCHPOINT, buf );
+       if ( prevtext && (prevtext != text) ){
+               DBW("prevtext=%s",prevtext);
+               SendCopyData( hwnd, WMCD_POPUPSEARCH2, prevtext );
+       } else {
+               DBW("text=%s",text);
+               SendCopyData( hwnd, WMCD_POPUPSEARCH, text );
+       }
+       SendCopyData( hwnd, WMCD_CLOSE, "" );
+#endif // !USE_DDE
+       ct--;
+       DBW("DCHook:Exit Popup:%d",ct);
+
+#if DETACHRELEASE
+       if ( EnablePopup ){
+               miUnhookClick( this );
+               miHookClick( this );
+       }
+#endif
+       return true;
+}
+//---------------------------------------------------------------------------
+// EvPopup
+// WParam : text location & FLG_MOVESEND
+// LParam : text pointer (must be freed when done)
+void TDCHookMainForm::EvPopup(TMessage &msg)
+{
+       //DBW("EvPopup");
+       if (!msg.LParam)
+               return;
+
+       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 ) ){
+               // no words
+               delete[] text;
+               return;
+       }
+#ifdef _DEBUG
+       edWord->Text = text + start;
+       edPrev->Text = loc + prevstart;
+#endif
+
+       if (DoPopup( text + start, text + prevstart, movesend )){
+               // done
+               delete[] text;
+       } else {
+               // retry again
+               if (PopupText)
+                       delete[] PopupText;     // \82 \82Æ\82É\97\88\82½\82Ù\82¤\82ð\97D\90æ\82·\82é
+               PopupText = text;
+               PopupLoc = loc;
+               PopupMoveSend = movesend;
+               tmPopup->Enabled = true;        // start timer for delayed popup
+       }
+       //DBW("EvPopup - end");
+}
+void TDCHookMainForm::EvMoveSend(TMessage &msg)
+{
+       EvMoveSend(msg.WParam==0);
+}
+void TDCHookMainForm::EvMoveSend(bool enable)
+{
+       tmMouseMove->Enabled = false;
+       if (enable){
+               tmMouseMove->Enabled = true;
+       }
+}
+void TDCHookMainForm::RegisterTrayIcon( bool flag )
+{
+  NOTIFYICONDATA m_tnid;  //\82±\82ê\82Í*.h\82Å\92è\8b`\82µ\82Ä\82¨\82­
+
+  m_tnid.cbSize = sizeof(NOTIFYICONDATA);
+  m_tnid.hWnd = Handle;
+  m_tnid.uID = 1;
+  m_tnid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
+  m_tnid.uCallbackMessage = WM_NOTIFYICON;
+  // Get small icon from me
+  HICON hIconSm;
+  HICON hIcon;
+  ExtractIconEx( Application->ExeName.c_str(), -2, &hIcon, &hIconSm, 1 );
+  m_tnid.hIcon = hIconSm;
+  lstrcpy(m_tnid.szTip, APPNAME );
+  Shell_NotifyIcon( flag ? NIM_ADD : NIM_DELETE, &m_tnid);
+}
+void TDCHookMainForm::EvNotifyIcon(TMessage &msg)
+{
+       //UINT uID = (UINT) msg.WParam;
+       UINT uMouseMsg = (UINT) msg.LParam;
+       if (uMouseMsg == WM_LBUTTONDBLCLK)
+       {
+               miOptionClick( this );
+       }
+       else if (uMouseMsg == WM_RBUTTONDOWN)
+       {
+               DokoPopMenu( true );
+       }
+}
+//---------------------------------------------------------------------------
+void TDCHookMainForm::SaveConfig()
+{
+       Ini->WriteInteger( PFS_CONFIG, PFS_GROUPOPEN, GroupOpen );
+       Ini->WriteString( PFS_CONFIG, PFS_GROUPNAME, GroupName.c_str() );
+       Ini->WriteInteger( PFS_CONFIG, PFS_CTRLCLOSE, CtrlClose );
+       Ini->WriteInteger( PFS_CONFIG, PFS_IGNOREJ, IgnoreJ );
+       Ini->WriteInteger( PFS_CONFIG, PFS_BANNER, Banner );
+}
+void TDCHookMainForm::OpenDicGroup( const char *name )
+{
+       TDdeClientConv *dde = OpenPdic( PFS_PDIC );
+       if ( !dde )
+               return;
+       // \8e«\8f\91\83O\83\8b\81[\83v\83I\81[\83v\83\93\8f\88\97\9d //
+       if ( name[0] == '&' )
+               name++;
+       DdePoke(dde, "OpenGroup", (tchar*)mustr(name));
+       ClosePdic( dde );
+}
+//---------------------------------------------------------------------------
+// DokoPop\82Ì\90Ý\92è
+void TDCHookMainForm::SetupConfig()
+{
+       EnableClickOnly( miClickOnly->Checked );
+       if (hDll){
+               hDll->Config( -1, KA_POPUP,
+                       Ini->ReadInteger( PFS_CONFIG, PFS_POPUPKEY, DEF_POPUPKEY ) );
+               hDll->Config( -1, KA_TOGGLE,
+                       Ini->ReadInteger( PFS_CONFIG, PFS_TOGGLEKEY, DEF_TOGGLEKEY ) );
+
+               SetupConfig2();
+       }
+       SetupAMODI();
+}
+void TDCHookMainForm::SetupConfig2()
+{
+       if (!hDll)
+               return;
+
+       TDCHConfig cfg;
+       memset(&cfg, 0, sizeof(cfg));
+       cfg.UseAMODI = AMODIAvail && (CaptureMode & CM_IMAGE);
+       cfg.OnlyAMODI = AMODIAvail && !(CaptureMode & CM_TEXT);
+       cfg.MoveSend = MouseIncSrch;
+       //cfg.OnlyImage = 1;    //TODO:
+       if (AMODIPath.data()){
+               strncpy(cfg.AMODIPath, AMODIPath.c_str(), sizeof(cfg.AMODIPath)-1);
+       }
+
+       int dpiDetect = Ini->ReadInteger(PFS_CONFIG, PFS_DPI_DETECT, 1);
+       if (dpiDetect){
+#if DPI_DETECT
+               cfg.ScaleX = GetMonitorScale();
+#endif
+       } else {
+               cfg.ScaleX = Ini->ReadInteger(PFS_CONFIG, PFS_SCALE, 0);
+       }
+       cfg.ScaleY = cfg.ScaleX;
+       hDll->Config2(&cfg);
+}
+void TDCHookMainForm::SetupAMODI()
+{
+       if (AMODIPath.data()){
+               AMODIAvail = true;
+       } else {
+               HWND hwnd = FindAMODI();
+               if (hwnd){
+                       AMODIAvail = true;
+               } else {
+                       AMODIAvail = LaunchAMODI();
+                       if (!AMODIAvail){
+                               HWND hwnd = FindAMODI();
+                               if (hwnd)
+                                       AMODIAvail = true;
+                       }
+               }
+       }
+       if (AMODIAvail){
+               tmMODIInstallCheck->Enabled = false;
+       }
+}
+void TDCHookMainForm::EnableClickOnly( bool enable )
+{
+       if (hDll)
+               hDll->Config( enable, 0, 0 );
+}
+void TDCHookMainForm::DokoPopMenu( bool all )
+{
+//     Width = 0;
+       SetForegroundWindow( Handle );
+       POINT pt;
+       GetCursorPos( &pt );
+       miEnablePopup->Visible = all;
+       miReload->Visible = !all;
+       miClose->Visible = !all;
+       miExit2->Visible = all;
+       pmTrayIcon->TrackButton = tbRightButton;
+       pmTrayIcon->Popup( pt.x, pt.y );
+       MoveToTop( Handle );
+//     MoveToTop( pmTrayIcon->WindowHandle );
+}
+void TDCHookMainForm::MenuClosed()
+{
+       Visible = false;
+       ShowWindow( Application->Handle, SW_HIDE );
+       tmMenuClose->Enabled = true;
+}
+void TDCHookMainForm::EvToggle( TMessage &msg )
+{
+       miClickOnlyClick( this );
+       ShowNotify();
+}
+void TDCHookMainForm::EvShortcut( TMessage &msg )
+{
+       switch (msg.WParam){
+               case SCINX_NOTIFY64:
+                       DBW("SCINX_NOTIFY64:%08X %08X", msg.LParam, hDll);
+                       if (hDll){
+                               hDll->Notify64(msg.LParam);
+                               SetupConfig();
+                       }
+                       break;
+       }
+}
+void TDCHookMainForm::EvGetVersion( TMessage &msg )
+{
+       msg.Result = VersionValue;
+}
+//---------------------------------------------------------------------------
+// \89E\83N\83\8a\83b\83N\8c\9f\8dõON/OFF\95\\8e¦
+void TDCHookMainForm::ShowNotify()
+{
+       POINT pt;
+       GetCursorPos( &pt );
+       if ( !NotifyForm ){
+               NotifyForm = new TNotifyForm( this );
+       } else {
+               NotifyForm->Visible = false;
+       }
+       NotifyForm->enable = miClickOnly->Checked;
+       NotifyForm->Left = pt.x + 8;
+       NotifyForm->Top = pt.y + 8;
+       NotifyForm->Setup();
+       NotifyForm->Show();
+       SetWindowPos( Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE );
+       SetWindowPos( NotifyForm->Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE );
+       tmNotify->Enabled = false;
+       tmNotify->Enabled = true;
+}
+void TDCHookMainForm::NotifyAMODI()
+{
+       MODINotifyDialog = new TMODINotifyDialog(this);
+       MODINotifyDialog->ShowModal();
+       if (MODINotifyDialog->LinkClicked || AMODIRunable()){
+               tmMODIInstallCheck->Enabled = true;
+       }
+       delete MODINotifyDialog;
+}
+void TDCHookMainForm::Reboot()
+{
+       ::Reboot = true;
+       Close();
+}
+void GetGroupList(TMyIni &ini, TStringList &list)
+{
+       AnsiString s = ini.ReadString("Group", "::GroupNames::", "");
+       if (s.IsEmpty()){
+               // for old version (not work correctly)
+               ini.ReadValues( "Group", &list);
+       } else {
+               const TCHAR *p = _tcstok(s.c_str(), _T("\t"));
+               while (p){
+                       list.Add( p );
+                       p = _tcstok(NULL, _T("\t"));
+               }
+       }
+}
+
+#if DPI_DETECT
+#if WINVER<0x0601
+#define QDC_ALL_PATHS                   0x00000001
+#define QDC_ONLY_ACTIVE_PATHS           0x00000002
+#define QDC_DATABASE_CURRENT            0x00000004
+typedef enum
+{
+    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_OTHER                   = -1,
+    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_HD15                    =  0,
+    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SVIDEO                  =  1,
+    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_COMPOSITE_VIDEO         =  2,
+    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_COMPONENT_VIDEO         =  3,
+    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DVI                     =  4,
+    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_HDMI                    =  5,
+    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_LVDS                    =  6,
+    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_D_JPN                   =  8,
+    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SDI                     =  9,
+    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DISPLAYPORT_EXTERNAL    = 10,
+    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DISPLAYPORT_EMBEDDED    = 11,
+    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_UDI_EXTERNAL            = 12,
+    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_UDI_EMBEDDED            = 13,
+    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SDTVDONGLE              = 14,
+    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_INTERNAL                = 0x80000000,
+    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_FORCE_UINT32            = 0xFFFFFFFF
+} DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY;
+typedef enum
+{
+    DISPLAYCONFIG_ROTATION_IDENTITY     = 1,
+    DISPLAYCONFIG_ROTATION_ROTATE90     = 2,
+    DISPLAYCONFIG_ROTATION_ROTATE180    = 3,
+    DISPLAYCONFIG_ROTATION_ROTATE270    = 4,
+    DISPLAYCONFIG_ROTATION_FORCE_UINT32 = 0xFFFFFFFF
+} DISPLAYCONFIG_ROTATION;
+typedef enum
+{
+    DISPLAYCONFIG_SCALING_IDENTITY                  = 1,
+    DISPLAYCONFIG_SCALING_CENTERED                  = 2,
+    DISPLAYCONFIG_SCALING_STRETCHED                 = 3,
+    DISPLAYCONFIG_SCALING_ASPECTRATIOCENTEREDMAX    = 4,
+    DISPLAYCONFIG_SCALING_CUSTOM                    = 5,
+    DISPLAYCONFIG_SCALING_PREFERRED                 = 128,
+    DISPLAYCONFIG_SCALING_FORCE_UINT32              = 0xFFFFFFFF
+} DISPLAYCONFIG_SCALING;
+typedef struct DISPLAYCONFIG_RATIONAL
+{
+    UINT32    Numerator;
+    UINT32    Denominator;
+} DISPLAYCONFIG_RATIONAL;
+typedef enum
+{
+       DISPLAYCONFIG_SCANLINE_ORDERING_UNSPECIFIED                 = 0,
+       DISPLAYCONFIG_SCANLINE_ORDERING_PROGRESSIVE                 = 1,
+       DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED                  = 2,
+       DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED_UPPERFIELDFIRST  = DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED,
+       DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED_LOWERFIELDFIRST  = 3,
+       DISPLAYCONFIG_SCANLINE_ORDERING_FORCE_UINT32                = 0xFFFFFFFF
+} DISPLAYCONFIG_SCANLINE_ORDERING;
+typedef enum
+{
+    DISPLAYCONFIG_MODE_INFO_TYPE_SOURCE = 1,
+    DISPLAYCONFIG_MODE_INFO_TYPE_TARGET = 2,
+    DISPLAYCONFIG_MODE_INFO_TYPE_FORCE_UINT32 = 0xFFFFFFFF
+} DISPLAYCONFIG_MODE_INFO_TYPE;
+typedef struct DISPLAYCONFIG_2DREGION
+{
+    UINT32 cx;
+    UINT32 cy;
+} DISPLAYCONFIG_2DREGION;
+typedef struct DISPLAYCONFIG_VIDEO_SIGNAL_INFO
+{
+       UINT64                          pixelRate;
+       DISPLAYCONFIG_RATIONAL          hSyncFreq;
+       DISPLAYCONFIG_RATIONAL          vSyncFreq;
+       DISPLAYCONFIG_2DREGION          activeSize;
+       DISPLAYCONFIG_2DREGION          totalSize;
+       UINT32                          videoStandard;
+       DISPLAYCONFIG_SCANLINE_ORDERING scanLineOrdering;
+} DISPLAYCONFIG_VIDEO_SIGNAL_INFO;
+typedef enum
+{
+    DISPLAYCONFIG_PIXELFORMAT_8BPP          = 1,
+    DISPLAYCONFIG_PIXELFORMAT_16BPP         = 2,
+    DISPLAYCONFIG_PIXELFORMAT_24BPP         = 3,
+    DISPLAYCONFIG_PIXELFORMAT_32BPP         = 4,
+    DISPLAYCONFIG_PIXELFORMAT_NONGDI        = 5,
+    DISPLAYCONFIG_PIXELFORMAT_FORCE_UINT32  = 0xffffffff
+} DISPLAYCONFIG_PIXELFORMAT;
+typedef enum
+{
+      DISPLAYCONFIG_TOPOLOGY_INTERNAL       = 0x00000001,
+      DISPLAYCONFIG_TOPOLOGY_CLONE          = 0x00000002,
+      DISPLAYCONFIG_TOPOLOGY_EXTEND         = 0x00000004,
+      DISPLAYCONFIG_TOPOLOGY_EXTERNAL       = 0x00000008,
+      DISPLAYCONFIG_TOPOLOGY_FORCE_UINT32   = 0xFFFFFFFF
+} DISPLAYCONFIG_TOPOLOGY_ID;
+typedef enum
+{
+      DISPLAYCONFIG_DEVICE_INFO_GET_SOURCE_NAME             = 1,
+      DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME             = 2,
+      DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_PREFERRED_MODE   = 3,
+      DISPLAYCONFIG_DEVICE_INFO_GET_ADAPTER_NAME            = 4,
+      DISPLAYCONFIG_DEVICE_INFO_SET_TARGET_PERSISTENCE      = 5,
+      DISPLAYCONFIG_DEVICE_INFO_FORCE_UINT32                = 0xFFFFFFFF
+} DISPLAYCONFIG_DEVICE_INFO_TYPE;
+
+typedef struct DISPLAYCONFIG_PATH_SOURCE_INFO
+{
+       LUID    adapterId;
+       UINT32  id;
+       UINT32  modeInfoIdx;
+       UINT32  statusFlags;
+} DISPLAYCONFIG_PATH_SOURCE_INFO;
+typedef struct DISPLAYCONFIG_PATH_TARGET_INFO
+{
+       LUID                                    adapterId;
+       UINT32                                  id;
+       UINT32                                  modeInfoIdx;
+       DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY   outputTechnology;
+       DISPLAYCONFIG_ROTATION                  rotation;
+       DISPLAYCONFIG_SCALING                   scaling;
+       DISPLAYCONFIG_RATIONAL                  refreshRate;
+       DISPLAYCONFIG_SCANLINE_ORDERING         scanLineOrdering;
+       BOOL                                    targetAvailable;
+       UINT32                                  statusFlags;
+} DISPLAYCONFIG_PATH_TARGET_INFO;
+typedef struct DISPLAYCONFIG_PATH_INFO
+{
+       DISPLAYCONFIG_PATH_SOURCE_INFO  sourceInfo;
+       DISPLAYCONFIG_PATH_TARGET_INFO  targetInfo;
+       UINT32                          flags;
+} DISPLAYCONFIG_PATH_INFO;
+typedef struct DISPLAYCONFIG_TARGET_MODE
+{
+    DISPLAYCONFIG_VIDEO_SIGNAL_INFO   targetVideoSignalInfo;
+} DISPLAYCONFIG_TARGET_MODE;
+typedef struct DISPLAYCONFIG_SOURCE_MODE
+{
+    UINT32                      width;
+    UINT32                      height;
+    DISPLAYCONFIG_PIXELFORMAT   pixelFormat;
+    POINTL                      position;
+} DISPLAYCONFIG_SOURCE_MODE;
+typedef struct DISPLAYCONFIG_MODE_INFO
+{
+       DISPLAYCONFIG_MODE_INFO_TYPE    infoType;
+       UINT32                          id;
+       LUID                            adapterId;
+       union
+       {
+               DISPLAYCONFIG_TARGET_MODE   targetMode;
+               DISPLAYCONFIG_SOURCE_MODE   sourceMode;
+       };
+} DISPLAYCONFIG_MODE_INFO;
+typedef struct DISPLAYCONFIG_DEVICE_INFO_HEADER
+{
+       DISPLAYCONFIG_DEVICE_INFO_TYPE  type;
+       UINT32                          size;
+       LUID                            adapterId;
+       UINT32                          id;
+} DISPLAYCONFIG_DEVICE_INFO_HEADER;
+
+#endif
+
+typedef WINUSERAPI LONG (WINAPI *FNGetDisplayConfigBufferSizes)(UINT32 flags, UINT32* numPathArrayElements, UINT32* numModeInfoArrayElements);
+typedef WINUSERAPI LONG (WINAPI *FNSetDisplayConfig)(UINT32 numPathArrayElements, DISPLAYCONFIG_PATH_INFO* pathArray, UINT32 numModeInfoArrayElements, DISPLAYCONFIG_MODE_INFO* modeInfoArray, UINT32 flags);
+typedef WINUSERAPI LONG (WINAPI *FNQueryDisplayConfig)(UINT32 flags, UINT32* numPathArrayElements, DISPLAYCONFIG_PATH_INFO* pathArray, UINT32* numModeInfoArrayElements, DISPLAYCONFIG_MODE_INFO* modeInfoArray, DISPLAYCONFIG_TOPOLOGY_ID* currentTopologyId);
+typedef WINUSERAPI LONG (WINAPI *FNDisplayConfigGetDeviceInfo)(DISPLAYCONFIG_DEVICE_INFO_HEADER* requestPacket);
+
+class TDllHandle {
+protected:
+       HINSTANCE hInst;
+public:
+       TDllHandle(HINSTANCE _hInst)
+               :hInst(_hInst)
+       {
+       }
+       ~TDllHandle(){
+               if (hInst) FreeLibrary(hInst);
+       }
+       HINSTANCE inst(){ return hInst; }
+       operator HINSTANCE (){ return hInst; }
+};
+
+int GetMonitorScale()
+{
+       int dpi = 96;
+
+       HINSTANCE hDll = LoadLibrary( user32 );
+       if (!hDll)
+               return dpi;
+
+       TDllHandle hInst(hDll);
+               
+       FNGetDisplayConfigBufferSizes _GetDisplayConfigBufferSizes = (FNGetDisplayConfigBufferSizes)GetProcAddress(hInst, "GetDisplayConfigBufferSizes");
+       if (!_GetDisplayConfigBufferSizes) return dpi;
+       FNQueryDisplayConfig _QueryDisplayConfig = (FNQueryDisplayConfig)GetProcAddress(hInst, "QueryDisplayConfig");
+       if (!_QueryDisplayConfig) return dpi;
+
+       POINT pt;
+       GetCursorPos( &pt );
+       HMONITOR hMonitor = MonitorFromPoint( pt, MONITOR_DEFAULTTONULL );
+       if (!hMonitor) return dpi;
+       
+       MONITORINFOEX LogicalMonitorInfo;
+       LogicalMonitorInfo.cbSize = sizeof(MONITORINFOEX);       
+       GetMonitorInfo(hMonitor, &LogicalMonitorInfo);
+       int LogicalMonitorWidth = LogicalMonitorInfo.rcMonitor.right - LogicalMonitorInfo.rcMonitor.left;
+
+       int LogicalDesktopWidth = GetSystemMetrics(SM_CXVIRTUALSCREEN);
+
+       UINT32 numofpath;
+       UINT32 numofmode;
+       _GetDisplayConfigBufferSizes(QDC_DATABASE_CURRENT, &numofpath, &numofmode);
+
+       DISPLAYCONFIG_PATH_INFO *dpis=new DISPLAYCONFIG_PATH_INFO[numofpath];
+       DISPLAYCONFIG_MODE_INFO *pModeInfoArray =new DISPLAYCONFIG_MODE_INFO[numofmode];
+       DISPLAYCONFIG_TOPOLOGY_ID tid;
+       _QueryDisplayConfig(QDC_DATABASE_CURRENT, &numofpath, dpis, &numofmode, pModeInfoArray, &tid);  //TODO: Windows7 or later
+
+       int PhysicalDesktopWidth = LogicalDesktopWidth;
+       int PhysicalMonitorWidth = LogicalMonitorWidth;
+       
+       for (int i=0;i<(int)numofmode;i++){
+               if (pModeInfoArray[i].infoType == DISPLAYCONFIG_MODE_INFO_TYPE_SOURCE){
+                       dbw("%d: %d", i, pModeInfoArray[i].sourceMode.width);
+                       PhysicalDesktopWidth = pModeInfoArray[i].sourceMode.width;
+                       //int PhysicalDesktopWidth = 
+                       //int ScaleFactor = (LogicalMonitorWidth/LogicalDesktopWidth) / (PhysicalMonitorWidth/PhysicalDesktopWidth)
+                       //return 96 * 1;
+               } else
+               if (pModeInfoArray[i].infoType == DISPLAYCONFIG_MODE_INFO_TYPE_TARGET){
+                       PhysicalMonitorWidth = pModeInfoArray[i].targetMode.targetVideoSignalInfo.activeSize.cx;
+                       dbw("%d: %d", i, PhysicalMonitorWidth);
+               }
+       }
+
+       //int PhysicalMonitorWidth = pModeInfoArray[i].sourceMode.width;
+       //int ScaleFactor = (LogicalMonitorWidth/LogicalDesktopWidth) / (PhysicalMonitorWidth/PhysicalDesktopWidth)
+
+       delete[] dpis;
+       delete[] pModeInfoArray;
+
+       return dpi * PhysicalDesktopWidth / LogicalDesktopWidth;
+}
+#endif
+
+
diff --git a/DCHookTest/DCHookMain.dfm b/DCHookTest/DCHookMain.dfm
new file mode 100644 (file)
index 0000000..a560812
--- /dev/null
@@ -0,0 +1,2741 @@
+object DCHookMainForm: TDCHookMainForm
+  Left = 467
+  Top = 181
+  Width = 443
+  Height = 369
+  Caption = 'DCHookMainForm'
+  Color = clWhite
+  Font.Charset = SHIFTJIS_CHARSET
+  Font.Color = clWindowText
+  Font.Height = -12
+  Font.Name = '\82l\82\82o\83S\83V\83b\83N'
+  Font.Style = []
+  Menu = MainMenu
+  OldCreateOrder = False
+  PopupMenu = pmTrayIcon
+  Position = poScreenCenter
+  OnCloseQuery = FormCloseQuery
+  OnCreate = FormCreate
+  OnKeyPress = FormKeyPress
+  PixelsPerInch = 96
+  TextHeight = 12
+  object Splitter1: TSplitter
+    Left = 105
+    Top = 0
+    Width = 6
+    Height = 228
+    Cursor = crHSplit
+  end
+  object PaintBox: TPaintBox
+    Left = 111
+    Top = 0
+    Width = 316
+    Height = 228
+    Align = alClient
+  end
+  object Image: TImage
+    Left = 111
+    Top = 0
+    Width = 316
+    Height = 228
+    Align = alClient
+    AutoSize = True
+    Center = True
+    Picture.Data = {
+      07544269746D61703A320100424D3A3201000000000000000000280000003401
+      0000E80000000100080001000000042E01000000000000000000000100000001
+      0000000000000101010002020200030303000404040005050500060606000707
+      070008080800090909000A0A0A000B0B0B000C0C0C000D0D0D000E0E0E000F0F
+      0F00101010001111110012121200131313001414140015151500161616001717
+      170018181800191919001A1A1A001B1B1B001C1C1C001D1D1D001E1E1E001F1F
+      1F00202020002121210022222200232323002424240025252500262626002727
+      270028282800292929002A2A2A002B2B2B002C2C2C002D2D2D002E2E2E002F2F
+      2F00303030003131310032323200333333003434340035353500363636003737
+      370038383800393939003A3A3A003B3B3B003C3C3C003D3D3D003E3E3E003F3F
+      3F00404040004141410042424200434343004444440045454500464646004747
+      470048484800494949004A4A4A004B4B4B004C4C4C004D4D4D004E4E4E004F4F
+      4F00505050005151510052525200535353005454540055555500565656005757
+      570058585800595959005A5A5A005B5B5B005C5C5C005D5D5D005E5E5E005F5F
+      5F00606060006161610062626200636363006464640065656500666666006767
+      670068686800696969006A6A6A006B6B6B006C6C6C006D6D6D006E6E6E006F6F
+      6F00707070007171710072727200737373007474740075757500767676007777
+      770078787800797979007A7A7A007B7B7B007C7C7C007D7D7D007E7E7E007F7F
+      7F00808080008181810082828200838383008484840085858500868686008787
+      870088888800898989008A8A8A008B8B8B008C8C8C008D8D8D008E8E8E008F8F
+      8F00909090009191910092929200939393009494940095959500969696009797
+      970098989800999999009A9A9A009B9B9B009C9C9C009D9D9D009E9E9E009F9F
+      9F00A0A0A000A1A1A100A2A2A200A3A3A300A4A4A400A5A5A500A6A6A600A7A7
+      A700A8A8A800A9A9A900AAAAAA00ABABAB00ACACAC00ADADAD00AEAEAE00AFAF
+      AF00B0B0B000B1B1B100B2B2B200B3B3B300B4B4B400B5B5B500B6B6B600B7B7
+      B700B8B8B800B9B9B900BABABA00BBBBBB00BCBCBC00BDBDBD00BEBEBE00BFBF
+      BF00C0C0C000C1C1C100C2C2C200C3C3C300C4C4C400C5C5C500C6C6C600C7C7
+      C700C8C8C800C9C9C900CACACA00CBCBCB00CCCCCC00CDCDCD00CECECE00CFCF
+      CF00D0D0D000D1D1D100D2D2D200D3D3D300D4D4D400D5D5D500D6D6D600D7D7
+      D700D8D8D800D9D9D900DADADA00DBDBDB00DCDCDC00DDDDDD00DEDEDE00DFDF
+      DF00E0E0E000E1E1E100E2E2E200E3E3E300E4E4E400E5E5E500E6E6E600E7E7
+      E700E8E8E800E9E9E900EAEAEA00EBEBEB00ECECEC00EDEDED00EEEEEE00EFEF
+      EF00F0F0F000F1F1F100F2F2F200F3F3F300F4F4F400F5F5F500F6F6F600F7F7
+      F700F8F8F800F9F9F900FAFAFA00FBFBFB00FCFCFC00FDFDFD00FEFEFE00FFFF
+      FF0003A601A501A402A301A202A102A0029F029E019D019C029B029A01990298
+      02970296019503940193029202910190028F018E028D028C028B018A02890188
+      02870286028502840283028202810280027F027E027D017C027B027A02790278
+      02770176027502740173027201710270016F026E016D016C026B026A01690268
+      0167026601650264016301620261026000035F5E5D00025C025B015A02590003
+      58575600025500035453520002510005504F4E4D4C00024B00034A4948000247
+      00044544434202410011403F3E3D3C3B3A3938373635343332313000022F0006
+      2E2D2C2B2A2902280004272625240223022201210120021F021E011D021C021B
+      021A0219021801170316011501140213021201110110020F00030E0D0C00020B
+      020A0003090807000306010503040203030206010C0008010202020301040405
+      03040105020601040803070203010200000001A702A601A502A402A301A202A1
+      01A0029F029E029D029C019B019A029902980297029601950294019302920291
+      0190028F018E028D028C028B028A028901880287018602850384018302820281
+      0280027F027E027D017C027B027A027902780277017602750274017302720171
+      0270016F026E016D016C026B026A016902680167026601650264016301620261
+      026000035F5E5D00025C015B025A015901580257015601550254000553525150
+      4F00024E00054D4C4B4A49000248000647464544434202410006403F3E3D3C3B
+      02390004383735340233000A3231302F2E2D2C2B2A2902280004272625240223
+      012202210120021F011E021D021C011B031A0219021801170216021502140113
+      011202110110010F020E010D020C010B020A0109020801070206020502040303
+      030206010D000701020203030504020301040205040405030702040101000000
+      03A701A601A502A401A302A202A102A0019F029E019D029C029B019A02990298
+      01970296019502940293029201910290028F018E028D028C018B028A02890288
+      01870286028502840283018202810280027F027E027D027C027B017A02790278
+      02770176027502740173027201710270016F026E016D016C026B026A01690268
+      01670266016502640163016202610160025F015E015D025C00035B5A59000258
+      015702560005555453525100025000054F4E4D4C4B00024A0009494847464544
+      43424100024000113F3E3C3B3A393837363534333231302F2E00022D00062C2B
+      2A292827022601250223022201210120021F011E021D021C021B011A03190118
+      02170216011503140113021201110210010F020E010D020C010B020A01090208
+      01070306010503040203040206010D0007010003020304000205020406030604
+      06030202020304020301000001A802A701A602A501A402A302A201A102A0019F
+      029E029D029C019B029A0299019802970296019502940293019202910290018F
+      028E028D018C028B028A0189028802870286028501840283018202810380027F
+      027E017D027C027B027A0279017802770276017502740173027201710170026F
+      016E016D026C016B026A0269026801670266000365646300026202610003605F
+      5E00025D00035C5B5A00025901580157025600045554535202510006504F4E4D
+      4C4B024A0020494847464544434241403F3E3D3C3B3A39383736353433323130
+      2F2E2D2C2B2A02290006282726252423022201210120021F021E011D021C011B
+      021A0219021801170316011502140213021202110110020F010E020D020C010B
+      020A0209010802070206020502040303030207010D0004010302000803040709
+      0A08060405030704090304020301000002A802A701A602A502A401A302A201A1
+      02A0029F019E029D019C029B029A029901980297019602950294029301920291
+      0290018F028E028D018C028B028A018902880287028601850184028302820281
+      0280027F037E017D027C017B027A027901780277017601750274027300037271
+      7000026F026E016D026C016B026A026901680267000366656400026301620261
+      0160015F025E015D015C025B00035A595800025701560255000754535251504F
+      4E00024D00164C4B4A494847464544434241403F3E3D3C3B3A39383702350003
+      34333100023000032E2D2C00022B00082A29282726252423022201210120021F
+      011E021D011C011B021A0319011802170116031502140213021202110210010F
+      020E010D020C020B020A0209010801070306020503040303030206010D000201
+      0302020300090405080B0F100E0A0600050307040A0304020201000001A902A8
+      02A701A601A502A402A301A202A101A0029F029E029D019C029B019A02990298
+      01970296019502940293029202910190028F028E018D028C028B018A02890288
+      01870286018502840283018202810280027F037E017D027C017B027A01790278
+      01770176027502740173017202710170026F016E026D016C026B016A02690168
+      0267016602650003646362000261026000035F5E5D00025C00055B5A59585700
+      0256015502540009535251504F4E4D4C4B00024A000449484746024400204341
+      403F3E3D3C3B3A393837363534333231302F2E2D2C2B2A292827262524230222
+      01210120021F011E011D021C011B021A01190218021702160215031401130312
+      01110310020F010E020D020C020B010A03090108020702060205030403030302
+      06010C00030101020203000D04050607090B0F13151410090400040308040203
+      0104070303020201000002A902A801A702A601A501A402A302A202A101A0029F
+      029E019D029C029B019A0199039801970296029501940293019202910290028F
+      018E028D018C028B018A0289028802870186028502840183018202810280027F
+      027E027D027C017B027A0179017802770176027501740273017202710170016F
+      026E026D016C016B026A0169026801670266000365646300026201610260015F
+      015E025D00045C5B5A5902580157015602550153015202510022504F4E4D4C4B
+      4A494847464544434241403F3E3D3C3B3A3938373534333231302F2E022D0008
+      2B2A292827262524022302210120011F021E011D011C021B021A011902180117
+      0316021502140213021202110210020F030E020D020C010B020A030902080207
+      02060205020403030A020D010302000A0304050607090B0D101402180003140C
+      060004030C04060304020101000003A902A801A702A601A502A401A302A201A1
+      02A0019F029E029D029C019B019A029902980297019602950294029301920291
+      0290018F028E018D018C028B028A018902880287028601850284018301820281
+      0280027F027E017D027C027B017A017902780177027602750174017302720171
+      0170026F016E026D016C016B026A016902680167016602650164016302620161
+      026000035F5E5D00025C00045B5A595802570006565554535251025000074F4E
+      4D4C4B4A490002470019464544434241403E3D3C3B3A39383736353433323130
+      2F2D2C00022B012A0129022700042524232202210004201F1E1D021C011B021A
+      0119021802170216021502140213021203110210020F020E030D020C020B020A
+      020902080207020601050106030503040B031002001003040506080A0C0E1115
+      181A170F070402030E0405030502000001AA02A902A802A701A601A502A402A3
+      02A201A102A0029F019E029D029C019B019A0299029802970196029502940193
+      029201910290018F028E028D018C028B018A0289018802870286018502840183
+      018202810280027F017E027D027C017B017A0279027801770276000375747300
+      0272000371706F00026E026D016C016B026A0169016802670266000465646362
+      02610160025F00055E5D5C5B5A0002590003585756000255002D54535251504F
+      4E4D4C4B4A494847464544434241403F3E3D3C3B393837363534333231302F2E
+      2D2C2B2A292827000225022300052221201F1E00021D011C011B021A01190218
+      01170216021502140213021202110310020F030E010D040C020B020A03090408
+      01070A0602050204050502040703060203030204000E0507080A0C0E1115181A
+      1810070402030E0407030302000003AA01A902A802A701A602A501A402A301A2
+      02A101A0029F029E029D019C019B029A02990298029701960195029401930292
+      01910290028F028E018D028C018B018A02890188028702860185028401830182
+      02810280017F027E027D017C027B017A02790178017702760003757473000272
+      01710170026F016E016D026C026B00036A696800026701660265000464636261
+      026000045F5E5D5C025B00045A595857025600085554535251504F4E024D0008
+      4C4B4A49484745440243000C4241403F3D3C3B3A393837350234000C3231302F
+      2E2D2C2B2A29282702250123012202210005201F1E1D1C00021B011A01190218
+      02170216011501140313021201110310030F020E030D020C040B020A0A090108
+      0107030800050908090809000208050702060205010406030402030301040305
+      000E0607080A0C0E1114181A1810070402030F0406030302000001AB02AA02A9
+      02A801A701A602A502A402A301A202A102A0019F029E029D019C019B029A0299
+      029800039796950002940193039201910290018F028E018D028C018B018A0289
+      018802870286018502840183018202810180027F017E027D017C027B017A0279
+      017801770276017501740273000372717000026F016E026D016C016B026A0003
+      6968670002660003656463000262000561605F5E5D00025C00045B5A59580257
+      0004565554530252000E51504F4E4D4C4B4A4948474645430242001D41403F3E
+      3D3C3A3938373635333231302F2E2D2C2B2A292726252423220002210005201F
+      1E1D1C00021B00031A19180002170116021502140113021202110310030F020E
+      030D030C040B060A020B050C0C0B010A01090308020702060205060405030204
+      010502060307000C080A0C0E1114171A170F070403030F0407030102000001AC
+      01AB02AA01A902A802A701A602A502A402A301A201A102A0029F029E019D029C
+      019B029A0199029801970196029502940193029202910190018F028E018D028C
+      018B018A0289018802870286018501840283018201810280017F027E00037D7C
+      7B00027A017902780177027601750274000473727170026F00036E6D6C00026B
+      00036A6968000267000366656400026300056261605F5E00025D00055C5B5A59
+      58000257000356555400025300105251504F4E4D4C4B4A494847464544430241
+      001E403F3E3D3B3A3938373635343331302F2E2D2C2B2A292827262524232221
+      021F00041E1D1C1B021A0119011802170116021501140113021203110210020F
+      020E030D050C050B010C010B030C020D020E090F030E030D010C010B020A0109
+      04080207060604050504010501060307000D08090A0C0E10131619170F070400
+      030310040703000002AC01AB02AA01A902A802A702A601A502A402A301A201A1
+      02A0029F019E019D029C019B029A019902980297019601950294019302920291
+      0190028F018E018D028C018B018A028901880287018602850184018302820181
+      0180027F017E017D027C017B017A02790178017702760006757473727170026F
+      016E016D026C00046B6A696802670003666564000263000362616000025F0004
+      5E5D5C5B025A015902570156015502540013535251504F4E4D4C4B4A49484746
+      454443424000023F00123E3D3B3A3938373635343331302F2E2D2C2B02290128
+      022600072524232221201F00021D00041C1B1A19021801170216011501140213
+      021201110210030F020E030D090C020D020E030F021001110312031301120113
+      021202110110010F030E020D010C060B010A0509020803070206020502040205
+      010601070308000C090A0B0D0F121618160F0804030308040305060406030000
+      02AC02AB01AA02A902A801A702A602A501A402A301A202A101A0029F019E019D
+      029C019B029A0299019802970196019502940293019202910190028F018E018D
+      028C018B018A028901880287018601850284000483828180027F017E027D0004
+      7C7B7A790278000477767574027300047271706F026E00036D6C6B00026A0005
+      69686766650002640005636261605F00025E00045D5C5B5A0259000458575655
+      025401520151025000074F4E4D4C4B4A49000247014601440243001542413F3E
+      3D3C3B3A3938373635333231302F2E2D2C00022A012902270126012402230121
+      0120021F00061E1D1C1B1A19021800031716150002140113021201110310020F
+      030E0B0D010E010F021001110212021301140215061601150214021302120111
+      0410060F030E010D010C020B020A020903080207010601050204020501060207
+      0308000B0A0B0D0F121518161008040002030804040507040503000001AD02AC
+      01AB02AA02A901A802A702A602A50003A4A3A20002A101A0029F019E019D029C
+      029B029A029900049897969502940293019202910190028F018E018D028C018B
+      018A0289000388878600028500038483820002810004807F7E7D027C00077B7A
+      79787776750002740173017202710006706F6E6D6C6B026A0007696867666564
+      63000262000561605F5E5D00025C00045B5A59580257002C565554535251504F
+      4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938363534333231302F2E
+      2D2C2B2A022800072625242322212000021F00081E1D1C1B1A19181702160115
+      01140213021202110110020F030E030D010C020D010E030F0210000611121314
+      151603170218051903180117011605150114011505140313011202110004100F
+      0E0D020C020B010A02090308010702060405010603070208000B090B0D0F1115
+      17161008040002030804050509040203000003AD01AC01AB02AA02A901A802A7
+      01A602A501A401A302A201A102A0019F029E029D019C019B029A029900049897
+      969502940293019201910290018F028E00038D8C8B00028A0004898887860285
+      000484838281028000047F7E7D7C027B00087A79787776757473027200087170
+      6F6E6D6C6B6A026900086867666564636261026000065F5E5D5C5B5A02590009
+      58575655545352515000024F014D014C024B000B4A4948474645444342403F00
+      023E001E3D3B3A393837363534333231302F2E2D2B2A29282726252423222120
+      1F1E021D00081C1B1A191817161503140213021201110210010F030E040D020E
+      00040F1112130214000615161718191A021B011C041B071A0619041A03190118
+      02170004161514130211010F010E030D00030C0B0A0003090308010701060305
+      020603070208000B090A0C0E111416150F080400020307040A05050402030000
+      01AE02AD01AC02AB02AA01A902A801A701A602A501A401A302A202A101A0029F
+      019E029D019C019B029A029900049897969502940293000392919000028F0004
+      8E8D8C8B028A01890188028700078685848382818000027F000E7E7D7C7B7A79
+      7877767574737271027000096F6E6D6C6B6A6968670002660009656463626160
+      5F5E5D00025C00035B59580002570004565554530252002151504F4E4D4C4B4A
+      494847464544434241403F3E3D3C3B3A39383736353433313000022F00162D2C
+      2B2A292827262524232221201F1E1D1C1B1A1918021700031615140002130112
+      0313011201110210010F030E020F02100009111213141718191A1B00021C041D
+      011E031D061C021D021E081F021E021C000B1B1A19181715141311100F00020E
+      020D010C010B030A02090208010702060205020601070208000D0708090A0C0E
+      1013161510080400020306040B0506040103000002AE02AD01AC01AB02AA01A9
+      02A801A701A602A502A401A302A201A101A0029F019E029D019C019B029A0199
+      029800039796950002940193019202910003908F8E00028D00058C8B8A898800
+      0287000E868584838281807F7E7D7C7B7A790278001877767574737271706F6E
+      6D6C6B6A69686766656463626160025F000C5E5D5C5B5A595857565554530252
+      000D51504F4E4D4C4B4A49484746450002440027434241403F3E3C3B3A393837
+      363534333231302F2E2D2C2B292827262524232221201F1E1D1C1B00021A0004
+      191817160215011401130212011101120313011201110410000B111314151618
+      191B1C1D1E00021F0320031F061E021F02200004212223240525000324232200
+      0221000D1F1E1D1C1B1A19181715141311000210010F020E010D020C010B030A
+      02090208010701060205010602070208000D0708090A0C0E1013161510090500
+      020305040D050604000003AE01AD02AC0003ABAAA90002A801A702A602A501A4
+      01A302A201A101A0029F019E029D00039C9B9A00029901980197029600049594
+      939202910004908F8E8D028C00058B8A89888700028600188584838281807F7E
+      7D7C7B7A7978777675747372716F6E6D026C00086B6A69686765646302620010
+      61605F5E5D5C5B5A59585756555453520251000D504F4E4D4C4B4A4948474645
+      4400024300104241403F3E3D3C3B3A3837363534333202310017302F2D2C2B2A
+      292827262524232221201F1E1D1C1B1A19000218000317161500021401130212
+      041103120313000B141517191B1C1E1F20212200022303220721032200062324
+      252627280629001628272625242221201F1E1D1C1B1A19181615141312110210
+      00030F0E0D00030C020B020A02090208010703060207050800050A0C0D101200
+      021500031009050007040E050504000002AF01AE01AD02AC01AB01AA02A901A8
+      02A702A60003A5A4A30002A20003A1A09F00029E019D029C019B019A02990006
+      9897969594930292000691908F8E8D8C028B00078A898887868584000283002D
+      8281807F7E7C7B7A7978777675747372706F6E6D6C6B6A696867666564636261
+      605F5E5D5C5B5A595857565554000253000351504F00024E000D4D4C4B4A4948
+      4746454443424100024000143F3E3D3C3B3A393837363534333231302F2E2D2C
+      022A00062928272625240222000B21201F1E1D1C1B1A19181700021601150114
+      02130712000C13151617191B1C1E202122240625022405230224000426272829
+      022A022B022C032D012C022B00082A292827252423220220000D1F1E1D1B1A19
+      181716151413120002110110010F020E010D030C020B020A0209010801070306
+      0107060800050A0C0D0F1200021500031109050007040F050404000002AF01AE
+      02AD01AC02AB01AA01A902A801A702A60003A5A4A30002A20004A1A09F9E029D
+      019C019B029A00069998979695940293000B9291908F8E8D8C8B8A8988000287
+      0033868584838281807F7E7D7C7A7978777675747271706F6E6D6C6B6A696867
+      6665646361605F5E5D5C5B5A59585756555453525100025000034E4D4C00024B
+      000E4A494847464544434241403F3E3D023C001C3B3A39383736353433323130
+      2F2E2D2C2B2A29282726252423222120021F00031E1D1C00021A011902180004
+      171615140413011402150009161718191B1E2022240002260127052801270326
+      042500082627282A2C2D2E2F0530032F012E022D00172C2B2A29282725242322
+      21201F1E1D1C1B1A1918171615000214000413121110020F020E010D030C010B
+      020A020901080107030601070608000A0A0C0D0F121415110A05070409050206
+      050502040105000002AF01AE02AD02AC01AB01AA02A901A801A702A60004A5A4
+      A3A202A10003A09F9E00029D00069C9B9A9998970296019501940292004B9190
+      8F8E8D8C8B8A898887868584838281807F7E7D7C7B7A78777675747371706F6E
+      6D6B6A696867666564636261605E5D5C5B5A595857565554535251504F4E4D4C
+      4B4A49484746454443000242000841403F3E3D3C3B3A02390011383736353433
+      3231302F2E2D2C2B2A292800022702250003242322000220011F011E021D0003
+      1B1A19000218041701160315000C16181A1C1E20212224252729022A032B022A
+      012902280527000828292B2C2E2F313304340233013202310130012F022E022C
+      00042B2A29270226012402230221000C201F1E1D1C1B1A191817161502140003
+      131211000210020F020E010D020C010B020A020902080407060800050A0B0D0F
+      110002140003110A050006040A050206050502040105000001B002AF02AE0003
+      ADACAB0002AA0005A9A8A7A6A50002A40003A3A2A10002A0000A9F9E9D9C9B9A
+      9998979602950194019302910037908F8E8D8C8B8A8988878684838281807F7E
+      7D7C7B7A79777675747371706F6E6C6B6A6968676564636261605F5E5C5B5A59
+      5857565553000252000551504F4D4C00024B000C4A494847464544434241403F
+      023E00083D3C3B3A3938373602350134023201310130022E00052D2C2B2A2900
+      02280127012602240007232221201F1E1D00041C011A011904180119021A0009
+      1B1C1D1F2124272A2C00022D052E022D022C022B032A022900092A2B2C2E3032
+      3435360005370235000934333231302F2E2D2C00022B00112A29282726252423
+      2221201F1E1D1C1B1A000219011801170216000315141300021202110110020F
+      010E020D010C010B020A03090108040706080005090B0D0E110002140003110B
+      0500060406050606060501040105000001B002AF02AE0003ADACAB0002AA0005
+      A9A8A7A6A50002A4000FA3A2A1A09F9E9D9C9B9A999897969500029400499392
+      908F8E8D8C8B8A8988878685848381807F7E7D7C7B7A78777675747271706F6D
+      6C6B6A68676665636261605F5D5C5B5A5958565554535251504F4E4D4C4B4A49
+      48474645444342000241000A403F3E3D3C3B3A39383702360004353433320231
+      022F00082E2D2C2B2A292827022600092524232221201F1E1D00021C00031B1A
+      1B00051C000D1D1F2021232527292C2E2F31320003340133013202310230032E
+      022D022E012F0230013101330235000337383900033A0239000C383736353433
+      3231302F2E2D022C00092B2A29282726252423000222000421201F1E021C011B
+      011A0219000318171600021501140113021202110110020F010E020D020C010B
+      020A0309010803070608000A090B0C0E111314120B06060404050C0604050000
+      02B002AF0005AEADACABAA0002A90059A8A7A6A5A4A3A2A1A09F9E9D9C9B9A99
+      9897969594939291908F8E8D8C8B8A88878685848382817F7E7D7C7B7A787776
+      747372716F6E6D6C6A69686765646361605F5E5D5B5A5958575554535251504F
+      4E4D4C4B4A494847460002440009434241403F3E3D3C3B00023A000639383736
+      3534023300093231302F2E2D2C2B2A0002290005282726252400022301220221
+      0006201F1E1D1C1B041A000E1C1F212326282A2C2E3031333435063601350234
+      02330632000633343537393A023B053D023C013B023A00083937363534333231
+      023000072F2E2D2C2B2A29000228000B27262524232221201F1E1D00021C011B
+      011A021901170116021502140113021202110110020F020E020D020C020B020A
+      010901080307010802090308000A090B0C0E111314120C06060404050C060405
+      000001B101B002AF0005AEADACABAA0002A901A801A702A50059A4A3A2A1A09E
+      9D9C9B9A9998979695949391908F8E8D8C8B8A8988868584838281807E7D7C7A
+      79787775747372716F6E6C6B6A686766646362615F5E5C5B5A59585655545352
+      514F4E4D4C4B4A494847464544434241403F3E00023D013B013A023900033837
+      360002350233000332313000022F00052E2D2C2B2A0002290004282726250224
+      022201210120031F011E011D021B0319000A1B1D2024292D3134353703380439
+      013805370336033702380006393A3B3C3E3F0241024202410240023E00103D3C
+      3B3A393837363534333231302F2E022D000D2C2B2A2928272625242322212000
+      021F00031E1D1C00021B00051A1918171600021502140113031201110210020F
+      030E010D020C020B010A020904080309000C08090A0B0D0E101314120C060604
+      03050E060305000001B101B002AF01AE02AC005AABAAA9A8A7A6A5A4A3A2A1A0
+      9F9D9C9B9A9998969594939291908E8D8C8B8A89888785848382817F7E7D7C7A
+      79787775747271706E6D6C6B69686665646261605E5D5C5A5958565554535250
+      4F4E4D4C4B4A49484745444342410240013F023D00083C3B3A39383736350234
+      000433323130022F00042E2D2C2B022A00052928272625000224012301220221
+      0004201F1E1D041C011B031900091B1E23282D3235383A00053B083A023B033C
+      00043D3E3F400241014201440245034601450244000443424140023E013D013C
+      023A0012393837363534333231302F2E2D2C2B2A29280227000C262524232221
+      201F1E1D1C1B021A0119021801170116021503140213011201110210040F010E
+      020D020C010B020A010903080409000C08090A0C0D0E101314130C0705040405
+      0F06020500000006B1B0AFAEADAC02AB0064AAA9A8A7A5A4A3A2A1A09F9E9C9B
+      9A99989695949392908F8E8C8B8A89888785848382807F7E7D7C7A7978767573
+      72716F6E6D6B6A696766646361605F5D5C5B5A585755545251504F4E4C4B4A49
+      4847464544434241403F3E3D3C3B3A393837363534330232000331302F00022E
+      022C00032B2A2900022800032726250002240003232221000220011F021E011D
+      011C021B021A041900091B1E242A3035393A3C00023D063C023D023F01400241
+      024202430003444648000249054A0249001048474645444342403F3E3D3C3B3A
+      393802370003363534000232000431302E2D022C00102B2A2928272625242322
+      21201F1E1D1C021B011A0219021800031716150004140213011202110310020F
+      030E020D00030C0B0A000809000C08090A0C0D0E111315130D07050404050806
+      03070506010500000067B1B0AFAEADACABAAA9A8A7A6A4A3A2A1A09E9D9C9B9A
+      98979694939291908E8D8C8A89888785848382807F7E7C7B7A78777674737270
+      6F6D6C6A696867656462615F5E5C5B5A585756545351504E4D4C4B4A48474645
+      44434241403F3E3D3C3B3A39383736353400023300043231302F022E00042D2C
+      2B2A0229000328272600022500032423220002210120011F021E011D021C011B
+      011A02190318000B191B1D20252B31373B3D3E00033F03400341000542434546
+      470003480005494A4B4D4E000350024F00164E4D4C4B4A494847464443424140
+      3F3E3D3C3B3A39380237000E3635343231302F2E2D2C2B2A2928022600052523
+      22212000021F021E011D021C011B021A01190318011701150414021301120211
+      0210050F010E020D020C010A0A09000A0A0C0D0E111315130D07050404050806
+      0307060600000061B1B0AFAEADACABAAA8A7A6A5A3A2A1A09F9D9B9A99989695
+      949291908E8D8B8A89888685848281807F7D7C7B797876757472716F6E6C6B6A
+      686766646361605E5D5B5A585756545352504F4D4C4B4948474645444241403F
+      3E3D3C3B3A393837360002350133013202310005302F2E2D2C00022B00032A29
+      280002270003262524000223022201210120021F021E011D011C021B011A0119
+      02180317000D181B20262A2F34393D4042434400024502470148054900054A4B
+      4D4F50000251015201530254015501540253000A51504F4E4C4B4A4948470245
+      000D444241403F3E3D3C3B3A393837000236000D343331302F2E2D2C2B292827
+      260002250005242322212000031F011E011D031C011B011A0219021801170116
+      04150213031201110510020F010E020D010C010B080A0209000A0A0C0D0E1013
+      15130D07050403050506070702060207020600000061B1B0AFAEADACAAA9A8A6
+      A5A3A2A1A09E9D9C9A989796949391908E8D8B8A888786858382807F7E7C7B7A
+      787775747371706F6D6C6A696766646362605F5D5B5A585756545351504E4D4C
+      4A49484645444342403F3E3D3C3B3A39383736353433320002310004302F2E2D
+      022C00052B2A292827000226000325242300022201210220011F021E011D041C
+      00041B1A191805170011181C212830383D41444647494A4B4C4D4E00024F0250
+      034F000550525456580004590258000F575655545351504E4D4C4B4A49484600
+      0245000444424140023F00073D3C3B3A39373600023500073332312F2D2C2B00
+      022A0128012704250005242322212000031F021E021D011C011B021A02190118
+      01170316021501140213031204110210020F010E020D010C010B040A020B040A
+      000B0C0D0E101315130E070403000304030504060C07020600000060B0AFAEAD
+      ACABA9A8A7A5A4A2A1A09E9D9B9A9896959392908F8D8C8A888785848381807F
+      7D7C7A797776747372706F6E6C6B6A6867656362605F5E5C5B59575654535250
+      4F4D4C4A49484645444241403F3E3C3B3A393837363534333231302F032E0004
+      2D2C2B29022800032726250002240123012202210120021F011E021D011C031B
+      011A021900031A1917000316000C181B1E20232A323B43494C4D044F02500251
+      01520254025600065758595B5C5D035E00145D5C5B5A59575655535251504E4D
+      4C4B4A4948460245000444424140023F00063D3C3B3938360234000733323130
+      2E2C2B00022A00032928270002260325022301210220021F031E011D021C011B
+      021A021901180317021601140313041203110210020F00040E0D0C0B030A040B
+      030A000C0C0D0F111315140F08040304050504060E070000005EB0AFAEADABAA
+      A9A7A6A4A3A1A09E9D9B9998969493918F8D8C8A8987858482817F7E7D7B7A78
+      77757472716F6D6C6B6A6967666463615F5E5C5B595856555352504F4D4C4A49
+      4846454342413F3E3D3C3B3A3837363534333231302F2E2D022C012B032A0004
+      2928262502240123012202210120021F011E021D021C011B021A011902180717
+      000C181B212B34383A3F444A4E500552000A53545556585A5C5E5F6002610362
+      0261001B605F5D5C5B5A59575654535251504E4D4C4B4A494847464544424100
+      024000073F3E3D3C393633000432000531302E2C2B00032A0128012702260325
+      00032423220002210120011F031E021D021C011B031A01190118021702160115
+      01140613031202110110020F00030E0D0C00050B010C040B000A0C0E0F111416
+      15100905020404050406060702080707000002AF004EADACAAA9A8A6A4A3A1A0
+      9E9C9A9997959391908E8C8A8987868482817F7D7C7A797776747371706E6D6B
+      696867656462615F5E5C5B595856555352504F4D4C4A494746454342413F3E3D
+      3B3A39380236023400073332302F2E2D2C00022B00042A292827032601250124
+      0523012203210004201F1E1D021C011B011A021902180417000B191B1D20242B
+      37485558560002550003565758000259025A00085B5D5E606162646504660265
+      001F64636261605E5D5C5B5958575654535251504F4E4D4C4A49484746454442
+      4100024000073F3E3D3C3936330004320130012F022D012C012B022A00032928
+      2700022602250224000423222120041F011E011D031C011B021A011901180217
+      0216011503140713011201110210020F010E020C010B050C030B000A0C0E0F11
+      14161511090503040305040606070408050700000052AFAEADABAAA8A6A5A3A1
+      9F9E9C9A98969493918F8D8B8987868482807E7D7B7A7876757372706E6D6B6A
+      686765646261605E5D5B5A5856555352504F4D4C4A494746454342413F3E3C3B
+      3A3837363534333202310007302F2D2B2A292800022701260125022404230224
+      01260129022A0129012802290004282725230222000321201F00021E031D0010
+      1E2023272B30374251626D6E6A66646202630264000565646566670002680369
+      0268026700206665646261605F5E5D5B5A5958575655545251504F4E4D4B4A49
+      474645444342044000073F3E3D3A373534000233000332302F00022E00072D2C
+      2B2A29282700032603250124012202210320011F021E021D021C021B00041A19
+      181703160315021401130314021301120111021000050F0E0D0C0B00030C010D
+      010C020B00060C0D0E1011140216000311090500030403050306060708080207
+      00000050AFADACAAA9A7A5A3A19F9D9C9A98959392908E8C8A88868482807E7C
+      7B7977757472716F6D6B6A6967666462615F5E5C5B595856555352504F4D4C4A
+      494746454342403F3D3C3B3A3837363433323130032F022E00072C2A28272625
+      240002230222000D23242527292B2E32373A3938370002380004373633310230
+      022F012E022D012B022A000F2C2E32363C424C5765707778746F6C00066A0269
+      056A02690268002267666564636261605F5E5D5B5A5958575655545251504F4E
+      4C4B4948474544434240023F034000073F3E3B3836353300023201310130022F
+      00052E2D2C2B2A000228032703260004242322210320021F021E021D031C0003
+      1B1A190004170316021504140213021201110210010F010D050C020D00080C0B
+      0C0D0E10111402160003110A050003040305030604070C080000004DAEACABA9
+      A7A6A4A2A09D9B9A989593918F8D8B89868482807E7C7B79777573716F6E6C6B
+      6967666463615F5E5C5B595857555452504F4D4C4A494746444342403F3D3C3B
+      39383635343331302F00022E012D022C022B00052A2927252400042302240009
+      26282C2F34373A3D41000244014304420003413F3E00023D00073E3F403F3C3A
+      37000236000A383A3F444C555F686F76027A000477726F6C056B056A03690268
+      016702660165016302620160015F025E001B5D5B5A5958575655535251504F4D
+      4C4A494746444241403E3C3D3F00024100073F3E3C3936343200043102300006
+      2F2E2D2C2B2A02290228022700052625242322000321021F031E031D021C0003
+      1B1A19000318031702160115041402130212000411100F0E050D010E010D030C
+      00050D0E1012140002160003110A050003040305020604070D080000004EADAB
+      A9A7A6A4A2A09E9B99979592908E8C89878582807E7C7A78767472716F6D6B6A
+      68666462615F5E5C5A595856555352504F4D4B4A494746444341403F3D3C3B39
+      383635343231302F2E2D2C2B022A022902270126042500122627292B2D303337
+      3B3F42444546474847460345014403430003444546000247000345413F00023D
+      000B3E41464D555E676D71737700027A00057874706D6C00026B036A06690268
+      016702660003656463000262000C61605F5E5D5B5A58575554530251000D504F
+      4D4C4B4947464543413E3D00023B013C013F02410006403F3C39353302310432
+      0131022F00032E2D2C00032A0229022800032726250002240006232221201F1E
+      021F041E00031D1C1B00021A0219011802170216021502140115021401130212
+      000311100F00040D030E010D020C00050D0F1012140002160003120A05000304
+      0205030604070D080000004BACAAA8A6A4A2A09E9C999794928F8D8A88868381
+      7F7D7A78767472706E6C6A6866656361605E5D5B595856555351504E4D4B4A49
+      4746444341403E3D3B3A39373635333231302E2D2C2B2A000229012802270426
+      000E27282B2D2F3235383B3E4042444606470246064501460147034900034846
+      430003410009444950575F676D7173000274000977797A7874716E6C6B00026A
+      07690268026702660003656463000262000A61605E5D5B5A585653510250024F
+      00074E4D4B4A484645000244000443413F3E023D013E01400242000641403D3A
+      3634053302320130022F012E012C022B032A0003292827000226022500052423
+      22212000021F0120031F021E011D011C021B00031A1918000217021601150214
+      031501140313000412110F0E020D040E00080D0C0D0E0F10121402160003120B
+      0500030402050306030709080209030800000046ABA9A7A5A3A09E9C99979491
+      8F8C898785827F7D7B78767472706D6B6A68666462605E5C5B59585654535150
+      4E4C4B49484645444241403E3D3B3A383736343332312F2E2D2C022A01290628
+      000E292A2C2E3033363B3E414445464702480349014803470246044500044647
+      4849034A000E484745444345484D545C646C71740276000D7574757678797875
+      716E6C6B6A0003690668026702660265000D646362605F5E5C5A585653515000
+      024D034E00054C4A484644000243014402450143024204410008424342413E3C
+      393702350234023300063231302F2E2D032B022A022901280127032600032524
+      220002210520021F00031E1C1B00021A00031918170005160215031601150214
+      0005131211100F00040E020F010E020D00050E0F1012150002170003130B0500
+      0204030502060407040807090208010900000043A9A8A5A3A19E9C9A9794918E
+      8B898683817E7C797674726F6D6B69676563615F5D5B5957565453514F4E4C4B
+      494746454342403F3E3D3C3A393736343332302F2E2D2C00032A0015292A2B2C
+      2E2F31323436393C3F4244474A4B4C4D4C00024B034A02490148014705460147
+      02480149014A024B014A01490247000B4647494E5359616970757900027A000F
+      78777574757677797875726F6C6B6A000269066802670266000D65646362615F
+      5C5A595855535100034F024D024E00054D4A4947460003450008464847464544
+      4342024101420243000742403D3A3836350002340133013202310130012F022E
+      012D022C022B012A022901280127022600042524232203210220031F00031E1D
+      1B00021A0119021802170118021706160115021400041312110F030E00040F10
+      0F0E020D00050E0F1112150002170003130C0600020403050206030705080A09
+      0000003FA8A6A4A19F9C999794918E8B888683807D7B787572706D6B68666462
+      605E5C5A58565453514F4E4C4B494746444342403F3D3C3B3938373634333230
+      2F2E2D00022C022B00102C2D2F3033373B3F42444648494B4C4D024E034F024E
+      00034D4C4B00024A0003494849000248014703480149024A014B034A04490011
+      4C4F545B626970757A7C7D7E7D7B79777600027401750176027800087673706D
+      6B6A69680567026602650008636261605F5E5B57035501530150034F0150024F
+      0150024F00034C4B4A00054900074A48474644424000023F000A404243423F3C
+      3A38363504330332000431302F2E022D00032C2B2A0003290003282726000225
+      0124012204210120041F011D011C021B021A0219041802170118021702160115
+      0214000313111000040F0210000D0F0E0D0E101113151718140D070002040205
+      0306030703080C0900000035A6A5A29F9D9A9794918E8B8885827F7C79767371
+      6E6B696663615F5D5B59575553514F4D4C4A494746444341403E3D3B3A383736
+      35000234000332302F00042E022F000C313234383B3F43474B4E515202530154
+      0253025201510150024F014E024D014C024B034A0149054A054B034A000C4B4D
+      4F52575D636A71787C7F038100077F7E7D7B797776000274000C757677787673
+      706D6B6A68660564016302620004605F5E5C035B000359565400025500055451
+      4F4E4F00025103520005514F4E4D4C00024B034A000648474544413F023E0007
+      3F4143423F3B38000237013602350234023303320131012F022E00042D2C2B2A
+      0229000328272600022501240123022202210220031F011E011D021C031B031A
+      041902180217011602150003141312000210010F02100211010F030E00041011
+      131602180003150D0700020402050306030703080509040A030900000033A5A3
+      A19D9B9895928E8B8885827E7B7875726F6C696764625F5D5A58565452504E4C
+      4A4847454442413F3E3C3B3938373534330004310330000F313436393B3E4144
+      484C4F52545657000358025700085655545352504F4E024D024C014B024C044B
+      034C014B044C000F4B4C4D5052565C61676D74797E8184000285000A84838280
+      7F7D7B7977760374000B7677787774716E6B69666100045F035E015C025B025A
+      035901580156035501540152025001510252000753545352514F4E00024C014B
+      024A00074948464543414000033F014102430004403D3A390338013701360235
+      01340233000332313000022F00032E2D2B00022A022901270126022502240123
+      022201210420021F011E011D051C021B031A0219021802170116021500051412
+      11100F0002100211000F100F0E0F101113161819150E07050400020503060207
+      03080609070A0000002FA4A19F9B9895928F8B8884817E7B7774716E6B686562
+      5F5D5A585653514F4D4A4947454342403F3D3C3B393836353400023203310011
+      32333536383B3F44494D5052545658595A00035B015A0259000A585756555453
+      5251504F024E024D054E054D024C00114D4E505254575B60656C72787D818486
+      87000288001C8786858382807F7D7B7977757473747577787775726F6C68635D
+      5A59025A0159025A045903580157065601550154025301520453000652504E4D
+      4C4B024A000849484746454442410340000741434443403D3B00033901380237
+      00033635330002320231022F00032E2D2C00032B00042A292726022502240123
+      022201210320021F011E011D041C011D021C011B021A03190218021700051615
+      1413110003100211000312111000020F000B111214161819160F080504000205
+      0206030702080509090A0000002FA2A09D9996938F8C8885817E7A77736F6C69
+      6663605D5A585553514F4D4B48464442403E3D3C3B3A39373534333231000232
+      000E3335383D4145484A4E5255585A5C055D025C00035B5A5900025801570156
+      025501540253035208510150014F024E00124F505152565A5E63676C71777C81
+      8587898A028B00148A89888786858382807F7D7B797674727172747602770008
+      7573706C67615B58045702580257045801570556025701560155025402530252
+      025100064F4E4D4C4B4A0249014802470004464544430442000743454443403C
+      3A000339023801370135023302320131023000032F2E2D00032C00032B292800
+      0326022501240223012202210120021F011E031D011C021D021C011B021A0419
+      031800071716151412111000021103120110020F000B111214161819170F0805
+      0400020502060207030804090A0A00000024A09E9B9794908D8985817E7A7773
+      6F6B6864615E5B585553504E4C4A48464441403E3C3B033A023B013901360334
+      000F36393D40454A4F535658595B5C5D5E00025F025E025D015C025A01590258
+      025707560255015602550254065300105456585B5F63696E74797E8185888A8C
+      038D028C00108B8A89888786858482817F7D7B787571026E0003707376000277
+      00097674706C67605B5857000256015701580359025A02590157055602570004
+      58575554025202510250024F024E00044C4B4A49034802470146014404430144
+      0246000544413E3B3A0003390004383735340233013202310004302F2E2D032C
+      00032B29280003270126012502240223022201210220021F011E041D021C021B
+      051A011902180006171615141312021102120003131211000210000B11121416
+      181A17100905040002050206020703080309070A020B020A000000229F9C9995
+      928E8A86827E7A77736F6B6763605C595653504E4B494745444342413F3E023C
+      00133D4044474846403D3F4145494E5155585B5D5E00035F045E015D025C025B
+      035A0359035804590258025701580557001258595C5D6063676B6F74797E8286
+      898B8D8E048F018E028D00168C8B8A89888786858482817F7C7875716D6A6C70
+      73760277000B7675726E69635F5C5A595800025A045B015A0259015805570358
+      015701550453025201510250024F024D00034C4B4A0002490248014705450146
+      0247000545423F3B3A00023902380004373635340233013202310008302F2E2D
+      2C2B2A29032803270126022501240223012201210320021F021E031D021C051B
+      011A0219000518171615140005120003131211000210000911121416191A1710
+      090004050206030701080309070A030B020A000000199D9A97938F8B87837F7B
+      77736F6B67635F5B5855524F4C4A47000245024401460147024800064746484B
+      5157025B000B57514E4F515457595B5C5E00045F015E015D035C025B025A025B
+      025C015D015C025B035A015B015A02590158025900155A5B5C5D5F616366696D
+      7074787C7F8386898C8D8F00039001910390018F018E028D00068C8B8A898887
+      0286001B8482807C78726F6E6C6B6D7073767778777673706C68645F5C5B5A00
+      025B055C025B045A0659015701550254000355545300025202510150024F0004
+      4E4D4B4A034902480547000C484744413E3C3B3A383738370236013502340006
+      333231302F2E022D00032C2B2A00022904280127022602250124022301220321
+      0220021F011E021D011C011B021C031B021A0005191817161500021302120004
+      131413120210000911131517191A1811090003050306030701080309030A080B
+      010A000000189B9995918D8984807C78746F6B67635F5B585552504D4B490248
+      00064A4B4E51545602580004595A5D6002620160015D025A025B015C025D015E
+      025D015E025D00045C5B5C5B075C025D025E015D015C025B025A035C00145D5E
+      60616366696B6F72767A7D818386888A8C8D028F019008910190028F00038E8D
+      8C00028B000C898887868583807D78726D6C036D00056E70737677000278000A
+      7774726F6A65605D5C5B025C025D045E015D045C000B5B5A5B5C5B5A59575655
+      560002550254015301510250024F00044E4C4B4A044901480347000748494845
+      413E3D00023C013903380237013602340133013202310130012F022E012D022C
+      012B042A022902280327000426252423022202210004201F1E1D021C021B031C
+      021B011A0119021800061715141312130314011303110008131517191B191209
+      03050206020703080209040A090B000000159A97938F8B86827D7975706C6863
+      605D5A5856545300045100075356585B5E606200026305620161025F055E045D
+      015C015D035C035D045E015D025C025D025E025D025E00165F61636567696C6F
+      7275787B7E8185888A8B8C8D8E8F0290049106920291029000038F8E8D00028C
+      000B8A8988868482807D79757100026E026F00066E6D6F727678027900087776
+      73706A645F5D045C00095D5E5D5E5F605F5E5D00045C035D00045B5A59570355
+      015601550254000A535251504F4E4C4B4A490448000447464748024900084643
+      41403F3D3B390438013702340233013202310330022F012E042D012C022B012A
+      0229022800082726252423222120021F00031E1D1C00041B031C021B00061A19
+      18171614031301140215011302110009121315171A1B1A130A00030502060207
+      03080209040A090B000000139895918D88847F7B76716D686562605F5E5D5C00
+      045B00075C5D5F60626364000363026202610260015F045E035D015E075F0260
+      035F065E00185F6061626465676A6C6F7276787C7E818486888A8B8D8F900291
+      0290089107920191029000108F8E8D8C8B89878583807E7C7A78767502730008
+      71706E6C6D71757702790007787674716B646000025E035D045E00056062615F
+      5E00045C035D00055C5B5A5856000255015602550354000452514F4E024D0003
+      4B4948000447000346474900024A000749464442403E3C000239000538393837
+      350004340433033201310130022F00102E2D2C2B2A292A292827262524232120
+      021F021E011D011C041B051C00061B1A191816150414021501130211000A1213
+      15171A1B1A130A0602050206020702080309030A070B020C010B000000129794
+      908B86817D78736E6A656463646564630562016301620263036201610360015F
+      095E025F01600161026207610160015F026000176162646667696B6D6F717477
+      7A7E818487888A8C8D8E8F00039001910492059104920191079201910290000A
+      8F8D8C8B888682807F7D037C001A7B7A77757371706D6B6C707477797A797775
+      726E696462605F5E025D035E0005606261605F00025D015C015B045C00045B5A
+      595703560355000656555452514F024E014C014A02480249014A0249014A024B
+      00084A474542403E3C3A0239013A023902380437013602350234000333313000
+      022F012E012D022B012A0229022800062726252423220220021F021E011D031C
+      011B011C031D011C011B021A0003191715000414021501140212000A13141517
+      1A1C1A130A0602050206020702080209030A040B060C010B0000000E96928E89
+      847F7A75706B6764656702680167016503640263016202610260025F015E065D
+      015E015F02600861036002610003626364000265001267686B6E717477797B7E
+      80828487898C8D8F0290049103920191069201910E92000A91908F8E8C8A8987
+      8481037E037F00067E7D7A76726F026E00076D6A6B6E73777900027A000B7877
+      74716C6763615F5E5D00045E0460025F015E015C025B015C025D00045C5A5957
+      025600045756555602570008555452504F504F4D024B034C044B000B4C4A4743
+      403F3E3D3C3B3C00023D023C013B013A02390003383736000235000334323000
+      032E00042D2C2B2A042900032827260002250003242321000220041F021E031D
+      021E021D00071C1B1A1918161500021401150216000D151312131416181A1C1B
+      140B060002050206020702080209030A040B070C0000000D94908C87827D7873
+      6E69656467000269000368676400036300046261605F025E035D025C025D025E
+      00035F606100036201610360035F00156061626466686B6D6F7174777B7E8285
+      87898A8B8D00028E00038F9091000292019301920393079203930C9202910008
+      908F8E8D8B8987850284000D82818081828381807E7C78736E00026C00086D6C
+      6A6B6F747879027A000C797876736E6863605E5C5D5E035F035E025F0003605F
+      5D00025C015D025E00045D5A595807570004565554530352000351504F00024E
+      014D014C044B00084C4B48444241403F023E023F023E00033D3C3B0002390237
+      000636353433312E052D012C012B032A01290128022700052625242322000221
+      0620011F011E021F021E021D00051C1B1A191700031501160217011503130009
+      1516181B1C1B150B060002050206010703080209020A030B090C00000013938F
+      8B85807B76706B666364686968676563620002610160015F025E045D025E015F
+      0360025F0006605F605F605F026000136160616365686B6F7275787B7F818487
+      8A8D8F0002900291059207930194049302920193019203930992000A91908F8E
+      8D8B8987858403830184058500098483817E7B7976726E00046C00146B6D7175
+      78797A7B7A7977746F6863605E5C5D5F0360015F025E015F0260015F035D015E
+      025F015D025A0159015702560357015601540353025400085352504F4E4D4C4B
+      034A014B024C00074B48464442414000033F013E023D00043B3A393703360135
+      02330131012F052E012D012C022B022A00042928272602250124012302220121
+      012004210420021F011E011D021C00041B191716021501160217011603130009
+      1516181B1D1C150B060002050206010702080309020A030B060C030D00000012
+      918E89847F79746E696461626768676564620360025E015D025E025F02600361
+      0160015F025D025E026000166163646667686A6E71757A7E8285878A8D8E9091
+      929303940D93039401930194089304920291000A908F8E8C8B89868584820281
+      0004838485860388000D87868482807E7C79787673706E00046D00056E727678
+      7A00037B000B7A7875716C6663605E5F600002620161015F025E015F0260015F
+      035E00055F605E5B5900025A0158025502560003555452000251015302540003
+      53504E00024D014C014B024A000F494B4C4D4E4D4B49464341403F3E3D00023C
+      023B013A0138023702360005353433323100052F012E012D022B022A00032928
+      2700032601250124022301220821032000081F1E1D1C1B1A181703160218000D
+      161413141516181B1D1C160C060002050206010702080209020A030B040C060D
+      0000000D908D88827D77726C67615E5F64000266000464636160025F015E025D
+      035E025F016004610018605F60626466686A6C6F7174777A7E8185888B8E8F90
+      929302940595029406930C94039303920291000D908F8E8C8A89878685838281
+      820002830004848587880389000E88878583817E7D7C7B7A7977747203700008
+      6F6E707477787A7B027C00087B7977746F696561025F0005606263626000025F
+      00056062636261000260025F00075E5B595A5B59560004550154015302520005
+      535453524F00034D024C014A0249014B014C034E00074D4A464342403E00043C
+      00043B3A393802370236013501340233013201310230022F00042E2D2C2B022A
+      01290228032702260003252322000421032202210220021F00061E1D1C1B1917
+      0216011702180008171413141517191B021D0003170D07000205010602070208
+      0209020A020B040C070D0000000A8F8B86817B76706A655F025C016102650007
+      646361605F5E5D00025C035B00075C5D5F6163656700026800126A6D70727579
+      7C7F818386898B8C8F909293039401950696019502940193029402930E940292
+      000A908F8E8D8C8A87858380027E017F02810005838487888900048A00098987
+      86858482807E7D00027C00067D7B797776740473000872747576787A7B7D027C
+      00077A7875706A656100025F016103630162026001610163036400066361605F
+      5E5D035B0159015705560155015404530003524F4E00044D014C024B024D014E
+      024F00074D4A464341403E00043C00033B3A3900033802370136013503340132
+      02310004302F2E2D022C012B012A022905280003272624000223062204210120
+      011F021E00041D1B1A180317000418191815021400041617191B021D0004170E
+      07050206020701080309020A020B030C080D000000188E8B85807A746E69635D
+      59585D6265646361605F5D5C5B5A03580017595B5F646A6E717476797C7F8285
+      87898B8D8E8F9091920002930294039507960395039403930494059302940006
+      9594918D89860284000383807D00027B027A00107C808487898B8C8D8C8A8887
+      868483810280017F037E037D00077C7A78777675760003770175027300037579
+      7C00027D000B7C7B7976716A64615F6061000363026200036162640003650006
+      646361605E5D045B02590358025701550354000453525150034F0150014F024E
+      014F014E034F00074C48454342403E00023D023E013D013C023B00063A393837
+      3635033401330232000431302F2E022C00032B2A290003280329000328272600
+      022501240323022205210120021F00071E1C1A19181718000219000E18161516
+      191D1E1F201E180E07050306010701080209020A030B020C050D040E0000000E
+      8D8A847F79736D68625C575559600263000962615F5E5C5B5A5958000257000F
+      585A5F69737B7F828487898B8C8E8F0002910392029303940595029604970196
+      02950494029301920293029202910190028F01910192029400058F87817E7D00
+      027F017E027C037D00048083888A038C00058B89858281000480017F027E017D
+      027E027D00047C7B7A79057A000379777300026F000F73787C7D7E7D7C7B7873
+      6D686563620006630262016301640265026400056261605E5C00025A025B045A
+      0003595856000455025401530252015301520251055000044F4C474502430142
+      01410440000A3F3E3D3C3B3A3837363503340333000532302F2E2D00022C012B
+      012A03280129012A0229000328272600022501240123072202210006201F1E1D
+      1B1903180010191A1916171F293135332E251B0E07050306010701080209020A
+      020B030C040D050E000000168D89847E78726C67615C5652555C626362605F5E
+      5C5B035A01590258000C5A616F7E86898B8D8E8F909102920193099403950296
+      0697000396959400039301920191039000058F8E8D8C8A00028900038A8C9000
+      0293000590898381800002820181027F0180028100048285888A028B00048987
+      847F027E017F01800281017F027D017E027F017D017B037A017C027E000B7D7C
+      7A78746F6C6E74797C00037E00097D7C7976716D696665000263026206630264
+      000763646362605E5B00025A025C015B035C00045B5A58570358025702550254
+      00055352515051000250025100074E4A4846454443000242000B41403F3E3D3C
+      3B3A3837360005350234000433312F2E022D00032C2B2A000329042A00052928
+      2625240002230422022302220121022000041F1E1C1A031800101A1B1A171D2E
+      48595F5747311F0F08050206020701080209020A020B030C030D060E0000000B
+      8D89837E78716B66615B550002510159016002620003605F5E00025C025B025C
+      00095A595B6374848B8E8F000290019102920293029408950596039702960003
+      95949300029100058F8E8D8B8A0003890003878685000283000B84868A8E9193
+      928F8B88850002840183028204830003848586000288000386848200027F0003
+      808182000283000782807F8081807E00027C017D017F0281000D7F7D7A777472
+      6F6E71757A7C7E00027F000C7E7D7B7875716D69666463620263056402630162
+      02630004615F5D5C025B035C015D035E015D015C045B00035957550002540003
+      535251000250035102520006504D4B484544024202410004403F3E3C033B0139
+      01380637000636353432302F022E022D012C052B022A00042928262502240823
+      0222000621201F1E1C1A031900101A1B1A1823406D8995846640230F08050206
+      010702080209020A020B020C030D070E000000158C89837D77716B65605B544F
+      4E555E626361605E5D00035C000B5D5E5D5B5C6475858D8F9000029103920293
+      019403950003969596000295069602950194019302920008918E8C8B8A878483
+      0281018201830382000D80818386898C8E919493918D88000386018502830006
+      8281828384850286018404810004828385860287000385838200048104830004
+      817D787502720171026F00057174777B7E00037F000A7E7C7977736F6B686564
+      0263016401630464016303620160015F045D015E035F016001610260025E015D
+      015C025A0003585553000352015103500251015202530007514E4B4745444100
+      0340000541403F3E3D00023C00033B3A3900053800073736353332313000032F
+      012E042D012C022B00042A292827022602250624022300072221201F1D1B1A00
+      021900101A1C1B18284D84A9B3A07A4A270F08050206010702080209020A010B
+      020C030D080E000000158C88837D77716A645F59544E4C515B62646261605F00
+      025D00045C5E5F5E025D00056372838C90000391029203930194029504960195
+      0496019502930003918F8C00048A0188028600048583807E027D017E017F0380
+      000D7F808285888B8D909495938F89000286000487858382028101840585000E
+      827F8082848587888A8B8A8885840282018301850286000683817E7A75740373
+      0007716F6E7073797D000280027F00097D7B78746F6A67656400036302620163
+      01640265000363626000025F00046065676A036B00066A686663615F025C0004
+      5A5857560253000452555859025A0003595653000354000353504F00024D0006
+      4B4744424345034700124643403E3C3D3F42434544413C383634333203310130
+      022F012E022F01300233000634312F2A28260225032401250224022301250128
+      022A00052927221E1D00021C0004192A528E02B30009AD8352301B15100D0900
+      0208000A090C11131614130F0E0D040E050F000000108C88837D77716A645E58
+      534D4A4E5861026300096261605F5E5D5E5F6000025E0006616D7F8A8F900391
+      02920293029401950196039501940293001292918F8D8C8985807F8082838281
+      8281807E067D017E038000108183878A8C8F939695908B878687858202810182
+      03850384018202810005838587888900038A0003898784000283000B84868784
+      7F7D7C7A7877760002750172016F026C000371787D00048000077E7C78726C67
+      65000264016302610260000C616365666463626368707A800282028000097E7C
+      78726C645E5B59000257000E5554575D656C7174736F675F5A570256015A0160
+      0265001C60574D4749505A5F615D554A444349535B5F61605A51473E38363433
+      023201310130022F000B30353F484E4F4A40332A26000225022404250028282D
+      3641484C4A463D3228221D1A2A528EB3B4B08B62493C383125190E0A0C16242F
+      332F2619110D040E050F000000108C89837D77716A645E58524C484A545E0363
+      00106261605E5D5E5F605F5E606979888F90049101920493029402930007918F
+      8D8C8B89870002850182017E027B017C067D037C017E027F00047E7D7E800281
+      00078082868A8C8F930002960007938E8A8785838000027F0180018302850184
+      03830282000383858700038802870003888684000283018502860183027E0009
+      7D7C7B7A787776737000026D000470777C8002810007807F7D79736C66000364
+      0003626162000263016401660267001666656467738496A0A3A2A19E9D9B9790
+      86796C635D5A0258002F5C677586929A9D9B9488796B60595C687D898D826F59
+      4D52657A85887E6D594E546576848C8F8C84766452433A3634000233000E3231
+      302F3240556B797C705C413002260425000826272B34465A6D79027F000B796C
+      5A4532251D2B528FB30002B400039A7F73000270000F67523A20111326455B66
+      5B4629160D00020E070F0000000C8D89837D77716A645E58524C024700034F5B
+      620004630161015F025E015F026100065F606674848D02900391029201910190
+      028F028E00048D8A88860285000C83828182807D7B7C7B7A797A037C027D0008
+      7E7F8081807F7E800383001084878B8D8F939697958F8A858382807F027E0180
+      0183028402830184018502840185018602870186038501840382018402850182
+      0380001D7F7D7C7A797673706F7071777C80818281807E7B77716C6967666566
+      6800026901680269000C686766656B7B94AEBDC2C1C002BF0010BEBCB7AC9D88
+      74645D5A5E6D829AACB702BC0013BBB8AE9D887262647596ABB3A38764566180
+      9D0002AD00129B7F6561718BA1ACB1B2B0ADA18E735843370234013301310230
+      000C2F364A6C8FA4A997795036280227012602270008282A384F6D8A9CA402A7
+      000BA49C8B715236222D538FB30002B40013AFA3A0A1A29A87673F1F1D366588
+      998967391B00030E050F0210000000118E8A847E77716B655E58524C47454B56
+      6000036300106462615E5D5E60626160636D7D8A8F9004910004908D89870286
+      0287018601850384018202800004817F7D7C027D027C017D027E017F03800004
+      818284850283018501870388000B8A8C8D8F929698948D87820002810008807E
+      7C7B7D8083850286000387888700038500078687888785828100028001820384
+      0181018002810180017D027B00037A777300027100057375797D80000382000F
+      817F7D7A76726D6967686A6C6D6C6A0002690268000667666C7F9EBD04CC05CB
+      0010C9BDA78C72615E6A83A1BAC6C7C3C0C102C50028BCA78A706C7EA5BFC3B8
+      987264779CB9C1BCA2816E7792AFBDBEB9B5B7BCBDB29774523E353433320331
+      000438517AA502BA0006B08B5A3A2A29042800162A344C7195AEB7B4ADACB0B4
+      B09A774F2F30538FB3B402B50012B3AFB1AEADAC8F6235283F769FAFA077411D
+      020E040F0410000000128E8A857F78726B655F58524C474346515D6202630264
+      01620160025D015F0262000760616876858D9000049100048F8A858102800181
+      048300038483810002800282058003810003808183000284000385878800028A
+      0189048A0289028A018D0192029700069289837F7E7F0280037F000380838600
+      0388018A01890288028601870289000986838180818283848300028100118281
+      7F7C7A7C7B78757475787A7B7E8182000283000882807E7C7975706B026A0006
+      6D6E6F6D6B690267036800046E81A2C202CD02CC0003C9C5C60003CC0009CBC0
+      A5826A66799AB90002C80005C1B0A7ABBC0002C70007BEA3817583AAC40002C3
+      0005A7877D91B10002C10016B69477748DAEC0BFB7A3989EB1BEBDB390674838
+      36350233023200043A5480AC02BA0006B8915D3B2A2903280006292E416690B3
+      02B70015A28E8C99B0B4B5988D6C657BA3B3B4B5B6A99D9BA90002AD000DAA81
+      4A323D6B91A2916C3C1B0E00050F0410000000128F8B867F79726C666059534D
+      4742434B586002630010646563615D5C5E6162605F636E7F8B8F0291000A9291
+      908B847E7B7A7B7E028000038182810002800004818485840383018503860185
+      018603880189018A048B00058A89888785000284000A868A909698948C86827F
+      028004820006818385878889038B000C89868587898A88868482818202830006
+      82818081807E027B027D017C027A017B017C027D00037F818200028300088281
+      807D7A77726D026C016E026F00036E6B690002670168026900046F82A3C302CD
+      0003CCC6B20002A801B501C502CC0010CBB895767087ABC7C8C6AC92848BA4C0
+      02C70006B38F7E86ABC502C40004B9A39CAB03C1000EA47F6D7CA0BFC0BD9F7F
+      6E7895B502BD0006A47A553E37350234023200043A5480AB02BA0008B9935F3D
+      2D2C2B2A0229000F334E7CA8B8B7A780625C749AB4B5AD0004FF01E102B40007
+      B5A887706F88A90002AD000C935C3735567785785731180E020F071000000019
+      908C86807A736D67615A544E48434146535E6263646564625E00025C00095F61
+      605F606877878F00029102920009908B837B7776787B7E00057F000580838689
+      8800028701880189038A01890188048702890388000587858483810002800004
+      83878D9402980007938E87807E7F810002830184038502840187018B028C000E
+      8A8786878889888785838283828103800281017F027C017F0281027F037E0004
+      7F808183028400088382807E7B78736F026D026E00046F6D6A68026700076869
+      6A6F83A3C30002CD0010CCB89B888697B0C9CCCBC5A5827B91B602C80007BE9B
+      7C6B7491B60002C70007BC9A858BACC6C50002C401BE01B903C10006B38E6D69
+      84AC02C10007B48C65515D7FA90002BD000FB1875D41373534333231395480AB
+      BA0002B9000D9A6E5245433F38322E39588BB40002B800079665433D5886AE00
+      02B504FF01E102B40007B595684B4A6B9B0002AD000C9C68392E446470654526
+      150E020F05100111011000000015918D87817B746E68625B554F494440424D5A
+      6062630002650005635F5C5B5D000260025F00046370818D029200069392908A
+      81790275000E787A7D7F8081828385878A8C8B8A038900068A8B8A8784820281
+      00038284850002830585001D84838283868A919799979188807C7D7E80828588
+      87848384888C8D8C8A000387038800038785830003820581001B828180818485
+      848381807F7E7F8081838485848381807D7974706E00056D016A016802670169
+      026A00047083A3C302CD0008CCB18D7670819EBE02CB000FCAAE8D8497BAC8C9
+      B99472606A88B10002C70006C09E888DADC602C402C301C202C10007BFA07960
+      6688B10002C10007AF835A445173A30002BD0008B58C5F423735333202310004
+      3A5480AB03B90016AA8B776D6A655A4B3D425F92B7B8B58E59352F4C7CA902B5
+      04FF01E102B40003B28B58000238015C019202AD000C9F6C3B2E477181724825
+      130E020F0410021101100000000E928E88827C766F69635D57504B4502400023
+      49575F6162656665615C5B5C5F61605E5F697A8A91939493918A807977787C7E
+      82858700058900058A8B8A89870002860005888988837E00027C00037D7F8300
+      0584001C85888A89868584868A909698968E857E7B7A7B7D80868A898887898B
+      028D018B01880287000688898887868502840003858483000282028301850286
+      01870288000486848281027F00047E808284038500098482817E7A76716E6D00
+      026C026D00056B6A69686900026A000E6F83A3C3CECDCBAF8870667691B803CB
+      000EB5928797BAC9CABC9875626C8AB302C70006BF9E878CADC602C402C303C2
+      0018B69069566186AFC1C0B1875F485577A5BEBDB38A5D413635023200073132
+      3B5580ABBA0003B90017AEA4A09E988B755A516391B7B8B7905D39324F80ABB5
+      B60004FF01E103B4018E015C023E0161019502AD000B9D69393252859885532A
+      1300030F021005110000001A938F89837D77716B645E58524C46413F45525D61
+      62646766625E025B00035E616000025E00056473849094000295000F938E8682
+      7F808384878A8B8C8B89860002840285018403830005868887817E00027D0003
+      7E80840002860005848382848900028D018B0289000A8A8D919598968E85817F
+      027E000380838800028B000A8A8B8C8E8D8C8987868703880187028802890003
+      888784000283018501870289038A0005898784818000037F0004808284850286
+      00098583827F7C77726E6D00026C036D016C016A026900068FB4B7C1D1E102E7
+      0008E6D0A87765738DB403CB000EB79485AADBEEF1EEDAAC787F9BBC02C80007
+      DDCBC2C6CCC7C60002C501E003E10010DAA368535C99D6EBEEEBD39E626989B0
+      02BE000EAC82583E3534333266999EABC1D005BA02B802BA0007B39F7F6772B7
+      E00002EC0007DFB4684B658FB40002B504FF000AE1B6D1E7E4CE8E5876A102AD
+      01C301AF029B0007A599AD9861321600030F021005110000001A94908B857F79
+      726C66605A544E48423F424D5A6061636667645F025B000A5D60615F5E616C7D
+      8C940296000595938F8C88000486028800088786837F7D7E80810382000B8385
+      8786827F7E7D7E8185000288018602840187018C0290018E038C00038E909400
+      02980009938E8B87848384868800038B000A8C8D8E8D8A87858485860288000D
+      898B8C8D8E8C8A88858385888B00038C00058B8986817E00027F038000038284
+      8500038600078483807C76716E00026D016E026F00036D6B6A00026801B30AFF
+      0006FDC4818EB5CC02CB0003B89EDC0007FF0004EFB4B2C802C904FF0005E9C8
+      C7C5D70004FF0005F69F786DD20007FF0003ECA6A40003BE00059D734F3C3600
+      0335019A04FF01F403BB0004BAB0AAAF02BA02B900039FB0F50006FF0004FDC3
+      8BA602B501A704FF01EB01F205FF0003DA9AAE0002AD01EF03FF0007EB9DAF9D
+      69371800030F0110041102120000000F95928C86807A746E68625C564F494400
+      023F001647545D6062656765615D5B5C5F61605F606776889296029700099694
+      918E89878483820002810007807E7C7B7D808200028302820004848685830380
+      000A8184898B8A878687898E0290018D018A0288000A8A8D92989A9995928C87
+      0285000486888A8B028A000E8B8C8B8885848382838587898C8D028F00088D8B
+      89858385898C028D00078C8A87837F7E7F000481000382848500038700068584
+      817D756F026C016D026F00036E6D6900036701B30CFF0004F2A4B8CC02CB01BD
+      01EE09FF0005FED6CAC9B80004FF0005E9C8C6C7F70004FF0004D7B29EEA09FF
+      01FE01CF02BF0005AA8660463A000437019B04FF01F402BB0007BAAB8E8088A2
+      BA0002B901D40AFF0005E9B7B5AD8C000CFF0005DEAEAD9CEC0003FF0008ECA2
+      AFA3713B1A0F0210041103120000001796938D87827C76706A645E58514B4641
+      3E424D585E616400026701640160025D015E0261026000066570828F96970298
+      000796938F8984817E00027D00037E7F7D00027C00037E818400028502820284
+      01830482000583878B8D8B0002880189018B028D00038B8682000280000B8388
+      8F969A9B9996908A8500028401860189028A028900038A898600028400068281
+      8285888A028B00098E8F8D8C8A8684858A00028C00058B8A8885820002810009
+      83848382818283858700028800078685827E78726F00026E027000076E6C6967
+      6869B5000DFF01F101C202CC01CB01E504FF0003ECD8EC0004FF0004F9C4B49E
+      04FF0004EDC8C6DD04FF0004EABDB6E004FF0003E9D1E80004FF0008F7B8A68B
+      6B4E3F3A02380237019B04FF01F401BB02BA00099C725D6488AFB9C6FE0003FF
+      0004FAD0D5F704FF0004D0A38A6906FF01F901FB04FF0005FEB69B79E70003FF
+      0008EDA7AFA778401D0F0210021105120000001098948F89837E78726C66605A
+      534D4842023E000A46535C60626769676360025E001761636261636B7B8B9497
+      989997948F87817C7A797A7C7E00037F00078082858785828000028102800381
+      01830187028B00038A888900038A00048885827F027E000F82878D93999C9B97
+      918A848283858800028B01880286000484838486038701880489018D02900008
+      8E8B8785868A8B8A028800038786850004860184018302810003838587000288
+      0007878684807C767300037000086F6D6A6867696CB704FF01FB02E701EB01F6
+      05FF0004E1CDCCCE04FF0005E07F8FA0D90004FF0003C895810005FF0003E6CA
+      FB0003FF0004FDA39FAF04FF0005DB697B90D20004FF0009BD816852433C3A39
+      38000237019B04FF01F401BB02BA00089A6E575F84ACB9E604FF00057F5E7796
+      F80003FF0004F1785E4605FF0004BF8C88DB04FF000FB56D4DB5C0C2CCD1ACAF
+      AC7F45200F00021002110512000000189996918B85807A746E68625C554F4A44
+      3F3D424D595E6064026900166663605F61636463646874849196989998948D84
+      7E7A027900047A7E80810282000581828485830003810180017F027E027D0004
+      818587880287000688898A88858402830282000584868B909600029B000D958E
+      878281828386898B8884830002820005858A8D8E8C00048A00068B8E9192908C
+      02870004898C8B88038600088788898887868483028200038385870002880007
+      878684827E787300037000036E6C6A00026900036B6EB80004FF01F703CE01C6
+      01EB04FF01F702CD01D604FF00059F6A737E980004FF0003D3776B0006FF01F6
+      04FF0004BC6B73AB04FF000593525B68860004FF0005CA5C4F443D00023A0239
+      000338379B0004FF01F403BB0008A683717996B5B9F703FF0006E9353F4D5AC8
+      04FF0003633A2E0004FF0005E650544E7A0004FF0008B43926150C1D468303AF
+      0003854922000310021104120113000000209A97928D87817C76706A645E5751
+      4C46413D3F48555B5D61686B69666260616403650006676E7D8C95980299000B
+      968F86817E7B7C7D808182000283018202810280018102830003817F7D00037C
+      00037F8385000387000788898B8985838500028600068586888A8E94029A0003
+      92898300027F0008818284888B89848102800007858B8F91908F8E00038C0005
+      909293928C00028700058B8D8C8987000286000688898A898886028503830185
+      018702880007878685837E766F00026D00036E6D6C00026A00046B6D6FB804FF
+      0003F7CFCE0002CD01D705FF0003D0C5D50004FF0005866465696D0004FF0003
+      D76461000AFF0005F15E5557AC0004FF0005754A4B4F530004FF0007CF47423F
+      3C3B3A000439019C04FF01F701CC02CB0005C9B19EA3B30002BA04FF0006C92F
+      31353B9F04FF00035D27240004FF0005C52D2F2E480004FF0004AE17102F03FF
+      019603AF0003884A23000210021103120313000000119C98948E89837E78726C
+      66605A544E494300023E000A4450595B5F666B6C686402610163016603670005
+      6B7787939900029A000898948E88827D7E80048200048382807E027C00057F83
+      858482000281038000038284850003870006898B8A8786870288038900088A8D
+      92999A93898302800282018301850288001C84818082858A8E919291908E8D8E
+      919395928C87888C8E8D8B8A898A028C00038A88870002860185018402830184
+      0186038800068786837E766E026B026C016B026A00046C6E70B804FF0003F7CF
+      CE0002CD01D105FF0003CEAFC60004FF000590646362660004FF0003D15D5E00
+      0AFF019B014E024C01A004FF017E01490247014C04FF01C9024000033F3D3C00
+      033B00033A3B9D000AFF0003F7DCBC0002BA01FD03FF01D2022D00032C2D9D00
+      04FF00035221220004FF0005C61C1D1F460004FF019E0208014603FF0007A0AC
+      AFAC844A23000210011103120413000000219D9A95908A857F7A746E68625C56
+      504B45403E414B565A5C636A6D6A666261636700036900066A728291989A029B
+      000498948F8902830003848382000281000482838180027F0181018405850184
+      0183028200038384860002880003898B8A00028902880189018A038C00078E93
+      989A968C84000280038100058387898783000282001285888C909291908D8C8E
+      919596928C898B8D028E048F00048E8C89870486018401830281018401870288
+      0006878684807870046B00076968696B6D6FB70004FF0003F5C3C80002C701C6
+      05FF0003BB93A20004FF0005B86564628D0004FF0003B65E5F0009FF0006F45F
+      504F4E7F04FF01AB01490247017B04FF01AA01420241013F023E023D023C019D
+      0CFF0004ECAEA1E603FF0006F93C2E2D2CD103FF0004FC31222304FF0005F42B
+      1E1F7A0004FF01780207016203FF0008A292A49372411F100211021205130000
+      001A9F9B97928C87817C76706A645E58524D48423F404853595A5F67026D0006
+      68636163676A036B0005707D8D979A00029C00089B98948F8987868404820283
+      00038283840002830185028602870008868584828182848702880289048A018B
+      018D038E00088F92979A99918883038200138182858987858486888B8E919290
+      8D8A8B8F930002960008918B898C8F909192029100048F8D8B88028602870003
+      86848100027E000B82868889888785827B736D00026C00086B6968696B6D6FB7
+      04FF0006F2A6AAABAAA905FF0004A47B74F003FF0005FA9B6680E80004FF0003
+      83605F0004FF01E201E604FF0006C854504F53EE03FF0005F9884B69E40004FF
+      00076D45444341403F00023E00033D3C9D000DFF0003BE73A60004FF0004C447
+      359604FF01C10222012305FF0004CD5E75F504FF01360207018403FF0008A466
+      726752311A10021102120313021400000022A19D99938E89837E78726C66605A
+      554F4A45403F454F57595C646C6F6B656263666A026C00126B6E7888949A9C9D
+      9C9B97938D888583828302820006838485868786028401850186028702860185
+      01830281018301860288000387888900028B018A018B028D00158C8D8E91969A
+      9C968C868382838182848889888A8C00028D018F02910190018E028C000A9093
+      9594908B898C8F9102920006908F8D8B89880389000488868480027D00038085
+      8800028900068786837E766F026D00086C6A68696A6D6EB604FF0006EE888B8C
+      8A9305FF00048C6D6BA00BFF0004CB62605E04FF0003DA82E70004FF0005C652
+      4E4D8D000BFF000DC24746454341403F3E3D3C3B9C0004FF0005EE8082A2EF00
+      04FF0004EB4C48DE0AFF01FC014D03230CFF01C4010A020701A503FF0008AE36
+      3C372D1F141002110112031303140000002AA29E9A95908B85807A746E69635D
+      57514C47423F424A54585A616A706E686463666A6D6C6B6D73819099039D0006
+      9C9A968F89840383028201850487018601850284018504870286000F85838284
+      86878687898B8C8B8C8D8C00028B00088D91969A9D9A91880384000483828487
+      0288018B028E00038D8E90000391000C8F8D8F9192918D89888B8E900291018E
+      018C028B038C00068B8988868480027D000B8085888A8988878580787100026E
+      00086D6C696A6B6D6EB704FF01EC017502770175019D05FF00056F696A6BAD00
+      09FF0005D86A605E5C0004FF0004D66975EA04FF01C50151024D019C09FF01D1
+      01500246000A4443403F3E3D3C3B399C04FF01E602410140017305FF00044733
+      45E008FF0003F86F2600032304FF01B301FB05FF0003F5400B00020701BC03FF
+      0009BC171A1917141110110002120313031400000013A4A09C97918C87827C76
+      716B655F59544E49440002400016454F56595E676F706B666364696D6C6B6C70
+      7B8B979D029E00069D9B98938C87028400048281828506860285018603870186
+      018502870009858384868887898B8C00028D018C028D000B8C8D8F92979B9D9C
+      948B8400028200098180828487898B8D8C00028A018D018F0390028F00098E8C
+      8B8988898C8F90000291018F018E038F000D8E8D8B88868482807E7F82868900
+      028A0006888786827B73027000036F6D6B00026A00036B6DB70004FF01EB016D
+      026E017201DF04FF0003E1696B00036D00038ED5FD0004FF0007E3A565605E5D
+      5B0004FF0005D5626073EF0004FF0007C5514E4C75CCFC0004FF0004DD934946
+      0245000A444341403F3D3C3A399C04FF0005E5383736560005FF014C02300003
+      3A98E70004FF0005F5B54B2A2700032404FF00036F60DD0003FF0004D74D150B
+      020701DA03FF0003D60C0D00020E010F01100211021202130314011500000023
+      A5A29D98938E89847E79736D68625C56514C46423F424A53575B636B706E6965
+      63676B00036C00056E7584939C00039E00069D9B979089840281018201830286
+      028502840285028600088788898886878987028500068688898B8D8E04900291
+      000C929395979A9C9D978D868382038101830187038A00048988898B048D028E
+      018C038A00138B8C8F9192949594939291908F8C898785838100028000048284
+      8789028A0288000487847D750370016E016B026A00036B6DB70004FF01F302A1
+      01B801E905FF0003B16D6E00026F00086D6C6B708589867202650005625F5D5C
+      5B0004FF0015D563625E5A58555351504F4E4D4B4A536E747057470003460245
+      000A444341403F3E3D3B3A9C04FF0005E539373BB50005FF013B03310232000A
+      4D616052322E2D2B27250224000426282520021D00081F4855442521160C0208
+      01F703FF01F7010C020D00030E0F10000211011203130214021500000014A6A3
+      9F9A95908B86807B756F6A645E59534E49440240000E454F565A5E666E6F6B66
+      6364686B026C00066D717E8E9A9E029F00069E9C99928A82027F000382848500
+      02860185028401850287000588898A8B89000287028802870006888B8D8F9192
+      02940193029401950396000E97989B9D9A918985838281828488028C018D018B
+      0389028A001A8B8C8D8E8D8B8C8D8E909395979899979592908E8D8B89888684
+      0283000884858688898B8A890288000486807873027100076F6C6B6A6C6EB800
+      0DFF01EF017A026F026E00056D6B6A696700036600046766615D035C04FF000E
+      D563625F5A57555352504F4E4D4C034B014A0149024803470007464544434241
+      4000023F00033D3C9D0004FF0004FCE5E4F905FF01CF0133073201310230000B
+      2F2D2B282524252728262100021D00081F2022252622160C020805FF010C020D
+      00040E0F101102120113041402150000002CA8A5A09C97928D88827D77726C67
+      615B56514B46423F424B54585B616A6E6D68646366696B6C6D707887969D039F
+      00059D9992888000027C00047F82848603870286018702880389018802860003
+      87888900028A00038D8F91000293029403920194019603970008989A9E9C948C
+      888703860003888C8F000290018D028B018C018E038F018E028F000790919395
+      97989900029A000C989592908E8D8C8A898A898802870005888786888900028B
+      01890288000D87837D777372706E6D6E7072BA000CFF0004F892706E036D016C
+      026A0169016802670006686967635F5D025E04FF01D5026300075F5956555352
+      5000024F024E014D024C014B014A04490004484745440243024202410003403F
+      9F000DFF016E02330132023101320233001A3231302F2E2C2926242527292722
+      1E1D1F2022252622170C080705FF010C010D020E00030F101100021201130314
+      031500000025A9A6A29E99948F8A847F7A746F69635E58534E49444041475157
+      595D656D6E6A666365686B00026D00066F7480909B9F02A000059E9A91877E00
+      027A00057B7E8185870002880389028800058786848382000283000886888A8B
+      8D90929302910190018F028E0003919597000398019B029F00059A93908C8900
+      02880003898C8F0002910005908F9192930002940393000395989900029A039B
+      000B9A9894918F8E8F8E8C898A00038C00048B8A898802860188028B018A0388
+      000686827D77747202710004727577BC0BFF01E2018A026F016E036D016C026A
+      026903680007696865615F60610004FF01D502640007615B595755525000024F
+      00034E4F4E00034D014C014B034A00054948474645000344024300034241A000
+      0BFF0003F6863500023301320231013202330232000631302F2D2A2602250010
+      272928231E1D1F2022252623180C080705FF00050C0D0E0F1000021101120213
+      02140315011600000021AAA7A39F9A96918C86817C76716B66605B56504B4642
+      40454E55585A616A6F6C670002640021676A6C6D6E717A89979EA0A1A09C9286
+      7C78797A7C7E81838588898A88868584810002800181028200068587898A8D8F
+      02910003908F9000028F0004909396980299000A9A9CA0A19F9A958E88870288
+      00038A8D8F00028E000690949697999A029900039A9B9C00069B000499979390
+      028E0290018F028D028F00058E8C8B89870002840004878B8C8A028800068988
+      85807A750271000672747779A4CE05CD02CC0004C7B29070036F036E016D016B
+      0269016A02690368000367666400036302C602C5000CAB6465635F5B58555351
+      4F4E034F014E024F014E014D034C00044B4A49480347000646454442417D02B9
+      03B804B70006A981473635340233023201330234001A333231302F2D2B272526
+      282A28231E1D1F2123252723180D080702A503A600060C0D0E0F101102120213
+      0214021502160000002EACA9A5A19C97938E88837E79736E68635D58534D4844
+      41434B5357585D676E6F6A656465696B6C6D6E7481929CA002A100069E968A7F
+      797A027C000E7B7D7F818486888784807F7E8082028300088486888A8C8F9193
+      0394029500049495969703980003999B9E0002A000109C948C85838485878A8C
+      8D8F9295989A059C00059B9A989798000499000397959100028F000492949392
+      0291001A908E8B8A87848284878B8C8B88898A8987827C767170717376780279
+      00067674737473720271017202710170046F016E016B04690368026700056867
+      666564000263000E626160626465635F5B585653514F024E034F00055051504F
+      4E00024D014C014B024A00074948474645434200024000043F3E3C3B023A0239
+      01380237033602350334023502340007333231302E2B280002260014282A2924
+      1F1E1F2123252723190D080708090A0B020C00050D0E0F101100021201130314
+      0115031600000016ADAAA6A29E99948F8A85807B76706B65605A55504B460243
+      000A495156575A636C706D6702640168016B026C000C6D717B8B99A0A2A1A09A
+      8E810279047C027E001380818486827C7B7D828688898B8D8E90929495000296
+      02970198029701960395001694929496999DA09C938B868486888A8C8D8E9091
+      9497039A00059B9C9B9996000294019604970003989795000294019501960295
+      000E9493908C898784838486898C8D8C028A00108B8A88847E77717071727374
+      7677757402720171087000056F706F6D6A000268026901680467000668676664
+      626102620260000B616465645F5A575554525000024E034F015001510250014E
+      014D024C014B024A01490247000445434140033F013E013C043A000339383700
+      0336013702360635001E34333231302E2C282627282A2925201E1F2023252723
+      190D080708090A0B020C00050D0E0F101100021201130214011504160000003A
+      AFACA8A49F9B96918C87827D78726D68625D58534D484443474F5557585E686F
+      6E696563666A6C6B6C6E7584959EA1A2A19D92857C797A7B7C7D037E00048083
+      8683027F000683898D8F9192029301940496039503960013949392918F8D9194
+      989CA19F98928D898A8D8F00038D00058F909395960002950197029901970195
+      02930394000395969900029A029902980006979694918D880285000684858788
+      8A8C028D000F8C8B8C8B8985807873727372706F71000374017202710270036F
+      026E026F0009706F6E6C6A696A69680004670004686764620260016201630262
+      000C63656665615C58575554514F044E034F00044E4D4C4B024A024900074847
+      464543414000033F013E013C043A013901380237013602370236013501340335
+      00093635343332312F2C290002270015292B2A26201E1F2123252723190D0807
+      08090A0B0C00020D00050E0F101112000213011402150216021700000026B0AD
+      AAA5A19D98938E89847F7A75706A655F5A55504A4643454D5356575A636B6F6C
+      66636468026A000D6B6D727E8F9BA1A2A19F978B8100027D00047E8081820484
+      000786848283878D900002920004939493940395019401930392000494969594
+      02930006929194989B9F02A300039E999300028E000391928F00028D00038E8F
+      910002930003919294000296019501930291000692939496979A049C00079B99
+      9795928D87000284018701880389018A018C038E028D00108C8A868078747374
+      726F6D6E71737473027201710170026F036E0170036F026E016C026B01690268
+      0467000666636162636402650164026502660009635E5A575554524F4E00024D
+      014C034D00044E4D4C4B034A000749484645444341000240033E013C053B013A
+      01390338033701360235033602350006343231302D2A02270129022B01270121
+      021F001121222527241A0E080708090A0B0C0D0E0F0002100111011202130114
+      02150216021700000017B1AFABA7A39F9A95918C87827D77726D67625D58524D
+      4800024500034A5256000258015E0167026E000D6964636568696A6B6F778796
+      9F0003A100059C938B87840003830184028701850484000385888C00038F0290
+      01910193089401960398019703980015999A9DA1A4A5A19C98939192938F8C8D
+      8E8F9192910002920193039401930292000693949597999B039D000B9C9B9996
+      928E898584878A00028C018B028A018C018E028F028E00058D8B867F78000374
+      01720170026F00057072737473000272027102720171047000036F6D6E00026D
+      016C01690368036700056663626365000466016503660009645F5A5756545351
+      4F00044D014E024F00034E4D4C00024A0005494847464500024400044342413F
+      033E053D013C013B023A0139033805370236000E35343332302E2A2827292B2C
+      2721021F001121232527251B0E080708090A0B0C0D0E0F000210000311121300
+      02140215021602170000001CB3B0ADA9A4A09C97938E89847F7A746F6A645F5A
+      544F4A4645495056025800095B636C6E6B6562636600026900076A6D737F909C
+      A10002A200149F9A938D87848281828584828182838485878A8B038C00038F92
+      9400039500059697989798000899000A98999BA0A3A5A39D989302910005928F
+      8D8C8D00048F0193019502960195019602950006949596989A9C039D000F9C9B
+      999694908C8987888A8D8F8E8C00028B00058C8E8F908F00028E00068B87807A
+      767503740004737273740275000574737271730002750173047100036F6C6B00
+      036C016A0369026801670165026303640265036602670004645E595702560004
+      55545351065000074F4E4D4B4A49480002470003454445000244014301410340
+      01410240013F023E013D023C013B013A0339023803370136023500053433312F
+      2C000228012A022C01280122021F001121232628251B0F080708090A0B0C0D0E
+      0F00021000041112131402150216021701180000001CB4B2AEAAA6A29E999590
+      8B86817C77726C67625D57524D4845474E540258000A595F686D6C6763626568
+      026900066B6F788898A002A20014A19D968D8682807E7F8281807F8183858687
+      8889028800038A8E910004930194019603970598029703960010999EA3A5A39C
+      958F8D8E8F8D8B898A8D028E00058F949899980003970198019A029B049D019B
+      019A029900059693918F8D00028B018C018E029000038F8D8C00028B018D018F
+      0290028F00078D89847E79767500067602750174017302720005747776747200
+      03710004706C6A6B026C026B016A036901670166026403630164016502660167
+      0268000B66615D5B5A5958575654520004510003504F4E00024C014A01490248
+      0147064601450144034302420141013F023E023D013C023B013A013903380337
+      00073635343332302C00022900052A2C2D292300021F001121232628251C0F08
+      0708090A0B0C0D0E0F00021000041112131402150116021702180000001DB6B3
+      B0ACA8A49F9B97928D88837E79746F6A65605A55504A47464A51560002580009
+      5B636B6E6A6562646700036900056C7381939D0003A200079F978D8784838200
+      0283018202810003838587000288028702860009888B8D8E8F8E8D8F91000293
+      01940395019603970396000A989DA1A4A39C918A898A028D018B0289018C028D
+      00038E959900029C029B019C019D049F00049E9D9B980396000394929000038F
+      000490919091029000038E8D8C00028B018E039000068F8E8B857F7903750006
+      767576777675027400097372737577767473720002730004716D6A6B026C026D
+      00066C6B6A69686702660165016302620164016502660368000964605D5B5A59
+      5756530003510250024F00054E4D4C4A49000248054702480147014602450007
+      44434241403F3E00023D00043C3B3A390638013702360008353433302D2A292A
+      022D00172A23201F21232628261C10080708090A0B0C0D0E0F10110002120003
+      131415000216011703180000001DB7B5B1ADA9A5A19D9994908B86817C76716C
+      67625D57524D4846474D540002580009595F686E6D6863646600036800066A6F
+      7A8C9AA002A20009A09B948E8B8785848300028100058385888A8B00028A0189
+      0688038A00058C909193940003960198019904980297000C999DA1A29E938C89
+      8A8C8D8C028900068B8D8E92989C039F019E049F019E019D029B000399969400
+      02950004949392930494019201910390018E018B028900038C90910002900005
+      8F8B857D77000374000373727300027402730272000773747778777574000373
+      0172016F066D016C016B036A0005696867666300026100056263646567000268
+      000965605C5A58575554520004510150024F00074E4D4C4A4948490002480549
+      00114847464544434241403F3E3D3C3B3A393800023701380239023800073736
+      353433312E00022A00052B2D2E2A24000220000821242628261E110902080009
+      090A0B0C0D0E0F1011000212000413141516021703180000001EB9B6B3AFABA7
+      A39F9B96928D88837E79746F6A655F5A554F4B47464A5156025800095C656D6F
+      6A656365670002680006696E7585959E03A2000D9F99928C868381807F808386
+      8800038A0189048B038A018D028E000390939400029501960297029801970196
+      02970005959291959B0002A00005988F8B8A8C00028E028D00068F9193969B9E
+      049F019D019B0299029B0299000497959394029501960498000497959391038F
+      018D018A0286018A018F03910005908D877E7600027301720271017201730272
+      02710009727375777877757473000472000371706F00036E00036C6A6900026A
+      000569686766640004620263016602680007645E5A5856555400025304520151
+      0150024F00044E4D4B4A0449044A00074948474644434200024100043F3E3C3B
+      023A000339383700023601370138023901380237000C363534322F2B2A2B2D2E
+      2B250220000822242628271F120A02080009090A0B0C0D0E0F10110002120004
+      131415160217031800000026BAB8B4B1ADA9A5A19C98948F8A85817C77716C67
+      625C57524D4846484E55575859606B6F6D670264016601680269000F6C717D8E
+      9BA1A3A2A19C938A827E7D00027B00057C80848687000386018A018D0290028F
+      01900391019201930294029502960003959492000291000E92908D8B8F969FA3
+      9F9893908F9002910006909193949799039A029C000F9A949193989A99989593
+      929394969800039A0005999896929000028D00078C8A8785868A8F000391000D
+      908E898279747372717273727000036F00097173767879787574720002700172
+      0174027301710270016E016B0269026A01680266026501640563000B65676965
+      5E595857555453000354000353525100035000054F4E4C4B4A00074901480246
+      000345434100034000033E3D3B00043A01390137023500133638393A39383736
+      353433302C2A2B2D2F2C26000221000822242729281F120A0208000D090A0B0C
+      0D0E0F1011121314150002160117021802190000001ABBB9B6B3AFABA7A39E9A
+      96928D88837E79746F6A655F5A55504B0247000E4C525657585D676E6F6A6564
+      6567026800156B6F7786969FA2A3A29E978D85807E7B7A7B7D7F810004830188
+      018D028F018E038F018D018C028D018E018F0392000491908F8D028C018F018E
+      028C00039198A10002A500039F999300028F029000038F919400059301950297
+      000995908D91989A9997940004910003939597000299001E9896938F8C8A8887
+      868584868A8E919291908F8C867F79767372747574720371000C727476787978
+      7673716F70720373000A7271706F6C6B6A6B6967026502660365000F64636264
+      676966605B5958575655560002550004535251500251025000034E4D4B000249
+      02480147024800074746454442403F00024000033E3C3A000239023A01390137
+      023501370139023A023900073837363533302D00022B000E2D2F2D2722212325
+      27292820120A0208000D090A0B0C0D0E0F101112131415000216011702180219
+      0000001FBDBAB7B4B1ADA9A5A09C98948F8A85817C77726C67625D58534D4947
+      49505500025700095A626C706D676463660002670007696C727F909CA10002A3
+      0007A19D978F87817C00027B00047D7E80820284001085888B8A8887898B8987
+      858687888B8E0290018E018C038A018B038D000B90959CA3A7A6A199918B8A00
+      038B00048F92918F02900191029201910190028E000693999B989591048F0290
+      000992969794918F8C89860003840007858486898D90920002910009908E8A85
+      7F7A76747500027701760174037300087475777978767471026F000371727100
+      0272000571706F6E6D00026C016A016705660265000C62616264686A68645F5D
+      5A590357000456555352045102520005504E4C4A490003480007494847464543
+      4100044000033E3C3B00023A02390138013702360138013A023B00043A393837
+      0236000334312D00022B000E2D2F2D2823222325282A2820130A02080008090A
+      0B0C0D0E0F110212000413141516021701180219011A0000001BBEBCB9B6B2AE
+      ABA7A29E9A96918D88837E79746F6A65605B56504B000248014C015302570009
+      585E68706F6A6563650002670007686A6F798998A00003A30008A19D978E8680
+      7E7F03800016828485868889878584878A898785868788898C8E8D8B0289000A
+      8A8C8F919293969BA0A502A70009A0958C86858688898E0002930190058F000C
+      8E8F9195999C9B969491908F048E000D919495928F8E8B878482838586000285
+      0004878A8F920291000F908F8C89837E797778797A7978777500037401750277
+      0005767471707100027202710370016F036E016C016A04670009686766646261
+      63656900026A00066764605C5A58025701560154025203510352000A514E4C4B
+      4A4948494A48024700044543414002410003403E3D00023B013A023902380237
+      0138013A023B023A00073938373635322E00022C000E2E302E2823222426282A
+      2821130A0208000B090A0B0C0D0E10111213140002150116021701180219011A
+      0000002ABFBDBAB7B4B0ADA9A5A19D98948F8B86817C77726D68635E59534E4A
+      47494F5456575A636E716D67646503670007696D7482939EA20002A30010A29F
+      9A9288817E808281808183858688028902870188028B000488878889028A018C
+      028E000D8C8D8E909497999A9B9DA0A2A60002A8000DA1968C86858687898D92
+      95939100028F000E908F8E8F93999C9D9C9795939290038F000F909294959391
+      8F8B878381828587860002840187018D029202910007908E8B86807B7A00027B
+      027A02780176037401750276017502730006727374737170036F036E00046D6B
+      6A680569016801670265000366686A00026B00066A66615C5A58025601550254
+      01530152025103520005504E4C4B4A000249000E4A4947464746444241424140
+      3F3E023D013C023B013A0239000338393A00043B00073A39383736332E00022C
+      000F2E302F2924232426282A2921140A08000209000A0A0C0D0E0F1011121314
+      02150116021701180119021A0000002BC1BFBCB9B6B2AFABA7A39F9B96928D88
+      837F7A75706B65605B56514C48474B505456585F6A716F6A6665670003680006
+      6B707A8B9AA002A30013A29F9A9187807C7E81828182838485878A8C8B00028A
+      028B028A038C00038D8F9000028F0012909295989B9D9E9FA0A2A3A6A8A9A49A
+      8E870285000987898D939795918E8D00028E00048F91969B029E019B01970396
+      01940292000393949600029700099593908C888481828500028602840004868C
+      9192039100058F8C87817D00037C027A02780276027703750474000675767471
+      706F0270026E00036D6C6A000269016A026B026C00046B6A69680269016A026B
+      00066A67625D595804570256015402530152025100064F4D4B4A494802490003
+      48464500024700044644434203410140023F013E023D013C023B033A013B023C
+      00033B3A39000238000336332F00022C001D2E31302A25232527292A2922140B
+      08090A0B0C0D0E0F1011121314151600021701180219021A0000001DC2C0BDBB
+      B8B4B1ADA9A5A19D9994908B86817C77726E68635E59544F4A000247000A4B50
+      55575C676F716C6802660167026800076A6D7482949EA20002A3000B9F998D82
+      7D7B7C7F8082840003850005878B8D8E8D00028B028C018E038F019001920293
+      029400079597999B9D9E9F0002A0000EA1A3A6A7A69E91898687888A8C910295
+      0009918C8B8D8E9093979B00029D019B01980299000F9896959698999A999896
+      948F8B88850002830484000685888D92939202910005908D88837F00037C0006
+      7B7A7877767702790377047602770174017102700271036E016C026B016C036D
+      026C016A066900096A6B6A68645F5A5857000558000756555452514F4D00024C
+      014B0449014802470348000347454300044202410140023F00043E3D3C3B023A
+      013B033C00073B3A393837343000022C001F2E31302B25242527292A2922150B
+      08090A0B0C0D0E0F101112131415161718000219021A011B00000029C3C2BFBC
+      B9B5B2AEABA7A39F9B97928D89847F7A75706B66615C57524C4846474C52575B
+      626C706E6A000366000F6768696B6F7A8C9BA2A4A3A0988B8000027B027C0003
+      7D80850003860003888C8F000290028F00079092939493949500069602970003
+      999A9B00029C029B00079DA0A4A5A1948A000286000E888A8C909496928C8A8B
+      8E929598029B029C029B019A01980297000C989B9C9B99979694908B88870285
+      0184028200058486898E9200029302920007908E8A85807C7A00027B00057A78
+      77787A00027B027900037A787700047601740372017301720470046F00046E6C
+      6B690366016702680169016A026B00056965615D5B00025A0359000858575553
+      51504F4E024D014C014B044A0349024A00044947464502440243014201410240
+      00083F3E3C3B3A393A3B023C013B023A000439373531022D012F0231000B2C26
+      242527292A2923160C00020900100A0B0C0D0E0F10111213141516171819021A
+      021B0000002AC5C3C0BDBBB7B4B1ADA9A5A19D9995908B87827D78736E69645F
+      5A554F4A4645484F56595E686E6F6B6702650267000768696C748496A00002A3
+      0005A19B8F837D00027C027B00088085888A8B8D909205940295000394939200
+      039300079291929193949500029602970296001B979BA0A5A39A8F8987898B8C
+      8F9294928E8C8E93989B9A9998999C00029D00059A9695969800029B00099A97
+      959495928E8A8900028801870385000586888C9194000293000B92918F8A847F
+      7A78797A780002770178017B047C00047B7A7774057300067475767574730272
+      027000066F6E6C6A68660264016503670168016A026C00076A66625E5C5B5900
+      02580257000355535100054F024E014D034C014D044C00054B49484645000244
+      024301420240023F00033D3C3A000239013A013C023D013C023B00043A383631
+      022E012F023200052E2724252700022900042823170D0209000B0A0B0C0D0E0F
+      1011121415000216000317181900021A021B0000002AC6C5C2BFBCB9B6B3AFAB
+      A8A4A09B97938E8985807B76716C67625D58524D4945464B53585B626B6E6C67
+      0264016602670019686A707D8F9CA2A3A29E968C8682817E7D8085898C8E8F90
+      92000393019202910190018D028B028C018B028A00068B8D9092939502960397
+      0008999CA1A6A7A0958D028A000E8D8E90939493919092989C9D9B9A0298019B
+      029E019B0297029900059A99989795000294000393908D00048B018A01880387
+      00038B9093000294000793928F8A837D79000278017903780179017A047C0004
+      7B7975730272000B737476777877767573717000036E00056D6C6A6865000264
+      01660267001368696B6D6C6A65615D5C5A5856555655545251000450024F014E
+      034D024E024D024C00054A4846444300044201410140023F00083E3D3C3B3A3B
+      3C3D023E00113D3C3B3A3937322F2E3032332F2825262700022900042824180D
+      0209000D0A0B0C0D0E0F101112141516170002180119021A011B011C00000027
+      C7C6C3C1BEBBB8B5B1ADAAA6A29E9995918C87827E79746F6A65605B55504B47
+      45495056595E6700026D000568656465660002670014696D768797A0A2A3A19C
+      968E8783807F8084888B048D038E038D00058C8987888A00048B00068E909395
+      96970499000D9A9B9DA2A7A9A59E979290919300029401950194029301950199
+      029B029A000799989A9E9F9E9B00039C000A9B9A9896959493918F8E028C000A
+      8D8E8D8A8786878A8E930295000B9493908A837D7A7877787900057A037B0012
+      7977747271727374777877767472706F6E6D036E00036D6B6900026601670168
+      0469016B026C000769635E5B5A5957000356015501540253025202510150024F
+      054E014D014C024B00054A4744434200044300074241403F3E3D3C00023B013C
+      023E013F013E023D000C3C3B3A3733302F303334302A022601280129022A0003
+      26190D000209000E0A0B0C0D0E0F10111314151617180219021A011B011C0000
+      002EC9C7C5C2BFBCBAB6B3AFACA8A4A09C98938F8A85817C77726D68635D5853
+      4E4946474D54585B626A6D6A666465660267000F686B717F919DA2A3A29F9A90
+      87827F00027E000480858889028A018B028C028D018E028F028E018F01910492
+      019301940295019602970498000A9A9DA2A7A9A8A5A09A950294019602970008
+      9695949596979899029B00039A9B9D00029F019E039F00049D9B989602950003
+      928F8C00028D028C028D01890286000487898D920395000F94918D87827E7B78
+      797B7C7D7C7A790003780005777674727100027200087375767573727170056E
+      026F016E016C036A01690268000367686A00026C000469635E5B025A01590258
+      0157015603540153025202510250014E034D024C034B00034947450003440145
+      01440243000642413F3E3D3C023B013D013E033F013E023D000B3C3B3834312F
+      313334312B0002270129012A022C0003271A0E000209000F0A0B0C0D0E0F1012
+      1314151617181900021A011B021C0000002BCAC9C6C4C1BEBBB8B5B2AEABA7A2
+      9E9A96928D88837F7A75706B66605B56514C48464A5156595F676D6C69000266
+      01670168026900066B6E788999A102A2000FA09B91888281807E7F8386898B8D
+      8E00038F01910192049301940495029401920190028F0190039200139395979A
+      9FA5A9AAA9A6A09A9695969798979600029502960004989A9C9D029C029D019E
+      019F02A000049F9D9A9703950192018E028C00038D8C8B00028C01890286000E
+      87888B9195969594928F8B85807D027A017C027D00047C7A7877027600047778
+      7572027000066F707375747302720171026F027003710007706E6D6B6A676500
+      0264000966696C6D6A66615D5B00025A02580003575655000254025300035453
+      52000251014F014D044C014B024A000349474600024502460145034300054240
+      3F3E3D00023C013D013E0240023F000D3E3D3C3B3935312F313335312B000227
+      0129012B022D0003281B0E00020900110A0B0C0D0E0F1112131415161718191A
+      1B00021C011D00000021CBCAC8C5C3C0BDBAB7B4B0ADA9A5A19D9994908B8682
+      7D78736E69635E59544F4A00024700094D54585C646B6E6B6800026700126869
+      6A6B6D7482939EA1A2A19D978F8A8683028100058486888C8E000290038F0003
+      9091920002910292029302920003918E8A00028800118A8D8E8F929596989BA1
+      A6AAABA9A39D970002950197019903980297000496979A9B049D029C019E02A0
+      00039F9B9800029502960003938F8D00028E018D028A018B018903870004888B
+      9094029600079593908B837F7D00047B00057A79787775000273000476787672
+      027000036F70730002750474037303720007716F6D6C6B696600026300096465
+      686B6D6C67625D00025B015A0258015701560355015402550006545251504E4C
+      024B034C00044B4A494802470346014503430242000741403F3E3D3E3F000340
+      023F000C3E3D3C3A363230313435322C022800072A2B2D2E291C0E0002090011
+      0A0B0C0D0E101112131415161718191A1B00021C011D0000002CCDCBC9C7C4C1
+      BFBCB9B6B2AFABA7A39F9B97928E8984807B76716C67615C57524D48474B5257
+      5960686E6D6A03670009696A6C6D717B8B99A00002A100069F9C97918C860284
+      000C8687888A8B8C8B8A8988898B028D00038C8D8E00028F00058E8F908E8A00
+      028800068A8C8E9092950296000C989DA4A9ABAAA59F98959496029802990198
+      019902980005999A9B9C9D00039C000D9E9FA09D9A989798999793908F000290
+      00048E8C8B8A058900038B8F93000396000594918B827D00027C00047B7A7977
+      03760274017502780176017303720174017602780477000876757372706F6E6C
+      026B00036A6967000365000866686B6D6C67615D025C00035B59580002570656
+      000554514F4E4D00044C014D014C024B014A0349024802470145024402430005
+      4241403E3D00023E013F034000113F3E3D3C3B373331323436332D29282A2B00
+      022E00032A1C0F000209000F0A0B0C0D0F1011121314161718191A00021B011C
+      021D0000002DCECDCBC8C6C3C1BEBAB7B4B1ADAAA6A29E9A95918C87827E7974
+      6F6A655F5A55504B47494E55585D656C6E6B680002660013686A6B6C6F768393
+      9DA0A1A09E9B97908A8685000386018702860285028401860189058B028D018C
+      018E029000098D8B8C8D8F9193959800029900099A9EA3A8ABA9A6A099000295
+      0198029B00039A999A00029B00049998999A029B029A019B019D029F00039E9C
+      9B00039A0197019304910003908E8C00028A058C000A8E9295979695938D857F
+      027D00047C7A7977037500037374760002790178037701780579000978777675
+      74726F6E6D00026C036B016A016904680169016B026D00096963605D5C5B5A59
+      58000257045600045553524F044E00034F4E4F00024E014D024C024B02490005
+      4847464544000243000442413E3D023B00033C3D3F000240023F000B3E3D3B38
+      3432333536342E00022900192A2C2E2F2B1E100A090A0B0C0D0F101112131516
+      1718191A1B00021C021D0000002DCFCECCCAC7C5C2BFBCBAB6B3B0ACA8A4A09C
+      98948F8A85807C77726D68635D58534E49484C53575B616A6F6D69000266000A
+      67686A6C6E727C8B999F02A000069F9D98918984028302840283038200078386
+      888A8B8C8D00028C018E028F019102930004929192940295000396989A00039B
+      00139DA1A5A9AAA8A39C9697999D9C9A999A9B9C990002970198049900039A9B
+      9D00039E029D00049C9A969302920391000C908E8C8D8F908F8D8B8C91950297
+      000C9694908983807E7D7B7A787502740273000476797A7B037C00037B7A7800
+      047600077574737271706E00036D016C026D036C026B00036A6B6C00026E0007
+      6B66625E5C5B590002580557015601550254015305520251000C504F4E4D4C4B
+      4A494847464402430006424342403E3C023B00043C3D4041024000273F3E3D3C
+      383532333537352F2A292B2D2F302C20110A090A0B0C0D0F1011121415161718
+      191A1B00021C021D0000002AD1CFCDCBC9C7C4C1BEBCB8B5B2AEABA7A39F9B96
+      928D88837F7A75706B66615C56514C494A50565A5E66026D016A016702650013
+      67696B6D707683939C9FA09F9C968D85807F80000282000A83848587898A8C8E
+      8F900291029001910393029501940293000694959493959703980004999CA0A6
+      02AA01A6019F029800049A9D9C9A0299029A0198029501970299029A0299019B
+      019D029E039D00059B97959493000392000C91908F909291908C898B90950298
+      001D9796928D87827F7E7C7B79767472717274777A7C7D7E7C78757372717300
+      02740173027202710170026F0170026F016E026D016C016B026A016B016D026E
+      00086B66605D5B5A585702580157015602570156025503560155035400045251
+      4F4E024C014A0249000547464544430003420243000342403F00023E013F0140
+      0341024000273F3E3D3A363334363736302B2A2B2D2F312D21120B090A0B0C0E
+      0F1011131415161718191A1B1C00021D011E00000049D2D1CFCDCAC8C6C3C0BD
+      BAB7B4B1ADA9A5A19D9995908B86827D78736E69645F59544F4B4A4E55595C62
+      6A6E6C6865646567696B6E727D8D999EA09F9C968D86817F808285888B8D8F00
+      0291039203910004908E8F90029103920190018E028F00048E8D8F920295000A
+      9697999EA5AAACA9A39B0299019A019902980499029801970298019B019C029A
+      019B019D039E00049F9E9C990296019702960195029402930008918F8E8B8A8C
+      91950398000C97948E87817E7D7C7B7A77740273000A74757778797C7D7B7773
+      027101720173027401730271017205710006706F6E6C6B6A0369016B016C026E
+      00086B65605C5A5958570258000457555657045601570156025500065453514F
+      4D4B024903480005474645444300034201430244014301420341034202410006
+      403F3E3D3B3702340020363836312B2A2C2E30322E22130B090A0B0D0E0F1011
+      131415161718191A1B1C021D011E0000002BD3D2D0CECCCAC7C5C2BFBCB9B6B3
+      AFACA8A4A09C98938E8985807B76716C67625C57524D4A4D545A5C5F6700026D
+      016A01670264000966686A6D707787959D00029F00059E9A928B840002800005
+      8285898D8F000490018F018E038D018A0288028900198A8C8D8E8C8B8C8F8E8F
+      91939798999A9B9FA5AAACAAA59E9A00029902980499019A029B00039A999B00
+      029E00059C9B9C9E9F0002A00004A19F9D9A0298000A999A9B9A989795928E8B
+      028A00058B8E929598000299000598958F867E00037B00037A79760002750176
+      04770006787B7D7C78750273047401730372027100067271706F6E6D026B026A
+      036B00086C6D6E6D68635E5A0358000359585600025503570256025504540004
+      514D4B4903470007484948474645430002420243000444454443034104420141
+      024000253F3E3B373435363837312C2B2C2E30322F23130B090A0B0D0E0F1011
+      1314151617191A1B1C00021D021E00000046D4D3D1CFCDCBC9C6C4C1BEBBB8B5
+      B2AEAAA7A39F9A96918C88837E79746F6A655F5A554F4B4C52595B5D656C6F6C
+      6865646567696C6E7480909B9E9F9E9C968D85807F80838603880289028A0289
+      00048B8C89860385000986888A8C8D8E919495000296000497999A9B029A0009
+      9CA1A7ABAAA6A09B9800039701980199029A00039B9C9D00029C00069FA2A19E
+      9D9E04A000049F9D9C9A029900099B9D9E9D9A96928F8C00028A00068B8D9092
+      9497039900049690887F037B017A017902770004797A797702760006787A7C7B
+      79760274017502740273047202710170016F036E026D016C036D00096C6D6E6F
+      6E6B665F5A0002580004595A5856025503570256000355545300025400095351
+      4D4A484746474800024A00044948464403430344014301410340024101430242
+      000641403F3E3C380235001F373938322C2B2C2E30323024140B090A0B0D0E0F
+      10111314151617191A1B1C00021D021E00000030D5D4D2D0CECDCAC8C5C3C0BD
+      BAB7B4B1ADA9A5A19D98948F8B86817C77726D68625D58524E4C50575B5D636B
+      706F6A660265000967686A6D717A89979D00029F00049D978D85028000047F80
+      82830282000C83858788898A8D8E8C8987860285000886888A8B8E9295970296
+      0010959697969594959BA2A9AAA8A29B989702960197019A049C00049D9C9DA0
+      02A301A0049F00039E9C9A00059900089A9C9D9B9792908E028D00038E8F9000
+      0291019301960399000597928A817B00027A000779777677797A790002750008
+      7678797B79777574027501740173027104720171027001710270016F026E026D
+      016E036D00076E706F6B645E5900025700055A5B5A5857000656015501530352
+      000551504E4B49000348014A024B00044A4846450544000343424000033F0003
+      40414300024202410004403F3C3902360020373938332D2B2D2E30333025150B
+      090A0B0D0E0F10121314151618191A1B1C1D021E011F0000002CD6D5D3D2D0CE
+      CCC9C7C5C2BFBCB9B6B3AFABA8A4A09B97928E89847F7A75706B65605A55504D
+      50565B5D616A0271016D0168026600096768696B6E7482919B00029F00089E9A
+      928B878582810280000F7F7E80838587888A8D908F8D8B8A8900028801870288
+      0005898C91929000038F0190029102920010979FA8AAA9A49E9896959496999D
+      9E9D029C00039B9C9F0002A201A102A000089F9D9B9998999A99039800069998
+      9693919002910392019102900003929598000299000597948D837C0002790178
+      01770276000A77787775747778797A780576000573716F707100037202700271
+      0003706F6E00026D066C016E026F00046A625C590258015A025C00065A585755
+      54550356000354514F00024E00054F4E4D4C4B00024A034B014A024801470246
+      0345000344434100024001410242014401430242000541403F3D390002360137
+      0239001D342E2C2E2F31333126150C090A0B0D0E0F11121314151618191A1B1C
+      1D00021E011F00000025D7D6D4D2D1CFCDCBC8C6C4C1BEBBB8B5B2AEAAA6A29E
+      9A95918C87827D78736E68635D585300024F000C545A5D60677074706B676667
+      02680012696C707B8A979D9F9E9C98928D898582807F027D0011808485868788
+      8B8E908F8D8C8B898886840002850188018C058D000F8E8F929493969EA7AAA9
+      A59F9A98970002960199029D019C049B00039DA0A10003A000039E9B9A000299
+      00049A9B9A98039700069694939293950296000894918F8E8F919498029A0005
+      98958F857C000378000676757475767702750177027800037978760003770004
+      767472710272000473727170026F00036E6C6B00026C016B036A02680169016B
+      026E00076A635D5B59585A00025C000D5A58565453545556575552504F000350
+      014F024E024C044B024A02490248024700034645440004430344014302420007
+      41403D3A373637000239001E352F2D2E3032343227160C090A0B0D0E0F111213
+      14161718191A1B1C1D1E021F00000031D8D7D5D4D2D0CECCCAC8C5C3C0BDBAB7
+      B4B0ADA9A5A19D98948F8A85807B76716B66605B56514F53595D5F646D74736E
+      6A00056800066B6D7583929B029E00099D9A958F898583828000027E01820285
+      00058687888A8C00028E028D000B8C8A878382848687898A8C00038D00038E8F
+      930002950003969CA40002A90009A6A09B9A999897989B00039C039B019C019E
+      039F000B9E9D9B9A999A9C9D9C999700029600109796949597999896928E8D8E
+      8F919498029A0006999691887E79027800087776747576787776037504770176
+      02770276027403730005726F6E6D6B00026A026B000F6A696A68666566696D6E
+      6C66615E5B000259025B00035A58560002540255035601540453025200045150
+      4F4E024D014C014D024C014B014A034900034847460002450444014502440009
+      434241403E3B38373800023A000B36302E2F3133353228170C00020A000F0B0D
+      0E0F111213141617181A1B1C1D00021E021F00000032D9D8D6D5D3D2D0CDCBC9
+      C7C4C2BFBCB9B6B3AFABA7A39F9B96928D88837E79746E69645E59545052585D
+      5F62697274706D6A0269026800076A6C717C8C989C00029D00049A948C850481
+      028001830185028601870289018A0389028B00068885817F828502870008888A
+      8D8E8F9091920293000A9599A0A7A8A59E989798029902970199039B019C029D
+      039E019D019C059B029C00039D9B990002970399029A000498969390028F0290
+      000491949799029A000598938B807A0002780177017602740177027A000B7876
+      7576797A7976747576000277017601750273000772716F6E6D6C6B00036A0269
+      000D6A68656465686D6F6E6A65605C00025900055A5C5B5A5800035602550156
+      035702560155025400065351504F4E4D034C014B014902480249000448474645
+      02440143024402450144014302420006413E3B383738023A000B37312E2F3033
+      353329180D00020A00100B0D0E0F111213141617191A1B1C1D1E021F01200000
+      0026DAD9D8D6D4D2D1CFCDCBC9C6C3C1BEBBB8B5B1AEAAA6A29E9994908B8681
+      7C77726C67615C5602520006575C5F61656E027300036F6C6A00036900076A6C
+      6F7786949A00029C00059A938A817D00027E00057F808284850002860387000C
+      8684838487898683817F818403850004888A8C8E0291000A908F9092959AA3A7
+      A39A02940196029800069695979A9B9D029E049D019C029B029C029D00059C9B
+      9C9D9C00029B00069D9E9D9C99940291039201910290001B9396989A9B99958E
+      847D7A7978777576787B7C797776787B7C7A7500027200057476777574000273
+      01720171026F000F6E6D6C6B696867686968656465696D00026F00076A645F5B
+      58575900025B025A000459585756025501580259000357565500025400065250
+      4F4D4C4A03490004484645460247024601450244000443424344024502440008
+      4342413F3C393739023B01370132032F000632353329180D020A00110C0D0E0F
+      111213141617191A1B1C1D1E1F00022000000033DBDAD9D7D5D4D2D0CECCCAC8
+      C5C2C0BDBAB7B3B0ACA8A4A09C97928D88837F7A756F6A645F595452555A5E5F
+      626A7274716D6B00036A000E6B6C6F74808F989B9C9A958D847F027D00047E80
+      838503870004868483820280000881858886848382830285028400048688898C
+      029000178D8A8B8E91959FA6A59D9897999B99969596989B9D9F9E00029D019C
+      029B000B9A9B9D9EA09F9D9C9DA0A10003A0001E9F9D9B97939293949392908E
+      8D9094989A9B9A97928A84807D7B7A797A7C027E017C017A027900047B7C7A75
+      0271000573757675730002720271037000056F6D6B6968000367016602640003
+      666A6D00026E000469615C5902570005585958595B00025A0004585655560258
+      00035755540003520003514F4D00024B00034A49480002470446034502440243
+      00034243440003450009444342413F3C39383900023B000338322F00022E0006
+      3135342A190D020A00110C0D0E0F111214151617191A1B1C1D1E1F0002200000
+      0027DCDBD9D8D7D5D3D2D0CECCC9C7C4C2BFBCB9B6B2AFABA7A39F9A95908B86
+      817D78726D67625C56000253001C575C5F61677175736F6C6A696A6B6D6F727B
+      89959A9B9A98938D8680027E0008808184878887858304820004838688870386
+      0387028500048687888A028D000C8987888B8F959FA7A8A4A09D029C019A0296
+      0017979A9C9D9E9D9C9B9A999A9B9C9E9FA0A1A0A1A2A4A3A000029E019D029B
+      00089A97969593918F8D028C00048F93979A029B000A9895908B86817F7E7D7E
+      037F00037E7D7B00027A00037B7A76000274017602770006767371706F700371
+      0003706E6C00026B0003696867000266000467696B6D026E000469625C590258
+      015902580159035B01590158035601550154025301510252000351504E00024D
+      00034C4B4900044802470446014502440243000544454645440002430013413F
+      3C3A38393B3C39332F2E2F3135342B1A0E00020A00130C0D0E0F111214151617
+      191A1B1C1D1E1F2021000000002FDCDBDAD9D8D6D4D3D1CFCDCBC8C6C3C1BEBB
+      B8B4B1ADA9A5A19D98938E8984807B75706A655F59545254595D60656E000275
+      0019716C6867686B6D7072778390989A9B9A98938C837F7E8082850004860185
+      02840003858687000288028701880189028A0188028701880189028A00118B8A
+      8886878A8F97A1A8ABA8A4A09C9B980002960004989A9C9B029C00079B9A9998
+      999A9B00029C00039EA2A40002A50005A4A19C999A00029C00089D9C9B989491
+      8E8C028B00058D8F93979A00029C00079996938E88838100047F027E027F000E
+      7D7A797A79777677797A79777470026E016F0470016F036E016D016C026B036A
+      016C016D026F00076B645F5C5B5A5B00065A0005595756555400025202530252
+      02510004504F4E4F024E014C044B024902480005474645444300024201430144
+      034500064443413F3D3A0239001F3B3C3933302F303336352C1B0E0A0B0C0D0E
+      0F111214151618191A1B1D1E1F000220012100000028DDDCDBDAD8D7D5D4D2D0
+      CECCCAC8C5C3C0BDBAB6B3AFACA8A49F9B96918C87827D78736D68625C570252
+      000A555B60646A7275726D6702640009676B7072757E8B969A00029B00089996
+      8E847E7D7F810283000482838788068902880189028A00068B8A88878889038A
+      0389028A000C8B9099A3A9ABA9A59E999796039501970299049A0199029A019B
+      019A029900139BA0A2A4A3A29F9B9A9C9E9F9E9D9A9794918E00028C000F8E8F
+      9092969A9C9D9A97948F88838100027F00097D7C7B7C7E7F7D79770002780277
+      0007787A7B7976747200037102700171017304720010716F6E6D6B6A696B6D6F
+      706E68635F5D025C015B0559000356555400025302520006535453525150024F
+      014E034F014D024C014B014A0249024700054644434241000240001541434546
+      45444342403D3B393A3B3C3A343130323400023600152D1C0F0A0B0C0D0E0F11
+      1214151618191A1C1D1E1F000220012100000030DEDDDCDBD9D8D7D5D3D2D0CE
+      CBC9C7C4C1BEBBB8B5B1AEAAA6A29E99948F8A85807B76706A655F5954515258
+      5E62666E027400216E67605E61676D71747A8693999B9A99958D827B7A7C7E80
+      7F7E81878A8C8B8A890003880189028B028A01890287000388898A00048B000D
+      8E908E8D919AA3A9ACA9A39B960003940393019603980007999A9B9C9D9C9A00
+      029900049B9E9FA103A202A0029F00099E9C9B98969593929100039000188F90
+      94999C9D9B98948F8983807F7E7C7978797C7D7C7976037701760178027A0178
+      01760375017601750274000B75767574737271706F6C6A00026900096B6D6F70
+      6F6A65605D00025C00035A585700025801570155045304540003535251000250
+      044F00044E4C4B4A024902480004474645440243014202410142014303460006
+      454443413E3B023A00043B3D3A3502310007323537362D1C0F00020A00110C0D
+      0E10111214151718191B1C1D1E1F20000221000001DE01DD02DC003BDAD9D7D6
+      D4D3D1CFCDCBC8C6C3C0BDBAB7B4B0ADA9A5A09C97928D88837E78736D68625C
+      565251555C60636A72747069615C5E646B6F7376818E9700029A000599948B81
+      7A000279017B037E000381878A00028C00068B88868586880489000487868586
+      0288018B028C00108E9193918F9299A1A8ABA9A2999493950396000997989997
+      95979A9C9D00029E00049C9A9B9D02A001A201A402A50005A4A29F9C9A000299
+      001598979697969593918F8D8E93989C9D9C999590888200027F000B7E7B7876
+      77797B7C79777800037900067A7B7A7877780279027A0278000B77767572706F
+      6E6F6E6D6C00026B00096C6D6E706F6A64605C00035B01590358015601540353
+      0154055501540253015202510005504F4E4C4B00044A02490003484746000245
+      02440005434445464700024600144543423F3C3A3B3C3D3B363130323538372E
+      1D0F020A00110C0D0E10111214151718191B1C1D1E1F2000022100000058DFDE
+      DDDCDBDAD8D7D5D4D2D0CECCCAC8C5C2BFBCB9B6B3AFABA7A39E9995908B8680
+      7B75706A655F59545152585E61676F74726C656162666A6E71747B8994999A99
+      968F87807D7B7C7F808284878A8B8C8D89858485868703880004878685870288
+      018B028D00098F9193929092979FA60002AB0003A69F9B00029A039B029A0007
+      9B99989A9C9D9E00029D029C019E01A103A402A50005A4A3A19D9A0002970298
+      0299000B9A9997938F8D8C8D91979B00029D00059A9690878100027E00037D7B
+      780002760006787B7C7B7A7B027C017D037E027C027B037A000779777674726F
+      6D00026C016D046E036D016E026F00046C66625E035C015A0258025702560004
+      555455560357025602550154015302520250014F024D024C014B024A01490247
+      02450244014502460347000646454443403D023B000D3C3E3C36312F31353837
+      2E1E0F00020A00110C0D0E101112141517181A1B1C1D1E1F2000022100000031
+      E0DFDEDDDCDBDAD8D7D5D3D2CFCDCBC9C7C4C1BEBBB8B5B1ADA9A5A19C97938E
+      88837E78736D68625C565251565D60646C000273000D6E676566686B6D707277
+      82909700029A001298958E86807D7C7F82848688898A8B8D8A86048501860387
+      0388001587898C8E8F909192919091959CA4A9ABAAA59F9C9A00039B0299019C
+      019D049E019D019C029B00079CA0A4A6A5A3A20003A000039F9C990002970003
+      9A9B9C00029B00049895918E028C000C8D91969B9D9E9B979189827F027E017C
+      017A027800037A7D7E00027D017E017F0480027F00047E7C7977037600057573
+      716F6E00026C00036D6E6F00036E036D00086E6F706E6964605D025C015A0458
+      02590158015704580007595857565554530002520250014F014E024D00034B4A
+      49000248000347464400024300034445460005470014464443413E3B3C3D3E3D
+      37312E303538372F1F10020A00100C0D0E101112141517181A1B1C1D1F200221
+      012200000041E0DFDEDDDCDBDAD9D7D6D4D3D1CECDCBC8C6C3C0BDBAB7B3B0AC
+      A8A39F9A95908B86817B76706B655F595451545A60636A71746F6865676A6C6D
+      6F71747D8A959900029A0009979188807C7B7D82860004870003888A89000287
+      02880187028601870189028C00048A888A8C028E048F00198D8E91979EA5AAAB
+      A69E989596989794969B9FA1A2A09E9D9C00029B00079C9FA4A5A3A09E00039D
+      00069B999897999D029E00069C9894918F8D028E000C8F91969A9D9F9D99948D
+      8580027F00067E7D7C7B7C7E047F0280017F017E037D00057C79747172000273
+      000772716F6D6C6D6E00036F026D000C6B6A6B6C6D6E706E69635F5D025C015A
+      03580004595B5C5B035A0259025800045655545203510150024F00054E4D4C4B
+      4900034800034746450002440145024602470248000647464544413F023C0008
+      3D3E3D37312F3135023800163020110B0A0C0D0E101112141517181A1B1C1E1F
+      202102220000004EE1E0DFDEDDDCDBDAD9D7D5D4D2D0CECCCAC7C5C2BFBCB9B5
+      B2AEAAA6A29D98938E89837E79736D67625C565253595F63676F74716A67686A
+      6C6D6E7072788592989A99979188827E7D7E838687860284018503870008898A
+      89878685868A028E018C028A018B028C00118E8F908E8C8B8D9299A2A9ABA69B
+      928F91000295000893959A9FA2A3A2A0029F019D029C00069FA3A4A29F9D029C
+      000C9A989695969A9FA19F9B9690028E018F01910290000B9295999D9F9D9A95
+      8E858000027E037D00037B7A7B00037E017D027C017B0479000677746F6E7072
+      0271000B6F6D6B6A6D6F6E6D6C6A69000268000C696A6C6D6F6E68625F5D5C5D
+      035B035A015B015A0358000557565554520002510004504F504F044E024D014C
+      024A02490248000347464500034602470248002847464544423F3D3C3E3F3E39
+      3231333639383120110B0A0C0D0E101112141617181A1B1C1E1F202102220000
+      02E10035E0DFDEDDDCDBDAD8D6D5D3D1CFCDCBC9C6C3C1BEBBB7B4B0ACA8A4A0
+      9B96918C86817C76706A655F595453585E62656C73746F6A6900026B00086D6E
+      6F7176808D960299000898948D86827F80820284000983818284868788898800
+      04860188018B028E018D018C038B00058A8C8F919000028E00118F9399A1A7AB
+      A89E948F90949594959A9F0002A30005A2A1A09F9D00029C00059FA2A3A19E00
+      029D00039B9997000296000A999DA1A29F9A948F8E9102930192029100039498
+      9C00029E00059B968E847D00027B037A00097977787C7D7C7B79780003770004
+      7876726F026D00067072706F6D6C026900036B6C6A00026901680267000D6869
+      6A6B6D6F6E6A64615F5E5D00035C00055B5A59585600045400065352514F4E4F
+      0350014F034C034D014C024B01490548054704480005474645434000023D013E
+      023F00053A3433343700023900163122120B0A0C0D0E101112141617181A1B1C
+      1E1F20210222000001E201E102E002DE0030DDDCDBD9D7D6D4D2D1CFCDCAC8C5
+      C3BFBCBAB6B3AFABA7A29E99938F89847E79736D68625C5654575D6163697175
+      726E026B000A6A6C6D6F71747B8893980299000496908781037E017F02810280
+      0003838586000288000B8581828485878A8C8D8E8F00038E00048F9093950296
+      000697989A9CA1A502AA0005A39B9594960002970006989CA0A2A09F029E019C
+      029A00069C9FA1A2A19F029E019D039C00089D9FA0A19F9C9996029300109596
+      9593929193969A9D9E9B978F847C037A0009797A7978797C7E7D790002770006
+      7675777876720270017102730170016E026D016A036903670268000E696A6B6C
+      6D6E706F6B66625F5D5C035B00055C5A59575500035202510250024E014F0350
+      00064E4C4B4A4C4D024C024B0003494748000349014802470248024902480008
+      47464543413E3D3E023F00053B3634353700023900163323130B0A0C0D0E1011
+      12141617181A1B1D1E1F202102220000002CE3E2E1E0DFDEDDDCDBDAD9D7D5D3
+      D2D0CECCC9C7C4C1BEBCB8B5B1ADA9A5A09B96918C86817C76706A655F590256
+      00145B6063666D74736F6C6B6A6B6C6E707377829097029900049791867F037C
+      017E037F0004808284860287018402800007818386888A8C8E00039001920193
+      0294000395969700029A029B00089DA1A7ABA9A39D990297000698999DA09F9C
+      039A000599989A9C9F0002A0029E019F01A005A10004A09F9E9C029B019A0199
+      0398000F969492919396999D9E9C9991877D7A00027B027A027900057B7E807E
+      7A0004780279000478757475027601750171026E00046F6D6A6903680003696B
+      6C00026D026E026F001271706B65605D5B595A5B5C5D5C5A5856545303520351
+      0350034F00064D4C4B4D4E4D034C014A0249024A000449484746024701480249
+      00094847464544413E3D3E00023F013C01370235001937393A3324130B0A0C0D
+      0E101113141617181A1B1D1E1F2022000223000001E301E202E101E002DE0031
+      DDDCDBD9D8D6D4D3D1CFCDCBC9C6C3C0BDBAB7B3AFABA7A39E99948F89847E79
+      736D68625C5756595F63656A7174716E6C00026B000F6C6E7072757D8B95999A
+      98948C8681000280028100067E7D7E8082830284018301810280000782868889
+      8A8C8E00028D018E0291038F019101940296000995969AA2A8AAA69E98000294
+      000795979B9E9D9A98000299000B98999C9D9E9D9B999A9C9F0002A1019F029E
+      019C029B00059C9D9E9D9C00029A0003989693000392000994989C9E9D9A948B
+      8100027D000B7E7C7A797A7C8081807D7C00057A017802770278000377767200
+      026F000571706E6D6C00026D016E026F0170056F027000046C655F5C0259015A
+      015C025D00065C5B595857560255045301520251015001510250044F014E024D
+      014C014B024A024901470146044501470249014801470246000344423F00023E
+      023F001D3C37353638393A3425140C0A0B0D0E101113141617191A1C1D1E1F20
+      2200022300000007E4E3E2E1E0DFDE0002DD002FDCDAD9D7D5D4D3D1CECCCAC8
+      C5C2BFBCB9B5B1ADA9A5A19C97928C87817C76706B655F5956575D6265686F75
+      74706E00026C00096D6E6F717379869198000299000C97928E88848384827F7B
+      7C7E027F018001810282000380818300028702860005888A89888A00028D018A
+      0289018A018D0290000F8F90939CA5A9A49A938F909395989B00029C029B000B
+      9A989A9C9D9C9A9796989A00029B0004999798990298000A9A9D9FA09F9D9B9A
+      97940491000393979B00029E00089B968F888381807D027A000C7B7E8182817F
+      7E7C79787978027700087879787675747271027300037271700006710170016E
+      036D00066F706D665F5B025900075B5C5D5E5D5C5A0002580257015601550553
+      035203510004504F4E4C034A0349000348474500054301460249024800064746
+      4543403E033D001D3A363436383A3B3526150C0A0B0D0E101113141617191A1C
+      1D1E1F2122000223000002E4002BE3E2E1E0DFDEDDDCDBDAD8D6D5D3D1CFCECC
+      C9C6C3C1BEBBB7B4B0ABA7A39E99948F8A847F79736D67625C00025700095C62
+      65676D7476737000036D00086E6F707276808D96029900059896938D88000285
+      0183017E027A017C037D017F01810383000784878684838588000289018A028D
+      00068B898685888A028B00128C8F97A1A7A49A928F9092939495979A9C9E029C
+      049B0198029700049A9B99960294019602970003989B9E0002A000089F9D9B98
+      94908F900291000D92969A9D9E9C98928B8582817E00027B017D01800381000C
+      7F7E7B787778777677797A7804770276000375737100067000036F6E6C00026B
+      00096C6E6F6E67605C5A5900025B035C00035B59570004560003545352000253
+      000454535251035000044F4E4C4A024801490348024701450544014703490148
+      024700084543403E3C3B39370233001A35383A3B3627150C0A0B0D0F10111314
+      1617191A1C1D1E202122022300000004E5E4E3E202E10033E0DFDEDDDCDBD9D8
+      D6D5D3D1CFCDCBC8C5C3BFBCB9B6B2AEAAA6A19C97928D87817C76706A655F59
+      575A6064666A727675727000036E00126F7071737B8893989A999895918B8784
+      817D0279017B017D027F00038183850003860009878583818386898A8C00028D
+      00148C8985838487898A8D8F959FA7A69E948F8E9091029000089194999D9E9D
+      9B99029A000398979900029C019A02960297000798999B9E9F9E9D00029C0005
+      9A95908E8F0002910019909194999C9E9D99938B837F7E7C7A7B7E8081807F7E
+      7D7B790004780179027B017A0179037A00047875726F076D00036E6D6C00026A
+      00086B6E6F6E69635E5B055A0003595857000255035601550153025202530152
+      02510350024F014D014C034B024A014902480147014604450147034903480024
+      4644413F3C393734323336383A3B3628160C0A0B0D0F101113141617191A1C1D
+      1E2021220223000001E502E40006E3E2E1E0DFDE02DD0023DCDAD9D7D6D4D2D0
+      CECCCAC7C5C1BEBBB8B4B0ACA8A49F9A948F8A847F79736D68625C0002580005
+      5C6265686F000275000374727000046F0006717277839097039A001C97928B85
+      807D7A77787A7C7E8183858688898A8987848283868A8C8D028E00118D898583
+      85878A8D909398A0A7A9A3999200038F018D028C00078F949B9D9C9A97000398
+      000597999B9D9A0002980299000698999C9E9C9A029900069A99959190910292
+      000E909193979B9E9D9A948D847F7D7C027B017E0280017E047C017B027C017D
+      037C017B037A000679787572706F036E00046D6C6B6C036E016D026C016E026F
+      00046C66615C025A025900065857555453540456015504540253015203510250
+      014F024E014D024C014A0148044702450003444546000249014A014902480008
+      4644423F3D3B39360234001C36383A3B3729170C0A0B0D0F101113141617191A
+      1C1D1F202122232400000005E6E5E4E3E20002E1002FE0DFDEDDDCDBDAD8D7D5
+      D3D2CFCDCBC9C6C3C0BDBAB7B3AFABA6A19C97928C87817C76706B655F595759
+      5F63676D74000276000374727100037000067172757E8B95039A00089891887F
+      7A787778027A0004797C808402860188018B028D00078C8987888A8D8F000391
+      0190018D028B000E8D8F929497999CA2A9ABA79E958F028E048D01900197029C
+      0003999798000299000798999B9D9C9A9900029A0299000A9A9B9997989A9B9A
+      979404920005908F91959A00029E00079B97918B84807F00027E027F00037E7C
+      7B00037C00077E7F807F7D7B790002780277000376747100027003720170016F
+      026E026F027000046F6E6D6E027000056D67605C5900025A0008585655545253
+      5455025602570156025501540253015203510150034F024E00044C4B4A470346
+      0147044501470149024A0249000648464542403F023E001D3C383637383A3B37
+      29170D0B0C0D0E101113141617191A1C1D1F202123000224000001E601E502E4
+      01E302E20028E1E0DFDEDDDCDBD9D8D6D4D3D1CFCDCAC8C5C2BFBCB9B5B1ADA9
+      A49F9A958F8A847F79736D68615C025700055B61666B72000278000376747200
+      0471000672747A859198029A00129790857C7877797C7E7C797B7F8386878A8E
+      0390018F028E00038F90920003930192039100049396999A029B000A9DA3A9AC
+      AAA2978E8B8D028E00048F8E9198029C00059A97989B9C00039B019D019C029B
+      00039D9E9B00029801990298019A029D00059C9894919000029100058E8C8E94
+      9900029E00079C98948F88828100038000057F7D7C7B7C00027D00077E7F807E
+      7B797600027700087675716F6D6F717402750173017206710004706E6D6E0270
+      00056C655F5A5900025A00065856555453540255000654555657555402520151
+      0250014F0450034F014E024D014B014A0249014801490548044A000649484745
+      4240023F001E403F3B3837383A3B382A180D0B0C0D0E101113141617191B1C1D
+      1F2022230224000001E602E502E40006E3E2E1E0DFDE02DD002FDCDAD9D7D5D4
+      D2D0CECCC9C7C4C1BEBBB7B3AFABA7A29D98928D87817C76706B645E5956585E
+      65696F7679787674730003720273001876808C96999A989289817C7B7E828380
+      7E7C7D8084878B8E048F048E018F029001910190039101930197039A000D999A
+      A0A8ACABA4968D8A8D909100029001920197029A000498979A9D029E019D019C
+      049D000EA0A19E99979697989C9E9D9A96930390000E8E8A898D93989D9F9D99
+      948E8680027E027F017E017C037B00097C7B7C7D7E7C7A787600027700037674
+      7000026E00036F717400027500037473720002710270000C6F6E6C6B6C6F706D
+      66605B59025B000359565500025400045657565502540005555251504F00044E
+      01500151025201510250024F014E014D024C014B054A0249014A014B024A0008
+      49484745423F3E3F0241001E3D3837393A3B382B180E0B0C0D0E101113141617
+      191B1C1E1F2022232425000001E702E601E502E40036E3E2E1E0DFDEDDDCDBDA
+      D8D6D5D3D1CFCDCBC8C6C3C0BDB9B5B1ADA9A5A09B95908A847F79736E67615C
+      57565B63676B717779787674037202730005757B87939800029A0007968F8780
+      7D7E810002820007817F7E8082858900028B038A018902880004898A8C8B028C
+      00058E8F909296000399000C98999FA6AAACA6998E8A8C900492019303950197
+      019B029D049E00039F9E9F0002A100169E9A959493969B9C9995949392918F8A
+      87888C92979B029E00079A958D837C797A00027C017B017902780279000E7879
+      7A7B7A797877767574737271037000037172730002720171026E016D026C000F
+      6A69686A6D706E68625C5A5B5C59560002550005565758575600025500035451
+      5000024F014E014D024E015001520253000352515000024F024E014D024C024B
+      024A0349014A024B024A0005494746433F00023D002040413D3937393A3C382B
+      190E0B0C0D0E101113141618191B1C1E1F202223242500000004E8E7E6E502E4
+      01E302E2002FE1E0DFDEDDDCDBD9D8D6D4D2D0CECCCAC7C5C2BFBBB7B3AFABA7
+      A39E98938D87827C76716B655F59565A6166686D7400027A0003777573000272
+      000773747578828F9700029A001498938A817C7A7B7C7F807F80818385878887
+      85840285000386878800028902870007888B8E909396970003980008999DA2A7
+      ABA89D92028C00128F939492908F9194979B9D9C9B9D9E9FA0A1029F02A0000A
+      9E9A95929094999A97930294000A93908C8785878A8E9499029E00059B958D82
+      7A0002760277017601750476000375787A00027B000579787674730002720273
+      0171046F000470716F6D036A02690005686665676B00026E000369625C00025A
+      00055B5856555600065700035655520002510250034F00085052535452514F4E
+      034D014C034B014A024903480149024B024A0005494846434000023E001E4142
+      3E3937383A3C392C190E0B0C0D0E1011131516181A1B1C1E1F21222402250000
+      02E801E701E602E50006E4E3E2E1E0DF02DE002ADDDCDAD9D7D5D3D2D0CECBC9
+      C6C3C0BDBAB6B2AEAAA5A09B95908A857F79736D68625B57585F65686C74027C
+      00037A77730002720008737475777E8A9499029A0008968F877F7B7A7C7F0280
+      018202850286028801850281018201860388018703840004878A8E9102940393
+      000495979BA302A9000DA1958D8A8C929594919092979B00029E029C00039E9F
+      A00002A1019F039D00099B9996949396999A99000297001495918C8986848586
+      898F979D9E9C9790857B767503740003757675000374000B777A7C7B79787773
+      706F710002730171026E026F0004706F6D6B0568000A67656465686D6E69615C
+      025900055A595756570003580159025801570155035302520151025001510352
+      0004514F4D4C024B024A0449024802470148014A034B024A0004494744410240
+      0242001C3F3937393B3C392C1A0E0B0C0D0E1011131516181A1B1D1E20212324
+      0225000002E801E701E603E50006E4E3E2E1E0DF02DE0038DDDBDAD8D6D5D3D1
+      CFCDCAC8C5C2BFBCB8B4B0ACA8A39E98938D88827C76706A645E59585C63686C
+      757E7F7C79757372737576777B869198029A000B99958E867F7D7E8081828500
+      0488028900218682808286888786858382838486898E91908D8C8D9092969EA6
+      A9A4998F898A8E00029302920008959B9FA19F9D9E9F029E029F019C019A029B
+      029C019A0298019A029B00089A9897948F8A88850283001182848B949B9E9D99
+      938A817B78767475770002790005777574767900027C00047A79787402700172
+      02740171026E026F027000036E6B690002680367016602650006686D6F6A625D
+      035A015902580359035A0003595755000254025300035251500004510003504E
+      4C00024B00034A4948000247000348494A00024901480149024A034B00064A49
+      4846444202410243001C3F3A38393B3C3A2D1A0E0B0C0D0E1011131516181A1B
+      1D1E202123240225000001E902E801E701E602E501E401E302E20033E1E0DFDE
+      DDDCDAD9D8D6D4D3D1CECCCAC7C4C1BEBAB7B3AEAAA6A09B96908B857F79736D
+      67615B585A60676C747D817F7B787500027401750277000479818D96039A0004
+      98938B8302800281018301860388028901880185028200048386878603840283
+      00178587898C8E8C8A898B8E909299A1A7A69C918A898D91920002910006949B
+      9FA1A09E029D019C019B029C00049A999C9D029F019E039D00119C9B97949392
+      8F8B88848281808289939A00029E00079A968F88817C7800027700117A7C7D79
+      76747577797B7A7978757372730002740171016F036E00066F706F6D6B6A0369
+      026A0269000A6B6E706D67625F5D5B59055800065A5B5A595653035201510650
+      00034F4E4D00044B00034A49470002480149024B034A044B014A014802460144
+      0141023F01410243001E3F3A38393B3C3A2E1B0E0B0C0D0E1011131516181A1B
+      1D1F202123242526000002E902E801E701E602E50005E4E3E2E1E00002DF002A
+      DEDCDBDAD9D7D5D3D2CFCDCBC9C6C3C0BCB9B5B1ACA8A39E99938E88827C7670
+      6A645E59585D646A717B028100077E7A7775747577000278000A7E899498999A
+      99958D8503800004818284860387000388868500028400058587898785000286
+      0285000687898B8C8B8A0289000D8B8D8F90959EA5A7A1968D8A8C000290028F
+      000692999D9F9E9C069B00049A9B9EA002A201A1019F029D00049B9994910290
+      00138F8B8885838280828891999D9E9B97928B837D000379017B027C00037875
+      7300027401760278017702760175017303740172026F00036E6D6E000270016F
+      016E026D066C000C6D6F71706B66625E5B5A585703560159025A000359555100
+      0350034F014E054F014E044D014C014B094A034B000749474542403E3C00023B
+      000D3F4243403A38393B3C3A2F1C0E00020B00100D0F1012131516181A1B1D1F
+      202123240226000002E902E801E702E601E501E402E30034E2E1E0DFDEDDDCDB
+      DAD8D6D5D3D1CFCDCAC8C5C1BEBBB7B3AFABA6A19C96918B857F79736D67615B
+      575960676E788082807C797602750176027800047B85909703990006958E857F
+      7D7E027F0180018103830484000885888A8C8A888A8B028900158A8C8E8D8B8A
+      8B8C8D8F9091959DA4A8A59B918C8D00028F028E000390959900029B039C019B
+      019C039D019E02A102A201A0019C0399000398949000028E00058D8B88858300
+      0382000E8790979C9E9C98938C837C797778027A017901760473000774767776
+      7576750002740275017302710170026F03720170026F00036E6D6C00036B0008
+      6C6F71706A645F5C0259015701560255000756595A5957545000024E014F034E
+      034D014E014F0250014F024E014C024B00064A4B4A49484703480149024A000E
+      4744423E3C3B39383A3F4243403B023900063B3C3A2F1D0F020B00100D0F1012
+      131517181A1B1D1F202223250226000001EA01E903E801E701E602E501E401E3
+      02E2003CE1E0DFDEDDDCDBD9D7D6D4D2D0CECCC9C6C3C0BDBAB5B1ADA8A39E99
+      948E88827C76706A645E58575B636A737D82817D7A77767576777879808C9497
+      0299000B958D837B797B7C7B7A7D80000381000B82838485888A8D8C8B8C8D00
+      038C028E018C028A000F8E9092939596999EA4A9A8A0948E8C00028D018E0290
+      000692949597999B039A019E02A101A0019F029D00049E9C989603970192018F
+      028C00058B8A898684000283001384888F969B9E9D99948C837B777576787978
+      7600057401750176027504760277017502740175047401720171026F00036E6D
+      6C00046B00076E706F69625D5A0002580157035501570258000457565350054E
+      014D024C00054B4C4D4F4E00024D014B014A0248034900034846450002460147
+      0148024A000E484543413F3E3C3B3D404344413C0239001A3B3D3B311E100B0C
+      0D0F1012141517181A1C1D1F212224252627000002EA02E901E801E702E602E5
+      0006E4E3E2E1E0DF02DE002EDDDCDAD9D7D5D3D2CFCDCBC8C5C2BFBCB8B4AFAB
+      A6A19C97918B857F79736D67615B56575C646E7A81827F7B7876027500077677
+      787D8791960002980006958C80787576037700037C8082000281000482858687
+      0288028900038A8C8D00028C000F8D8E8D8B8A8C929597989A9B9C9FA40002A8
+      0007A298908C8A8B8F00029202900025929497989796989DA09F9B9896979A9B
+      9A98979695918E8B8A8B8A8987848385868A8F949A00029D00099A948C827975
+      7475760002770175037601750576017702780004797A79780277037600057574
+      71706F00026E016D016C026B026A016C026F000769625D5A5859580003560257
+      0356000354514F00054E00054D4C4A494A00034D00034C4B4A000249044A0148
+      0247000C4647494A4B4A4948474544430241014202440141013D0239001A3B3D
+      3C311E100B0C0D0F1012141617191A1C1E20212324252627000002EA02E902E8
+      01E702E602E50006E4E3E2E1E0DF02DE002DDDDBDAD8D6D4D3D1CFCCCAC7C4C1
+      BEBAB6B1ADA9A49F99948E88827D77706A645D5854565D68758082807C797700
+      0275000D7677787A828C949798968E8278000274000A7576787F838583828386
+      0387018402830005868A8B8A8B00048D00078E919598999A9B00029C00129DA0
+      A4A7A49C938E8A8B8F93928F8E9092940397000A999C9D9B979291939899029A
+      0007979593908D8B8A00028B00118A89868487898A8D92989C9D9B968E847A00
+      047501740275017701780779037A027B00037A7877000276000D757675737170
+      6F6E6D6C6B696800026700076A6E6F6B65605C00025A01590157055602570003
+      55525000034F034E014D014C024A014C044D014C064B014A014803460003484A
+      4B00024C014B014A024901470145024300044445423D023A00183C3E3C311E10
+      0B0C0D0F1112141618191B1C1E20212324260227000001EB03EA01E902E801E7
+      01E602E502E40037E3E2E1E0DFDEDDDCDBD9D7D5D4D2D0CECBC9C6C3C0BCB8B4
+      B0ABA6A19C96918B85807A736D67605A55535762707D83827E7B787675767700
+      0278000A7D879195979690867C7602750003767A800002840004828082850284
+      000983817F8084888A898B00028C00058D909294960003970499001E9A9FA4A6
+      A19A928C8A8C90918F8E8F919396989B9C9B9A98959290929597029800059694
+      92908E00038B00058C8B8A888700038900158A8F969B9D9C9791887E77757473
+      727374777A7C7D00027C037A0179037A00047B7A78770276000975767472706F
+      6D6B690002680267000F66676A6D6F6D67625E5C5A5956555600025703580004
+      565452510250034F024E014C034B024C024B064A0008484643424346494B024D
+      014C024B00034A494600024402450143013E023A00063C3E3C311E10020C0012
+      0E0F1113141618191B1D1E20212324262728000002EB02EA02E901E801E702E6
+      02E50005E4E3E2E1E00002DF0023DEDDDCDAD9D7D5D3D1CFCDCAC7C5C1BEBBB6
+      B2AEA9A49F99948E88827D76706A645D5700025300125B6A798384807D7A7775
+      767778777A838D9302950004938C837B0377017A017E028000067E7D8082807E
+      037D00037F8488000289018A028C00048D9092930392001F9496979694959AA1
+      A5A49C938C898B8F91908E8F909295989B9C9B98969593000292019401950294
+      01930192029100048E8C8B8A048B028A000F8887898E949A9D9C99938A7F7774
+      72000270000471727578027A01790178037600047576787A027B000D79787775
+      7473716D6C6B6A6968000269016A0269000B6A6B6E6F6D67615E5C5A58000256
+      01580159025A000558565554530002520151034F014E024D014B014A03490147
+      0548024700084644413F4144484B034D024C00034B4A470004450143013F023B
+      001A3C3E3D331F110C0D0E1011131416181A1C1D1F21222425262728000003EB
+      02EA02E901E801E702E602E50006E4E3E2E1E0DF02DE002CDDDBDAD8D6D4D3D1
+      CECCC9C6C3C0BDB8B4B0ACA7A29C97918B85807A746D67605A55525663748185
+      837E7B78037600137877787E89919495938F867C76757677797B7C00027B000D
+      7E807E7B797A7B7F848889888A00038C018E0290000791909193969897000296
+      019A01A002A400069D948D8B8D900292000391929300029401960199029A0199
+      029701960194039202910007929392918F8D8B000289000B8A8B8C8B8A878688
+      8C929800029C000799948B8178747100026F0006707273757675027302720273
+      000374787A00027B000779777471706F6C000268026900036B6C6E00026D016C
+      036B000C6D6F6E6A65615E5C5856575803590003575554000353000352514F00
+      024E034D014B014A024901480547000D4645464544413F4143474B4D4E00034D
+      00054C4B4846450002460144013F023B00063D3F3E342112020D00120E101213
+      1517181A1C1E1F21222425272829000001EC02EB03EA01E902E801E702E602E5
+      002EE4E3E2E1E0DFDEDDDCDBD9D7D5D4D2D0CDCBC8C5C2BEBAB7B2AEA9A49F9A
+      948E88827D77706A645D5753545E6D7C02840004807D79770276000C7877787B
+      858E92949390877B02730274001275787B7A797B7E7D7B797B7D8084878A898A
+      038C00038D8F910002930003949597000298029900079C9FA3A5A19B96000392
+      0493029500069495969899980397019501920391000992949594928F8D8B8A00
+      048B00038C8B89000287000C8A90969B9C9A968E857C76730271017301750376
+      00047573727002710004727376780279000377736F00036C000C6967686A6C6D
+      6F706F6E6C69026700096A6D6F6D6964605C5900025701580157035601550153
+      02520253000451504F4D044C014B014A02490147014803470146014502460007
+      4543414244474B00044E024D014B0149044601450140023C00063E403F362313
+      020D00120F1112131517191B1C1E2021232426272829000002EC02EB03EA02E9
+      0003E8E7E60002E501E402E30031E2E1E0DFDEDDDBDAD8D6D5D3D1CFCCCAC7C4
+      C0BDB9B5B1ACA7A29D97918B85807A736D67605A55535864748084827E7B7800
+      0277037800047A818A910293000591897D74720003740178027C027A017C027D
+      00067C7E818283850289038B00048A8B8E91039301940395000B97999B9EA2A5
+      A6A29D9793000491000492959796039501960197029500079695939293949600
+      029500059392908E8D00038E028C00148D8C898685888E959A9C9B9790867C76
+      73727374047600047573716F026E00096F707274767776716D00036B02690003
+      6A6D6E00026F00056E6D6C69660002640167016C026F00056B655F5B59000357
+      0156015503560003545253000254000452504E4D044C014B024A014905480247
+      0004484746440243000444474B4E034F024E00044C4A4746024701460141023D
+      013F0241000337241400020E00120F1112141617191B1D1F202223252628292A
+      000001ED01EC02EB03EA02E901E801E702E602E50004E4E3E2E102E00023DFDE
+      DDDBD9D8D6D4D2D0CECBC8C5C2BFBBB7B3AEA9A49F9A948E88827D76706A635D
+      5700025300035A687A0002830004807C7978027702780018797E868E9293928C
+      817773747574777C7D7B7A7C7F807F81038401850288028900068887888B8D8E
+      038F000E908F9092979A9DA1A5A7A5A099930490019101940297029502940195
+      029401950196039502970195029201930192029102920190018F028E000F8C87
+      8382868D93999C9B9890867A74000271000370727300027400057573716F6D00
+      026C000A6E6F7073757776716D6B036A016B016C026E016D026C026B000C6967
+      6667696D706E69635D590458015702550256015404530003524F4E00044D024E
+      00034D4C4B00064A034900034746450002440003474B4F000350024F00034D4B
+      48000247000348474200023E00063F4241392615020E00121011131416181A1C
+      1D1F212223252728292A000001ED02EC02EB03EA01E902E801E702E601E501E4
+      02E30031E2E1E0DFDEDDDCDAD9D7D5D3D1CFCDCAC7C4C1BDB9B5B1ACA7A29D97
+      918B85807A736D66605A54515360748284817E7B790002770178027900047B82
+      8B90029200048E877D760275000374767900037A017D01810382018302840185
+      0187028601850284000386898B00038A018B028C000C8D8F94979A9EA3A7A6A2
+      9B95059200039395960002940004959798970295029601970196029701940292
+      0494029500069492908E8A8402810004858B9198029C00079992877A736F6E00
+      026D00086F70727473706F6E026D000A6E6F7073767876716D6B0269016B026D
+      016E016D026B026C016D016C026A00086B6D6F706D67605B0258015902580157
+      0355025401520353000552504F4E4F00035001510150024F014E024D034C024B
+      014A0249014802470148014C02500251025000084E4C494748494843023F0140
+      024200173A27150F0E1012131517191B1C1E202123242627292A2B00000002ED
+      02EC02EB03EA01E902E801E702E601E501E402E30030E2E1E0DFDEDDDCDAD8D6
+      D5D3D1CFCCC9C6C3BFBBB7B3AFAAA59F9A948E88827D767069635D5752515B6E
+      7E8583807D7A03780179027A00157E878E9192908B837C7876747678797A7C7F
+      818281000280002181828485848281828386898A88878687898A8B8D9093969B
+      A2A7A8A49E989594930002940193029400099395989B9D9A9896950003960295
+      01940293029502960297000695928E8B87840281000D858A90969B9C9A94897C
+      736F6D00026C00036D6F7100027401710170026F016E026F0010717477787671
+      6D6A68696C6E6F706F6E046F00056E6D6C6D6E00027000056D68615C59000558
+      015603550154015202530254015302520553025202510004504F4E4D044C034B
+      00074A494A4D505152000251000C504F4D4A48494A4944403F41024300033B28
+      1600020F001011131416181A1B1D1F2022232527282A022B000001EE02ED02EC
+      02EB02EA02E901E802E701E602E50005E4E3E2E1E00002DF002CDEDDDBD9D8D6
+      D4D2D0CDCAC8C4C1BDB9B5B1ACA7A29D97918B858079736C66605A5451556477
+      8283817E7B790278001F797A797C838B9092918E89827B76757677787A7C7E7F
+      807F7E7F80818384830002810007838486878889880002860188018A028C000B
+      8D8F93989FA5A7A5A09A9500029200039395930003920196019B029E00039C99
+      96000294019505940195019602970298002096938F8B8886848183868A8F949A
+      9C9B958C7F75706E6D6C6D7072747572706E046D000D6F72757776726E6A6869
+      6D6F72000273027201710270016E036D000A6E6F706E69625D5A595802570158
+      0456015503530154015602550156015503540153025202510005504F4E4C4B00
+      064C034B00044E5152530252000951504E4B494A4B4A4500024000064244433A
+      27160210001011131517181A1C1E1F2123242527282A022B000001EE03ED02EC
+      02EB02EA02E901E801E702E602E50028E4E3E2E1E0DFDEDDDCDAD9D7D5D3D1CF
+      CCC9C6C3BFBBB8B3AFAAA59F9A948E88827C767069635D56025100085B6D7D83
+      817E7C7A0378027900047B80898E02910019908C847B747273747577797B7C7E
+      7F80828182838483818385000286000487898B8A0289018B018D028E00068F91
+      94979CA102A5000DA199928E8D9195938F8E91969B00029C00039B9996000294
+      059500159698999A999795928F8B888685848385888A8D929800029B0006978E
+      8378716E036C00076E707374716E6C00036B000E6C6D70737675736F6B696A6D
+      707202740012737271706F6E6C6A696A6C6E6D69635E5B590458025602570156
+      035404550156015404530152025100055251504E4D00024C054D034C00034F52
+      5300025402530010524F4C4A4B4C4B4742414243403524160211001012141618
+      191B1D1E202224252628292B022C000002EE02ED02EC02EB03EA01E901E802E7
+      02E601E501E402E3002AE2E1E0DFDEDDDCDAD8D6D4D2D0CDCBC8C5C1BEBAB6B1
+      ACA8A29D97918B857F79736C666059535054647702820013807D7A797778797A
+      7B7E868C9091908D847A73000270000A72737577787B7E818485028400038687
+      860002840186018702880003898B8C00028D048F000B91939495979BA1A39F96
+      8E00028A00078F95938E8D9196000398029901980396029701980299000C9B9C
+      9B9793908E8C89868586058700038A909600029B00079891867B736E6C00026A
+      00076C6E7072706D6B00036A00096B6E7274767573706E00026C00176D707173
+      7472716F6E6D6B68666465686C6E6B65605C5A00035901580257000359585700
+      0255035604550254015502540353000352515000054F034E034D000350525400
+      035500065453514E4B4C024D01480143024200173F382B1D141112131517191B
+      1C1D1F2123242627292A2C00022D000003EE02ED01EC03EB03EA01E901E802E7
+      02E60006E5E4E3E2E1E002DF0021DEDCDBD9D7D5D4D1CFCCC9C6C3BFBCB8B3AF
+      AAA5A09A948E88827C766F69635C5600025100085D718083817E7B790277000D
+      797A7B7D838A8F91908D877D76000270027100077274777A7D80830003840385
+      0003838182000484000485888A8C028D028C00198E8F908F90959DA19E97918D
+      8E939796918F9194959698999A000499059A029B000398938F00028D001B8B87
+      8586888A89868482868D959A9B99938A7E756F6C69686A6C6E000271016E026B
+      026A00036B6F74000277000775716F6E6D6E6F00047100116F6D6B6968676462
+      6162666B6F6C67605D00025A0459035A01580157035801570356025502560155
+      01540453015201510450014F034E034D014F01530556000355535000024D000A
+      4E4F4A45423F372B1E1602120006131416181A1C021E00092022232527282A2B
+      2C00022D000001EF02EE03ED01EC03EB03EA0003E9E8E70002E602E50031E4E3
+      E2E1E0DFDEDDDCDAD8D6D5D3D0CECBC8C5C1BEB9B5B1ACA8A29D97918B857F79
+      726C665F595351586B7E84837F7C790002770178017A027C000380878D000290
+      00068E898077706F027000067174777A7B7C027E027F0380000B7D7A7B7D7E7D
+      7C7E82858700028802870288038900098F99A0A19B969291920002950191028E
+      00059093979A9C00029D029E00039D9B990003970298000994918F8E8D8C8886
+      8900028B01870183027F0014848B93999B9A958D8278716D6A696A6C6F72736F
+      026D016C026B00076F74777875716F00026D016F0370000A6E6D6B6966656465
+      646302620008666B6F6D66605D5A0459015A015C025B015A025900045A595857
+      035603570156055501540352025301520150034F024E00035055570003580257
+      000D55524F4E50514D46413A2C1E15000212001213141617191B1D1E1F212324
+      2627292A2C2D022E000002EF03EE02ED02EC02EB02EA02E901E801E702E60004
+      E5E4E3E202E10030E0DFDEDDDBDAD7D6D4D2CFCCCAC7C3C0BCB8B4AFAAA5A09A
+      948E88827C756F69625C555155657A8485817E7B7877787A027C00047D838A8E
+      028F000B8A81766E6D6F7071747677000278017A027C017B027C00067B797778
+      7A7C027B00077C7F8285868584000283000B828384868D97A0A29D979000028C
+      000A8E908F8D8E91969B9E9F02A0000CA19F9C98949192949593908F0390000E
+      8F8D8C8D8C8884818081858B9297029B0007968F867D75706D00026B00056C6E
+      71737000026E016D026C016F01730277000A75726E6C6B6D6E6D6C6B026A0004
+      69666463026501640263000A666B6F6E68625D5A59580259015B015C075B015A
+      0259025A035B035A0259015A0158025701560257000456555455025400035556
+      5800055A0024595754515052534F473F342418121113141517181A1C1D1F2022
+      242527282A2B2C2D2E2F000002EF03EE02ED03EC02EB02EA01E901E802E702E6
+      0006E5E4E3E2E1E002DF0020DEDCDBD9D7D5D3D1CECBC8C5C1BEBAB6B1ADA7A2
+      9D97918B857F78726C655F58025300085F73828584807D7A0278017A037C0003
+      80878C00028E00098C84786D6B6D717374000373000476797C7B037A00077978
+      7778797A7B00027C00047E8083840383001982818285898F979FA29E97918B8A
+      8B8E8F9092969A9C9D9C9D00029E00069C989591909202940192028F01910393
+      000591908E8A8600028200068486898C9096029B000D97928B837B74716E6D6C
+      6D6F7000026F0018706F6E6D6E71757674716E6B6A6B6C6A696A6B6C6B686564
+      026503640167016C026F00046A645F5C025A00035B5C5D00035E015F09600261
+      0260025F00055E5D5C5A5900025806570003585A5B00025C015D015C025D025C
+      015A015602530008545551483C2D1F1502120008141517181A1B1D1F02210009
+      23252628292A2C2D2F000230000001F003EF01EE03ED02EC02EB03EA01E901E8
+      02E702E6002CE5E4E3E2E1E0DFDEDDDCDAD8D6D4D2CFCDCAC7C3C0BCB8B4AFAA
+      A5A09A948E88817B756F69625B5553596A7D02850015827F7C7978797C7D7C7E
+      848A8D8E8C877C716A6C700002740005726F70737800027B017A037901780277
+      001976777A7D7C7D7F8284838485868586898D92989EA2A19D979000028B0005
+      8E9091939600029803970299019702940293001295969594929394969593918E
+      8D8A87858689028A000F8B8F949A9B98948E877F7873716F6D00026C00126D6E
+      7072716F6E6D6F737572706D6C6B6C6B026900066B6E6F6D6B68026600066564
+      6364676C027000086B6662615F60626302640165026603670266066502640008
+      6362605F5D5A5856025502540008555456595C5E5F60055F00245E5C59565556
+      57524737261A151314151718191B1D1F212223252628292A2B2D2E2F30310000
+      02F002EF03EE01ED03EC03EB02EA0003E9E8E70002E60004E5E4E3E202E1002F
+      E0DFDEDDDBD9D7D5D3D1CECCC9C5C2BEBAB6B2ADA8A29C97918B847E78726C65
+      5E5853546175838683807C7A78797B00027D000C7E82888C8D8C8980756C6A6E
+      02720008706D6E72767A7B7A04790005777573757900027D00037C7E82000286
+      01880189028A00138B8C8F92979DA2A4A29D948C8A8D8F919293940002930294
+      00079593929193959600039802970005969594918F00038D028C018B028C018B
+      028900168C92989B99959089817A7573726F6E6D6E6F7173716F026D00057074
+      75727000046D016C026A016C016F0270000E6D6B686766656465676C70716E6B
+      026901680169026A076B016A02690268056700096665646261605E5B5A000259
+      015803570004585C5F6105620361000B5F5B5856585953443020170002150008
+      1617191A1B1D1F210223000A242627292A2C2D2E2F300231000001F102F002EF
+      02EE02ED03EC02EB02EA01E901E802E702E60006E5E4E3E2E1E002DF0029DDDC
+      DAD8D6D4D2D0CDCAC7C3C0BCB8B4AFAAA59F9A948E87817B756E68615B55535A
+      6D808684817D7A00027800077A7C7E7D7F858A00028C000E8A83796E696A6E6F
+      6E6D6F727679027A0379000D7877757475797C7D7C7D82868800038901880289
+      000E8B8E949CA1A4A39F978F8B8D8F91029201910290019202940192028F0003
+      93969800039A0005999896939000028E00038F8E8F00039000038F8D8A000286
+      000F8990969A9995918B847D79777674730002720005737475737000026E0005
+      707476747000046E016D026C016D016F027000046F6E6C6A0269026A00056C6F
+      7374730002710270046F046E026D016C016B026A036904680267026600036564
+      620003610260025F0004606162630664000C6362605C58565758503F2A1C0216
+      00171718191B1C1D1F202223252627292A2C2D2E2F3031323300000001F102F0
+      03EF02EE02ED02EC02EB02EA02E901E802E701E601E502E4002FE3E2E1E0DFDE
+      DDDBD9D7D6D4D1CFCCC9C5C2BEBAB6B2ADA8A29C97918A847E78716B645E5753
+      56657A8586827F7B79000278017B027D00037E828800028C00088A867D726A69
+      6B6D026E0010707376797A797A7B7A79787776777A7C037D0181018403860185
+      03840005878C93999F0002A200039F999200038E0190029100188F8E8F929596
+      9491929598999A9997969593918F90929392049100038F8B870002830003878E
+      94000299000996918C867F7B7978770006760174017202700005717476747000
+      026E016F016E046D00036E707100027201710270017101720273017503760275
+      01740273017202710370026F026E00036D6C6B00026A01690768026701660465
+      0364026302640765000C64635F5A555455544A37241A02170012181A1B1C1E1F
+      202123242627292A2C2D2E2F023102330134000002F102F003EF02EE02ED02EC
+      02EB02EA02E901E802E701E601E502E4002EE3E2E1E0DFDEDCDAD9D7D5D3D0CD
+      CAC7C4C0BCB8B4AFAAA59F9A948D87817B746E67615A55545E72818584807C79
+      0278017A037D000C80868B8C8B8881776D696A6C026E00056F7275797A00027B
+      00097C7B79787978797C7E00037F00038183840002850284001285878B8F9498
+      9CA0A19E97908C8B8A8C8E8F0290000791949799989697000298000497969491
+      039000088F9093969593908F029000118E89838082868C92989A97928D87807B
+      7900037701780277000C76757473727172747573706F026E00096D6C6D6E7072
+      747577000478057903780177027602750003747372000371000B706F6E6D6B69
+      68666463620005610262000461605F5E035D025C035D025F0160056100055F5D
+      59534F00024E00054B402E201A00021900051A1C1D1E20000222000E23252627
+      292A2C2D2E30313233340235000003F102F002EF02EE03ED02EC02EB02EA01E9
+      01E802E702E60005E5E4E3E2E10002E00024DFDDDCDAD8D6D4D1CFCCC9C5C2BE
+      BAB6B2ADA8A29C96908A847E77716A645D575358687B02840007817D7A787779
+      7C00027D00037F858A00028C00088A867D736C6A6B6D026C00046F73787C027D
+      00087E7D7C7B7C7B7C7F028102820003838485000486000D898C8F9296989B9F
+      A09C948D890002880007898D919394969800029901980196029700069592918F
+      8E8F038E0005909495938F00028C00138E8F8D88838183858990969A97938E89
+      827D7A00027900057879787674000273027202710173027401720170026F0008
+      6E6F717477797A7B057D047C017B027A01790178027700147675737271706F6D
+      6B6865625E5A5754514F4E4D034C024D00044E4D4B4A024805470007484A4C4D
+      4F5051000350000B4F4D494441403F3B32251D00021B021C00141E1F20222324
+      252627292A2B2D2E2F31323334350236000004F102F002EF01EE04ED01EC03EB
+      01EA01E903E801E701E602E50025E4E3E2E1E0DFDEDDDBD9D7D5D3D0CDCBC7C4
+      C0BCB8B4AFAAA59F99938D87807A746D676059000254000B5F738185827E7B78
+      77787A00027D00037E848A00028D00078C89827A726D6B00026C00066B6E7378
+      7C7F03800181018003810283038402850003878889000288000D8A8C8F919597
+      9A9D9F9D96908C00038900058D9093959600029700079593929394928E00028D
+      018E018F038E019002920190018D028C028D00048B8886850284000B878E9599
+      98938F8A847F7C00027B00067A79777573720573000574757776750002760005
+      77787A7C7E00027F0480027F017E037D00187C7B7A79777675736F6A68676663
+      5E58534D48423D3935320230012F022E022F00063031302F2E2D052C00062D2E
+      2F3133350536000435343330022E001C2C2A25201D1C1D1E1F20212224252627
+      28292B2C2D2E30313233343502360137000001F203F103F002EF02EE03ED01EC
+      02EB02EA01E902E802E70005E6E5E4E3E20002E102DF0028DEDCDAD8D6D4D2CF
+      CCC9C6C2BEBAB6B1ADA7A19B95908A837D76706A635C5653596B7D85837F7C78
+      0277000E797B7C7D81888D8E8D8B87817A73046D00066F72777B7D7E027F0280
+      0281028202810482018502860283000E8586888C9194969A9D9F9B958E890287
+      0010888A8D90939493918F909192918C8B8C038F0190029102920005918F8E8C
+      8A0004890006878482858C930298000C94908B86817E7D7C7B7A787702750176
+      017702780003797A7C00027E027F0280028105820481000F807F7D7C7B7A7775
+      726F6D69645B5100024D000C4C48413B342E2A25221F1D1C061B021C031D051C
+      031D021E0120012102220723012203210120011F021E011F0120022100032223
+      24000226000E27292A2B2D2E2F3031323334353602370138000002F203F102F0
+      02EF03EE02ED02EC03EB01EA01E902E801E702E60033E5E4E3E2E1E0DFDEDDDB
+      D9D7D5D3D0CECBC7C4C0BCB8B4AFAAA49E98928C868079736C665F5853556478
+      8485817D797776777900027A00037D848B00028E000D8D8A8681797270717071
+      727476000278027900067A7B7C7D7E7D027C017D037C00037F817F00027C0005
+      7E7F82878C00028F000793999E9D988E8600028100148284888D90918E8B8C8D
+      9092918D8B8C8E8F909302940293000792908D8A878688000289000F86828184
+      8A909697938F8B8783807F000280017F017E037D017E01800281000382838400
+      02850186058504840183028202810010807D7976736F69635C56524D463B2F2B
+      022C00072A25211D1B191700021604150416021705180419031A021B041C041D
+      041E041F01200221000322232400022501260128022900082A2C2D2E30313233
+      023400033536370002380139000001F301F204F102F002EF02EE02ED03EC02EB
+      01EA01E902E802E701E601E502E4002DE3E2E1E0DFDEDCDAD8D6D4D2CFCCC9C6
+      C2BEBAB6B1ACA6A09B958F89827C756F68625B55545D718185837F7B78000276
+      0007777675767D858900028A00088988847F7774737202710172037300067475
+      76777879037A027B017A027900037B7D7C00037B001A7C7F858889888C939C9D
+      968B837D7C7E81878C8D8C8987888B8F0292000F8F8E8D8E8F9194969594928F
+      8D8B890002870004898A87830281000E84898D9294918D8985807E8083850286
+      0187028602870288068902880387018601850284001982817F7D7B777069625B
+      534A423A332F2C27211A18191A191800021606150216031704180219041A031B
+      031C051D041E031F03200121022203230004242526270228000D2A2B2C2D2E2F
+      3031323334353600023701380239013A000001F302F203F103F002EF02EE02ED
+      03EC02EB01EA01E902E802E701E601E502E4002DE3E1E0DFDEDDDCDAD7D5D3D0
+      CECBC8C4C0BCB8B3AFA9A39E98928C857F78726B645E5753596A7D8584817D79
+      770002760010747270747A7E7F80828485827C76747303710272000371727300
+      02750276000C7778797B7C7B7A797B7C7D7C037B001B7E82858483868E989B94
+      88807C7B7C8085898A89878586888D9091000290028E00088F91949594918F8C
+      028A038B00038C8A8500028200048385878A028B000A898886827D7B7D83878A
+      048B028C018B028C038B028A02890288001A878684817E7A75706B665E534940
+      38312A241F1C1B191816151403150516021703180219031A031B031C031D031E
+      041F0420042103220323022402250226012701280229000D2A2B2C2D2E2F3031
+      323334353600023701380239023A013B000002F303F202F103F001EF03EE02ED
+      03EC01EB01EA02E902E802E70031E6E5E4E3E2E1E0DFDEDDDBD9D6D4D2CFCCC9
+      C6C2BEBAB5B1ABA5A09A948E88817B746E67605A545664788485827F7B787600
+      0275000973706F707375777A7E00028300037F77730003720173027403730474
+      00067577797B7C7B027A00047B7C7D7C037B017C017F03810007858D979B9589
+      8000027C00057D7E81848600028702860004878B8E90028F00138E8D8E909394
+      928F8D8C8B8C8E8F8E8D8A86850002860007858684817B787B00027E00077C7B
+      7D83888B8C00048D018E038D028C028B00188A89888785827E7972695F574E47
+      41393028231F1C1A18170716021703180319021A031B021C031D031E031F0320
+      022104220523042403250326022702280229012A022B012C012D022E00072F30
+      3132333435000236013701380239023A023B013C000003F302F202F103F003EF
+      02EE02ED02EC02EB01EA01E902E803E70006E6E5E4E3E2E102DF0028DDDCDAD8
+      D6D4D1CECBC8C4C0BCB7B3AEA8A39D97918A847E77706A635C56555E72818584
+      817D7976027402750007737173777A7D81000284017E01760271017401750277
+      00037675740004730007727376797C7D7C00027B00037C7D7E00057C000D7E80
+      8283878F979C988D837E7C00027D00057E80838789000388018C028E028D028B
+      00068C9092949290058F00058E8D8C8B8A000389000F87837E756861656D7276
+      7A7E83888B00028C018D028E018F028E00188D8C8B898785827F7A746D655C50
+      4439312B27231F1C191803170116031702180319021A031B021C031D021E031F
+      0220022104220223042404250426042704280329032A022B012C012D022E022F
+      013002310005323334353600023701380139023A023B033C013D000001F402F3
+      03F203F101F003EF02EE03ED02EC02EB01EA01E902E802E70004E6E5E4E302E2
+      002EE0DFDEDDDBD9D7D5D2D0CDC9C6C2BEBAB5B0ABA59F9A948D87807A736D66
+      605A565A6A7C8485837F7A7774727377027800047C8285870289000B867E7671
+      7275787A79767400027202710272000674777B7F807F027D017F0280027F0380
+      000E828486888C91989C9B9288817E7D027E00057F82878B8C00028B000A8D8E
+      8D8B8987888C90930295029301920190058E018D018C038B00138781796B5647
+      4850586069727B81858788898B00028C00148B898784817C77716B645C52483F
+      362D26201C1A02190218011703180219031A021B031C021D031E021F03200221
+      03220223022404250226042704280429042A052B022C022D032E012F02300231
+      02320133013402350136013702380139013A023B023C023D033E000001F403F3
+      03F202F103F002EF02EE03ED02EC01EB02EA01E902E802E70030E6E5E4E3E2E1
+      E0DFDEDCDAD8D6D3D1CECBC8C4C0BCB7B2ADA8A29C96908A837D766F69635D58
+      576274828684817C797502720006777B7D82888D028F000C8E8A827B75737578
+      7A79757104700006727476797C80028201810182038401830182028300158485
+      87898A8D91969B9D9890877F7D7E7F8081868B00028D000B8C8D8E8C8A868487
+      8C9194000396002095938F8D8E909192908E8F908F8981786548312C30363D48
+      54606A707375787C027E00117B77726D665E564E463F362F2924201D1A000619
+      021A031B021C031D011E031F0220032102220323022403250226032702280329
+      022A052B032C052D062E032F0230043101320233023402350136013702380239
+      013A023B023C023D023E033F000002F403F302F203F102F003EF01EE03ED03EC
+      0003EBEAE90003E801E701E602E5002DE4E3E2E1DFDEDDDBD9D7D5D2CFCCC9C6
+      C2BEB9B5B0AAA49F99928C867F79726C66605A565C6D7E8586837E7B77000274
+      0006787C7E82898F02910005908D877F77000273017602790174026F03710006
+      737678797B7E028101820184028600048583818202830015848687898B8F949A
+      9D9A93887E7B7C7E7F8184888900028A018B028D00068A8582868D9203930294
+      0005939190919200049300099596948E867A613F2500021B000B1D21272F3842
+      484B4F545900025D000E59544E47413A332D2824211E1C1B031A021B041C011D
+      021E031F0320022103220223022402250226022703280229032A022B032C042D
+      032E032F0730053104320333033402350236023702380139013A033B023C013D
+      033E033F0340000001F502F403F303F202F103F001EF03EE02ED02EC02EB01EA
+      01E903E801E701E602E5002CE4E3E2E0DFDEDCDAD8D6D4D1CECBC8C4C0BBB7B2
+      ACA7A19B958F89827C756F68635D57596679848685817C7802740006797E7F81
+      878E0391000C8F8B82797372747778747071037201740177037800057B7F8183
+      85000287018601840282000F83848587888A8C8F93979B9A93877D00027A0010
+      7C7F828485848587898D8C898482868D028F028E019203940293001092939599
+      9A9B9A97928B7B5E3A20161402150009181A1E2326282B2E3200023600093431
+      2D292623211E1D00051C021D031E011F03200221022202230324022503260227
+      03280129022A032B022C022D032E032F03300431043206330534063503360337
+      03380239033A013B023C023D033E023F03400441000002F502F402F303F202F1
+      03F002EF03EE01ED03EC02EB01EA01E902E802E70029E6E5E4E3E2E1E0DFDDDC
+      DAD7D5D2CFCCC9C5C2BDB9B4AFA9A49E98928B857E78716B655F595761748200
+      0286000C827D787473787E7F80848B9002920007918E88807975740002750003
+      73717200027301720174027602750005787C7F82850003860017858483848587
+      88898B8C8D8F929699948A807C7B7D8083000284000B838486888B8C89858488
+      8D00038E019002930194029500049496989C039F000A9D9A958C7857341E1614
+      0215011602170006191A1B1C1E1F03210120011F021E051D021E021F02200221
+      02220323012402250326022702280329022A022B022C032D022E032F02300331
+      023203330434033503360A3706380439043A023B033C023D023E033F02400541
+      0442000002F503F402F303F202F102F003EF02EE01ED04EC02EB01EA01E902E8
+      02E70028E6E5E4E3E2E1E0DEDDDBD8D6D3D1CECBC7C3BFBAB6B1ACA6A09A948E
+      88817B746E68625C585D6D7E0286000C837E797573777D7F8082898F0392000B
+      908D878079747372706F710003720003737475000272000574777B7E81000282
+      0181038001810183028401850286000987898C90959690888100027E01810183
+      02840005838485888C00028E00048B8A8D9002920016939493909195999B9EA0
+      A2A3A2A19E9B94876C492C1C021702180319021A021B021C011D041E031F0220
+      022102220223022403250226022702280129032A022B022C022D032E022F0230
+      033102320333023403350336033703380539093A083B053C033D043E033F0240
+      044104420643000003F502F403F302F203F102F002EF03EE03ED02EC01EB02EA
+      01E902E802E70030E6E5E4E3E1E0DFDDDCD9D7D5D2CFCCC8C5C1BCB8B3AEA8A3
+      9D97918A847E77716A655F595A67798486847F7B7776787C0280000481878E92
+      02930007918F8B857D757100036F01700371000B72737472717275787A7B7C00
+      037B00037D7F800002810180027F000E80828587898F95948E857F7E81820284
+      000B838485898E92949392949500049600069492959CA1A303A502A4000AA29F
+      9A8E795939251C1A021B021C021D021E021F0420022102220223022403250126
+      022702280329022A022B022C012D032E022F0230023103320233033402350336
+      033702380339043A043B033C063D0D3E063F05400341054205430744000001F6
+      02F503F403F303F202F102F002EF03EE02ED02EC02EB01EA01E902E802E7002D
+      E6E5E4E3E2E1DFDEDCDAD8D6D3D0CDCAC7C3BEBAB5B1ABA5A09A938D87817A74
+      6D68625B5A6275828685817E7A00027900077C7F8081858C9100029300089291
+      8D88807872700272017301720271017201730374017501770279017803770003
+      787B7E000280017F017D027B00037C7F8200028400098991948F86807E808200
+      0384000685878A8E9395039602970198019A029C00049DA0A4A702A8000CA7A6
+      A5A4A29C917D62432D21021E021F032002210222032302240225022603270228
+      0229022A022B022C022D022E022F023002310232023303340235023602370338
+      0239033A033B023C033D043E043F0640104108420543074409450244000002F6
+      03F502F402F303F203F102F002EF03EE02ED02EC02EB01EA01E903E80028E7E6
+      E5E4E3E1E0DFDDDBD9D7D5D2CFCBC8C4C0BCB7B3ADA8A29C96908A847D77706A
+      645E5B60707F0286000783807D7B7A7B7E0002810011848A90939493918F8A83
+      7A74727475767500027301740175027601770179037A01770375000376787C00
+      027E017D017C027B00037C7E810002820006868F94918A850282000383858600
+      02870010898C8F91939496989A9D9FA2A4A6A7A804AA000DA9A7A5A19B8F7D63
+      47312622210002220223022402250226032702280229022A022B022C022D022E
+      022F0230023102320233023402350236033702380239023A033B033C033D033E
+      033F034003410342074319440A450B460345000002F603F503F402F302F203F1
+      03F002EF02EE02ED03EC02EB01EA01E902E80029E7E6E5E4E3E2E1E0DEDCDAD8
+      D6D3D0CDCAC6C2BEB9B5B0AAA59F99938D87807A746D67615D5F6A7982000284
+      0003817E7C00027B017E0281000483878E930295000B93908B837A7573757778
+      77000275017603770008787A7C7B7977757402750176017A067C000F7D7F8283
+      8489919695918B8684858800038B000E8E919395979A9EA0A2A5A7A8AAAB03AC
+      02AB000BAAA9A69F9485735E4734290003250226022702280229022A032B022C
+      022D022E022F0230023102320233023402350236023702380239023A033B023C
+      023D023E033F03400341034203430444034507462547044807470346000001F7
+      02F603F502F403F301F204F102F003EF02EE02ED03EC01EB02EA01E902E80031
+      E7E6E5E4E3E1E0DFDDDBD9D7D4D1CECBC8C4C0BBB7B2ADA7A29C96908A837D77
+      716B65605F636E777D80817F7D7B7C7E820002830003858C9200029600059592
+      8C827900027401760377000476787A7B037A00077B7C7B797675760002770178
+      017C027E00037D7F800002810006838688898E95029A001497918B888A8E9293
+      94979A9D9FA1A3A6A8A9AAAB02AC02AD000EAEADACABA8A49B8B76604E3F332C
+      02280229022A022B022C022D022E022F02300231023202330234023502360237
+      02380239023A023B033C023D023E023F02400341024203430344034503460347
+      054805491B4A134906480347000001F703F602F503F403F302F203F102F002EF
+      03EE02ED02EC02EB01EA01E903E8002AE7E5E4E3E2E1E0DEDDDBD8D6D3D0CDC9
+      C6C2BDB9B4AFAAA49E99938D87817B746E6863605E61676E757A037B00037C7E
+      82000384000B8A91969796948F847B767700027902780003797B7E0002800003
+      7F7D7C00027D017C027B017C027D00037E808200028401860188028900178B8D
+      8F91959A9D9E9C98949294989B9D9EA1A4A6A7A8A90002AB01AC04AD03AE000C
+      ADAAA49C907E67503F36302D032C012D012E032F023001310232023303340235
+      0236023702380239023A023B023C023D023E023F024002410342024302440345
+      0346044702480349044A054B044C074D084E084D074C104B044A054903480000
+      02F703F602F502F403F303F202F103F002EF02EE02ED03EC02EB01EA01E902E8
+      0025E7E6E5E4E3E2E1DFDEDCD9D7D4D1CECBC7C4BFBBB6B2ACA7A19C96908A84
+      7E78726C67625D00025A000F5D63696E72777A7D818485848990950002980008
+      97928B837F808180027E00037F818500038701850283018403850486000F8789
+      8B8C8E909192939496979A9DA00002A1019F029D00079EA0A2A4A5A7A90002AA
+      02AB02AC01AD03AE000DADAEADABA69C8E7D6B5645393200032F023002310132
+      0233013402350236023703380239023A023B023C023D023E023F024002410242
+      0343024402450346024702480349034A044B024C034D054E054F075007510850
+      0B4F034E074D074C034B044A0449000001F802F703F602F503F403F302F202F1
+      03F002EF02EE02ED03EC02EB01EA01E902E80026E7E6E5E4E2E1E0DFDDDAD8D6
+      D3D0CDC9C5C1BDB8B4AFAAA49F99948D88827C76706B65605B5702550008575B
+      626A72787E8302860009898F95999A9997938E00028C00088B89878687898B8C
+      038B00048A8B8D8E068F019001910293019502960197029900069A9C9D9FA1A2
+      05A30006A4A5A6A8A9AA02AB02AC03AD000FAEADACAAA8A39B8F7D6855473D36
+      330002320133023401350236013702380239023A023B023C023D023E023F0240
+      024102420243024404450246024702480349024A034B024C034D034E044F0450
+      03510752085302540A53075207510350044F054E064D024C044B044A000001F8
+      03F702F603F502F403F302F203F102F003EF02EE02ED02EC02EB01EA02E90029
+      E8E7E6E5E4E3E2E1DFDEDBD9D7D4D1CECBC7C3BFBBB6B2ADA7A29D97918B8580
+      7A756F6A645F5A5652000250000C5259636C757E8587898F9599029B00149A98
+      979594908B8887888A8B898887898A8D9093069401950196029702980199019A
+      029B00069C9D9FA0A1A203A403A50004A6A7A9AA03AB01AD02AC000FABAAA8A5
+      A09992877A6A58483D38360002350003363738000239013A023B023C013D023E
+      023F0240024102420343024402450246034702480249024A024B034C024D024E
+      044F025002510452055304540655055609570756045508540553035202510550
+      034F054E024D034C024B034A000002F802F703F603F502F403F303F202F102F0
+      03EF01EE03ED02EC02EB01EA02E90036E8E7E6E5E4E2E1E0DFDDDAD8D6D3D0CD
+      C9C5C1BDB9B4AFAAA5A09B958F89847F79746E69645F5A56514E4D4E535A6370
+      7D84888E9599039C029B00049A97928B02870189028B018902860005888B8F92
+      95000696029702980199039A029C00049D9E9FA002A20003A3A4A50004A601A7
+      02A802A90012A8A7A5A39F9A948C82766B60554B423C3938023900043A3B3C3D
+      023E013F0240014102420243024402450246034702480249024A024B034C024D
+      034E024F0350035102520353035402550456075704580959025A0359035A0459
+      075806570256045503540353035203510450044F024E024D034C034B000002F8
+      03F703F603F502F403F302F202F103F002EF02EE02ED02EC03EB01EA01E902E8
+      0029E7E6E5E3E2E1DFDEDCD9D7D4D1CECBC7C4BFBBB7B2ADA8A39E98938D8883
+      7D78736E69645F5B56524F00024C000A4D525C6B767F88939A9D029E029D0004
+      9C9B9792029000049293949202900004919395970498039702980299049A019B
+      029C019D019E039F01A102A203A30014A2A09F9E9C9996928D87807870665C53
+      4B45413E033C013D013E023F0003404142000243014402450146024702480249
+      024A024B034C024D024E024F0350025102520353035402550356025705580259
+      055A075B0B5C015D015C025D095C055B045A0559025804570256035502540553
+      025203510250024F034E024D024C024B000004F802F703F602F503F402F303F2
+      02F103F002EF02EE03ED02EC01EB01EA02E9002CE8E7E6E5E4E3E1E0DFDDDBD8
+      D5D2D0CDC9C6C2BDB9B5B0ABA6A19C97918C87827D78736E6965605C5854504D
+      024B00084F57606A7889979E02A0039E019D019B0499029A0199019807970296
+      05940195029601970196029502940395019406930013928F8B87827D77716B65
+      5F59544E494541403F00023E00083F40414243444546024701480249024A014B
+      014C034D024E014F0250045102520253035403550256035703580359035A025B
+      055C025D085E0F5F0160095F045E065D025C045B025A03590358025703560255
+      04540253035202510250034F024E014D034C000004F802F703F603F502F403F3
+      03F202F102F002EF03EE02ED02EC01EB02EA02E9003BE8E7E6E5E3E2E1E0DEDC
+      D9D7D4D1CECBC8C4C0BCB7B3AEAAA5A09B95908B86817D78736E6A65615D5956
+      53504D4C4D505662768B999F9E9C9A999700029602950294000D9392918F8D8C
+      8B8A898887868400028302820008838586878482807D037C00047A7774720271
+      001072716F6B66615C57524E4B48464443410340014102420143024501470248
+      0004494A4B4C024D014E024F0150025102520253015403550356035703580459
+      025A025B035C035D035E055F05600661176206610460055F025E025D035C025B
+      045A0259025803570356035501540253035202510250014F024E034D014C0000
+      01F903F803F703F603F502F403F302F202F103F002EF03EE02ED02EC01EB01EA
+      02E9002FE8E7E6E5E4E3E2E1DFDDDAD8D5D3D0CDCAC6C2BEBAB6B1ADA8A39E9A
+      95908B86817D7874706B67635F5C595653504E00024D00045360758702900019
+      8C88858281807F7D7B79787674716E6C6B696766656462616000025F00096063
+      656663605D5958000257000655524F4D4C4D024E00074D4B4846444241000540
+      000F4142434445464748494A4B4C4D4E4F000250015101520253015402550156
+      025702580259035A035B035C035D045E035F0360046103620563066418650664
+      0463046203610360025F035E025D035C035B025A025902580357035601550254
+      0353025201510250024F034E014D000002F903F803F702F603F503F403F301F2
+      04F102F002EF03EE02ED02EC01EB01EA02E901E802E60031E5E3E2E1DFDEDCD9
+      D7D5D2CECCC8C4C1BDB9B4B0ACA7A29E9994908B86827E7975706D6965625F5C
+      595654514F50545F6B00027300166E686461605E5C5B59575553514F4D4C4A48
+      47464544024301420141024200074445464543424000043F013E023D00033C3D
+      3E00063F024000164142434445464748494A4B4C4D4E4F505152535455560257
+      02580159025A015B025C025D035E045F02600461046203630464046504660967
+      106809670666046503640363036202610260035F025E025D045C025B025A0259
+      025803570156025502540153025202510350024F024E000003F903F803F703F6
+      02F503F402F302F203F103F002EF02EE02ED03EC0004EBEAE9E802E7002DE6E4
+      E3E2E0DFDDDBD8D6D3D0CDCAC7C3BFBCB8B4AFABA6A29D9995908B87837F7B76
+      736F6B6865625F5C5A5855000253001655595B5A5753514E4D4C4A4948464544
+      4241403F3E3D023C013B033A0539013A013B063A033B033C00063D3E3F404142
+      02430145024601480149024A000E4B4D4E4F50515253545556575859025A015B
+      015C025D015E025F0260026102620363046402650466046704680769086A136B
+      096A0469036805670266036503640163036203610260035F025E025D025C025B
+      025A0259035801570256015502540253025202510250034F000001FA03F902F8
+      04F702F603F502F403F302F203F102F002EF03EE02ED02EC01EB02EA0043E9E8
+      E7E6E5E3E2E1E0DEDCD9D7D5D2CFCCC9C6C2BFBBB7B3AFAAA6A19D9994908C88
+      84807C7975716E6B686663615E5C5A585756555352504E4D4B4A494847464544
+      4300024201410240023F013E033D083C033D023E023F02400004414243440245
+      01470148024900104A4B4C4D4E4F5051535455565758595A025B00045C5D5E5F
+      0260016102620163026402650266026703680469056A056B076C086D126E066D
+      076C046B046A0369036802670366036502640263026203610260025F025E025D
+      025C025B025A0159025802570256015503540253025201510250024F000001FA
+      04F902F803F703F603F502F403F303F202F102F003EF02EE02ED01EC01EB02EA
+      02E90041E8E7E6E4E3E2E1DFDDDBD9D6D4D1CECBC8C5C1BEBAB6B2AEAAA5A29E
+      9995918E8A86827F7B7875726F6C6A676563615F5D5B59585655535251504F4E
+      4D4C4B4A49000248014702460245014403430A42014302440245024600034748
+      4900024A00124B4C4D4E4F505152535455565758595A5B5D025E00065F606162
+      636402650166026701680269026A036B046C046D036E086F09700E7100037071
+      700002710770056F056E046D036C036B046A0269036803670166036502640263
+      026202610260025F025E025D015C025B025A0259015802570256025502540253
+      015202510250014F000002FA03F904F801F704F603F502F402F303F202F103F0
+      02EF02EE02ED02EC01EB02EA0045E9E8E7E6E5E3E2E1E0DEDCDAD8D5D3D0CDCB
+      C7C4C1BDBAB6B2AEAAA6A29E9B97938F8B8885817E7B787673706E6C6A686664
+      62605F5D5C5A595857565554535251504F4E4D00024C024B014A03490A480149
+      024A024B024C00034D4E4F00025000165152535455565758595A5B5C5D5E5F60
+      6162636465660267000368696A00026B026C026D026E026F0370037106720973
+      14740B73067203710570036F036E036D036C026B036A02690368026702660265
+      02640263026202610260025F015E025D025C015B025A02590258025702560155
+      02540253015202510250000003FA03F903F803F702F603F503F402F303F202F1
+      03F001EF03EE03ED01EC01EB02EA0041E9E8E7E6E4E3E2E1DFDDDBD9D7D5D2CF
+      CDCAC7C4C0BDBAB6B2AEABA7A3A09C9995918E8B8784817F7C79777573716F6D
+      6B696765646361605F5E5D5C5B5958575600025500035453520002510250024F
+      094E034F0250015102520003535455000256000E5758595A5B5C5D5E5F606162
+      63640265016601680269016A016B026C00036D6E6F0002700271027202730374
+      047506761D770776077503740373047203710370036F036E026D046C026B016A
+      0269036802670266026502640163026202610160025F035E015D025C025B025A
+      0159025802570156025502540153025202510150000004FA03F903F802F703F6
+      03F503F402F302F203F102F003EF02EE02ED01EC01EB02EA0041E9E8E7E6E5E4
+      E3E2E0DFDDDBD8D6D4D2CFCCCAC6C3C0BDB9B6B2AFACA8A5A19E9B9794918D8B
+      888583807E7B7977767472706E6C6B6A68676665646362605F5E5D00025C0004
+      5B5A595802570256065502540555025601570158025900035A5B5C00025D000A
+      5E5F606162636465666702680006696A6B6C6D6E026F01700271000372737400
+      02750276027703780679077A087B0F7A08790678047703760475037403730272
+      03710370026F036E036D026C016B026A03690268026701660265026402630262
+      01610260025F025E025D015C025B025A02590158025701560255015402530252
+      0251000005FA02F903F803F703F602F503F403F302F203F102F002EF03EE02ED
+      01EC01EB02EA0040E9E8E7E6E5E4E3E1E0DEDCDAD8D6D4D1CECCC9C6C3C0BDBA
+      B6B3B0ADAAA6A3A09D999693918E8B89868482807E7C7A7877757372716F6E6D
+      6C6B6A6867666564026300046261605F025E025D025C045B015A055B025C025D
+      015E025F000360616200026300096465666768696A6B6C00026D016E016F0270
+      00057172737475000276027701780279017A047B037C067D0F7E0B7D087C057B
+      037A0579047803770376037502740273037202710370026F036E026D016C026B
+      026A0269036801670266026502640263016202610260015F025E025D015C025B
+      015A025902580257015601550254025301520251000006FA02F903F803F703F6
+      02F503F402F303F202F103F001EF03EE02ED01EC02EB02EA0043E9E8E7E5E4E3
+      E2E1DFDDDBDAD7D5D3D1CECCC9C6C4C0BEBAB7B4B2AFABA8A5A29F9C99979492
+      908D8B89878583817F7E7C7A79777675747271706F6E6D6C6B6A696867000266
+      0165026401630562026106620263026401650166026701680169026A00036B6C
+      6D00026E00046F70717202730003747576000277000378797A00027B027C027D
+      027E037F0480088103820A810A80047F057E057D037C037B047A037903780377
+      0276027503740273037202710270026F026E026D026C026B026A036901680267
+      0166026502640263016202610160025F025E015D025C025B025A015901580257
+      025601550254025301520151000002FB04FA03F903F803F702F603F502F403F3
+      02F203F103F002EF01EE03ED01EC01EB02EA003DE9E8E7E6E5E4E3E2E1DFDDDB
+      D9D7D5D3D0CECCC9C7C4C1BEBBB9B6B3B0ADAAA8A5A29F9D9A989693918F8D8B
+      8A8886848281807E7D7C7A797877767574000272000571706F6E6D00026C016B
+      026A036909680269026A026B016C026D016E026F017002710005727374757600
+      02770178027900037A7B7C00027D027E017F028001810382038305840C850984
+      0683048204810580047F037E037D037C037B037A027904780277027602750274
+      0373027202710270026F026E016D036C026B016A026902680267026601650264
+      0163026202610160025F025E015D025C015B025A025902580157015602550154
+      02530252000001FC03FB02FA04F903F802F703F603F503F402F303F202F103F0
+      02EF02EE02ED01EC01EB02EA003EE9E8E7E6E5E4E3E2E0DEDDDBD9D7D5D3D1CE
+      CCCAC7C5C2BFBDBAB8B5B2AFADAAA8A5A3A09E9C9997969492908E8D8B898886
+      85848281807F7E7D7C7B797802770003767574000273017202710270036F026E
+      076F0270027101720273017402750176027701780179027A017B017C027D027E
+      017F018002810182028302840285038603871188068706860485038404830482
+      04810380027F037E037D037C037B037A03790178037701760275037402730272
+      01710370026F016E026D026C026B026A01690268016702660265026401630262
+      01610260015F025E025D015C025B025A01590258025701560255015402530152
+      000001FC03FB03FA03F903F803F703F603F502F403F302F202F103F002EF02EE
+      02ED01EC02EB01EA01E902E8003FE7E6E5E3E2E1E0DEDDDBD9D7D5D3D1CFCDCB
+      C8C5C3C1BEBCB9B7B4B2AFADABA8A6A4A2A09E9C9A9897959392908E8D8B8A89
+      88878584838281807F7E7D7C7B00027A01790278027703760875037602770378
+      0179027A017B027C017D027E017F028001810282028301840185028601870288
+      0389048A038B0A8C078B048A0589048803870386048503840383028203810280
+      037F037E037D047C017B037A0279027802770276027502740273027202710270
+      026F016E026D026C026B016A0269026802670166016502640263026201610260
+      015F025E025D015C025B025A0159025801570256015502540253000002FC03FB
+      03FA03F903F803F703F603F502F403F302F202F103F002EF02EE01ED02EC02EB
+      01EA01E902E80039E7E6E4E3E2E1E0DEDCDBD9D7D5D4D2CFCDCBC9C7C5C2C0BE
+      BCB9B7B5B3B0AEABAAA8A6A4A2A09E9D9B9A989795949291908F8E8C8B8A8988
+      870002850004848382810280017F027E027D047C067B037C027D037E027F0280
+      018102820283018402850186028702880189028A028B028C038D048E0D8F068E
+      038D038C048B048A0389038803870386038503840283028202810280037F037E
+      037D027C037B027A0279017803770276017502740273027202710270016F026E
+      026D026C016B026A0269016802670266026501640263016202610160025F025E
+      015D025C025B015A0259025801570156025502540153000002FC04FB03FA03F9
+      02F804F703F602F503F402F303F201F103F003EF02EE01ED02EC02EB003EEAE9
+      E8E7E6E5E4E3E2E1DFDEDCDBD9D7D6D4D2D0CECCCAC8C6C4C1BFBDBBB9B7B5B3
+      B1AFADABAAA8A6A4A3A1A09E9D9B9A99979695949391908F8E8D8C8B028A0004
+      898887860285028402830582048103820283038402850286028703880189028A
+      018B028C028D038E028F029005910D9206910390038F028E048D048C038B028A
+      0289048801870386038502840283028202810380037F027E037D027C027B027A
+      0279027802770276027502740173027202710270016F026E026D026C016B026A
+      0269016802670266016502640263016202610260015F025E015D025C025B015A
+      015902580257015602550254000004FC03FB02FA03F903F804F702F603F502F4
+      03F303F202F103F001EF03EE01ED01EC03EB003DEAE9E8E7E6E5E4E3E2E1E0DE
+      DDDBD9D8D6D5D3D1CFCDCBC9C7C5C3C1BFBEBCB9B7B6B4B3B1AFADACAAA9A7A6
+      A4A3A1A09F9D9C9B9A999896959493929100029000048F8E8D8C028B028A0289
+      0588048705880389028A028B028C038D028E018F029003910392039303940295
+      0194089508940393039203910290048F038E038D028C028B038A038902880187
+      0386028502840283028203810280037F027E037D027C017B037A027901780277
+      0276027502740173027202710170026F026E026D016C026B026A016902680267
+      0266016502640163026201610260025F015E025D015C025B025A025901580157
+      025602550154000001FD03FC03FB03FA03F902F804F703F603F502F403F303F2
+      02F102F001EF03EE01ED02EC02EB01EA01E902E80039E7E6E5E4E3E2E1E0DEDD
+      DBDAD8D7D5D4D2D0CECCCBC9C7C6C4C2C0BEBCBBB9B8B6B5B3B1AFAEACABAAA9
+      A7A6A5A3A2A1A09F9E9C9B9A999897000296000395949300029201910290028F
+      058E068D048E038F029003910392029303940395039604970B98079703960395
+      03940393029203910290038F038E028D028C028B038A02890188038702860285
+      02840283028202810280037F027E037D027C027B017A03790278017702760275
+      01740273027201710270026F026E026D016C026B016A02690268026701660265
+      01640263026202610160015F025E025D025C015B015A02590258015701560355
+      000001FD03FC03FB04FA03F903F803F703F603F502F403F302F202F102F003EF
+      02EE01ED01EC03EB0005EAE9E8E7E60002E50037E4E3E2E1E0DFDDDCDAD9D7D6
+      D5D3D1CFCECCCBC9C7C6C4C2C0BFBDBCBAB9B8B6B4B3B2B0AFAEACABAAA9A8A7
+      A6A5A3A2A1A09F9E9D9C9B00029A019902980197029602950494039302920693
+      039403950396049703980399079A059B019A029B089A02990398039703960395
+      02940293039202910290028F028E028D028C038B028A01890388018703860185
+      02840283038202810280027F037E027D027C027B027A01790278027702760275
+      01740273017202710270026F026E016D026C026B016A02690168026702660165
+      02640263016202610260015F025E015D025C025B015A02590158025701560255
+      000001FD03FC05FB03FA03F902F804F703F602F503F402F303F202F102F003EF
+      02EE01ED01EC03EB0004EAE9E8E702E60031E5E4E3E2E1E0DFDEDCDBD9D8D7D5
+      D4D2D1CFCECCCBC9C8C6C5C3C1C0BFBDBCBBB9B8B7B5B4B3B2B1AFAEADACABAA
+      A9A8A70002A50006A4A3A2A1A09F029E019D029C029B029A03990B980599039A
+      069B049C0A9D039E049D079C029B039A02990298039702960395029402930292
+      02910290028F028E028D028C028B028A02890288028702860285028402830282
+      02810280027F037E027D017C027B027A02790178027702760275027402730172
+      02710170026F026E026D026C016B026A02690168026701660265026401630262
+      02610160025F025E025D015C015B025A0259015802570256000002FD04FC03FB
+      03FA03F903F803F703F604F501F403F303F202F102F003EF02EE01ED01EC02EB
+      02EA0003E9E8E70002E60030E5E4E3E2E1E0DFDEDDDCDAD9D7D6D4D3D2D0CFCE
+      CCCBC9C8C6C5C4C2C1C0BFBDBCBBBAB8B7B6B5B4B3B2B1B0AFAEADAC02AA0004
+      A9A8A7A602A501A402A301A201A102A0039F039E0E9D049E0A9F0DA0059F049E
+      049D039C029B029A0299039801970296029502940293029202910290028F028E
+      028D028C028B028A0289028801870286028501840383028202810280037F027E
+      027D027C027B017A0279017802770276027502740173027202710270016F026E
+      026D016C026B026A0169026802670166026502640163026202610160025F015E
+      025D025C015B025A0159025801570256000004FD03FC02FB05FA02F903F803F7
+      04F602F502F403F302F203F102F003EF02EE01ED01EC03EB0003EAE9E80002E7
+      0006E6E5E4E3E2E102E0001EDFDDDCDBD9D8D7D6D4D3D2D1CFCECDCCCAC9C8C6
+      C5C4C3C2C0BFBEBDBCBA02B90004B8B7B5B402B30003B1B0AF0002AE0003ADAC
+      AB0002AA01A902A801A701A602A503A403A304A203A101A206A10EA208A305A2
+      05A102A0059F029E029D029C039B029A02990198029702960295029402930292
+      02910290028F028E028D018C028B028A02890288018702860285038401830282
+      02810280027F037E017D027C027B027A01790278027702760275017402730272
+      02710170026F026E016D026C026B026A01690268016702660265016402630262
+      01610260015F025E025D015C025B015A025902580257000004FD04FC04FB02FA
+      03F903F803F703F603F502F403F302F202F103F002EF03EE01ED01EC02EB02EA
+      01E901E802E70005E6E5E4E3E20002E1002BE0DFDEDDDCDBD9D8D7D6D5D4D2D1
+      D0CFCDCCCBCAC9C8C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B20002B1
+      01B001AF02AE01AD01AC02AB01AA02A903A804A706A61CA505A405A302A202A1
+      03A0029F029E039D029C029B029A019902980297029602950294019302920391
+      0190028F028E028D028C018B038A018902880287028601850284028302820281
+      0280027F027E027D027C027B017A027902780277017602750274027302720271
+      0170026F016E026D026C026B016A026902680167016602650264026301620261
+      0160025F025E025D015C025B015A025901580257000005FD03FC04FB03FA02F9
+      04F803F702F603F502F403F303F202F103F001EF03EE02ED01EC01EB03EA01E9
+      01E802E70004E6E5E4E302E20003E1E0DF0002DE001DDDDBDAD9D8D7D6D5D4D2
+      D1D0CFCECDCCCBCAC9C8C6C5C4C3C2C1C0BFBE0002BD0007BCBBBAB9B8B7B600
+      02B501B401B302B201B101B002AF02AE02AD02AC04AB03AA10A90BA804A705A6
+      03A503A402A302A202A103A0029F029E029D029C019B029A0299029802970196
+      029502940293029202910190028F028E028D028C028B028A0289018802870186
+      038502840183028202810280027F027E027D027C027B017A0279027801770276
+      027502740273027201710270016F026E026D026C026B016A0169026802670266
+      016502640263016202610160025F025E015D025C015B025A02590258000006FD
+      03FC03FB04FA02F903F803F704F602F503F402F303F202F103F001EF03EE01ED
+      02EC02EB02EA01E902E80004E7E6E5E402E30003E2E1E00002DF0015DEDDDCDB
+      DAD9D8D7D6D5D4D3D2D1D0CFCECDCCCBC90002C80008C7C6C5C4C3C2C1C002BF
+      0005BEBDBCBBBA0002B901B801B702B601B501B402B302B201B102B003AF03AE
+      05AD07AC0DAB04AA03A905A803A702A602A503A402A302A202A102A0029F029E
+      019D029C029B019A0299029802970196029502940293029202910290028F028E
+      018D028C028B028A0189028802870186028502840283028202810280017F027E
+      027D027C027B027A0279017802770276027501740273027201710270026F026E
+      026D016C026B026A0169026801670266026502640163026201610260025F015E
+      025D025C015B025A01590258000006FD04FC03FB04FA03F902F803F703F602F5
+      03F403F302F202F103F001EF04EE02ED01EC02EB01EA02E901E801E702E601E5
+      02E40003E3E2E10002E00015DFDEDDDCDBDAD9D8D7D6D5D4D3D2D1D0CFCECDCC
+      CB0002CA0007C9C8C7C6C5C4C30002C20004C1C0BFBE02BD01BC02BB01BA01B9
+      02B801B702B602B501B402B302B203B103B004AF06AE07AD08AC04AB02AA01A9
+      02AA02A902A802A702A603A502A402A302A201A102A0019F029E029D019C029B
+      019A0299039801970296039501940293029201910290028F028E028D018C028B
+      028A0189028802870286018502840283028202810280017F037E017D027C027B
+      027A0279017802770276027502740173027202710170026F026E026D026C026B
+      016A0269026801670266016502640263026201610260025F015E015D025C025B
+      025A02590001}
+    PopupMenu = pmTrayIcon
+    Visible = False
+    OnMouseDown = ImageMouseDown
+    OnMouseMove = ImageMouseMove
+    OnMouseUp = ImageMouseUp
+  end
+  object lbVersion: TLabel
+    Left = 320
+    Top = 180
+    Width = 53
+    Height = 15
+    Caption = 'version'
+    Color = clBlack
+    Font.Charset = SHIFTJIS_CHARSET
+    Font.Color = clWhite
+    Font.Height = -15
+    Font.Name = '\82l\82\82o\96¾\92©'
+    Font.Style = [fsBold]
+    ParentColor = False
+    ParentFont = False
+  end
+  object Memo: TMemo
+    Left = 0
+    Top = 0
+    Width = 105
+    Height = 228
+    Align = alLeft
+    PopupMenu = pmTrayIcon
+    TabOrder = 0
+  end
+  object Panel1: TPanel
+    Left = 0
+    Top = 228
+    Width = 427
+    Height = 82
+    Align = alBottom
+    TabOrder = 1
+    object edFound: TEdit
+      Left = 4
+      Top = 8
+      Width = 454
+      Height = 20
+      BorderStyle = bsNone
+      Color = clBtnFace
+      TabOrder = 0
+    end
+    object edWord: TEdit
+      Left = 4
+      Top = 28
+      Width = 454
+      Height = 20
+      BorderStyle = bsNone
+      Color = clBtnFace
+      TabOrder = 1
+    end
+    object edPrev: TEdit
+      Left = 4
+      Top = 48
+      Width = 454
+      Height = 20
+      BorderStyle = bsNone
+      Color = clBtnFace
+      TabOrder = 2
+    end
+  end
+  object btnOK: TButton
+    Left = 192
+    Top = 204
+    Width = 125
+    Height = 21
+    Caption = 'OK'
+    Font.Charset = SHIFTJIS_CHARSET
+    Font.Color = clWindowText
+    Font.Height = -12
+    Font.Name = '\82l\82\82o\83S\83V\83b\83N'
+    Font.Style = []
+    ModalResult = 1
+    ParentFont = False
+    TabOrder = 2
+    Visible = False
+    OnClick = btnOKClick
+  end
+  object MainMenu: TMainMenu
+    Left = 80
+    Top = 40
+    object File1: TMenuItem
+      Caption = '&File'
+      object miHook: TMenuItem
+        Caption = '&Hook'
+        ShortCut = 16456
+        OnClick = miHookClick
+      end
+      object miUnhook: TMenuItem
+        Caption = '&Unhook'
+        Enabled = False
+        ShortCut = 16469
+        OnClick = miUnhookClick
+      end
+      object N2: TMenuItem
+        Caption = '-'
+      end
+      object miConfig: TMenuItem
+        Caption = '&Config'
+        OnClick = miConfigClick
+      end
+      object N6: TMenuItem
+        Caption = '-'
+      end
+      object miDdeTest: TMenuItem
+        Caption = '&Dde Test'
+        OnClick = miDdeTestClick
+      end
+      object miTest: TMenuItem
+        Caption = 'T&est'
+        OnClick = miTestClick
+      end
+      object N1: TMenuItem
+        Caption = '-'
+      end
+      object miExit: TMenuItem
+        Caption = 'E&xit'
+        OnClick = miExitClick
+      end
+    end
+  end
+  object pmTrayIcon: TPopupMenu
+    AutoHotkeys = maManual
+    AutoPopup = False
+    OnPopup = pmTrayIconPopup
+    Left = 144
+    Top = 88
+    object miInstallMODI: TMenuItem
+      Caption = 'MODI\82Ì\83C\83\93\83X\83g\81[\83\8b....'
+      Visible = False
+    end
+    object miGroup: TMenuItem
+      Caption = '\8e«\8f\91\83O\83\8b\81[\83v(&G)'
+    end
+    object miClickOnly: TMenuItem
+      Caption = '\89E\83N\83\8a\83b\83N\8c\9f\8dõ(&N)'
+      OnClick = miClickOnlyClick
+    end
+    object miIncSearch: TMenuItem
+      Caption = '\83C\83\93\83N\83\8a\83\81\83\93\83^\83\8b\83T\81[\83`(&I)'
+      Visible = False
+      OnClick = miIncSearchClick
+    end
+    object miEnablePopup: TMenuItem
+      Caption = '\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82ð\97L\8cø(&E)'
+      OnClick = miEnablePopupClick
+    end
+    object miOCRText: TMenuItem
+      Caption = '\94F\8e¯\83e\83L\83X\83g\82Ì\95\\8e¦(&T)'
+      Visible = False
+      OnClick = miOCRTextClick
+    end
+    object N4: TMenuItem
+      Caption = '-'
+    end
+    object miOption: TMenuItem
+      Caption = '\90Ý\92è(&O)...'
+      OnClick = miOptionClick
+    end
+    object miReadMe: TMenuItem
+      Caption = '\90à\96¾\8f\91\82ð\95\\8e¦(&M)'
+      OnClick = miReadMeClick
+    end
+    object miAbout: TMenuItem
+      Caption = '\83o\81[\83W\83\87\83\93(&V)...'
+      OnClick = miAboutClick
+    end
+    object miCheckLatest: TMenuItem
+      Caption = '\8dÅ\90V\94Å\82Ì\8am\94F'
+      OnClick = miCheckLatestClick
+    end
+    object N5: TMenuItem
+      Caption = '-'
+    end
+    object miClose: TMenuItem
+      Caption = '\83\81\83j\83\85\81[\82ð\95Â\82\82é(&C)'
+      OnClick = miCloseClick
+    end
+    object miReload: TMenuItem
+      Caption = 'DokoPop!\82Ì\8dÄ\8bN\93®(&R)'
+      OnClick = miReloadClick
+    end
+    object miExit2: TMenuItem
+      Caption = 'DokoPop!\82Ì\8fI\97¹(&X)'
+      OnClick = miExitClick
+    end
+  end
+  object BootTimer: TTimer
+    Enabled = False
+    Interval = 1500
+    OnTimer = BootTimerTimer
+    Left = 128
+    Top = 144
+  end
+  object TestTimer: TTimer
+    Enabled = False
+    Interval = 100
+    OnTimer = TestTimerTimer
+    Left = 208
+    Top = 161
+  end
+  object tmMenuClose: TTimer
+    Enabled = False
+    Interval = 10
+    OnTimer = tmMenuCloseTimer
+    Left = 40
+    Top = 168
+  end
+  object tmNotify: TTimer
+    Enabled = False
+    OnTimer = tmNotifyTimer
+    Left = 40
+    Top = 273
+  end
+  object tmPopup: TTimer
+    Enabled = False
+    Interval = 100
+    OnTimer = tmPopupTimer
+    Left = 96
+    Top = 273
+  end
+  object tmMouseMove: TTimer
+    Enabled = False
+    Interval = 100
+    OnTimer = tmMouseMoveTimer
+    Left = 144
+    Top = 273
+  end
+  object tmMODIInstallCheck: TTimer
+    Enabled = False
+    Interval = 3000
+    OnTimer = tmMODIInstallCheckTimer
+    Left = 192
+    Top = 276
+  end
+  object tmMODINotify: TTimer
+    Enabled = False
+    OnTimer = tmMODINotifyTimer
+    Left = 232
+    Top = 273
+  end
+end
diff --git a/DCHookTest/DCHookMain.h b/DCHookTest/DCHookMain.h
new file mode 100644 (file)
index 0000000..7f86722
--- /dev/null
@@ -0,0 +1,197 @@
+//---------------------------------------------------------------------------
+#ifndef DCHookMainH
+#define DCHookMainH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <Controls.hpp>
+#include <StdCtrls.hpp>
+#include <Forms.hpp>
+#include <Menus.hpp>
+#include "../DCHook/DCHook.h"
+#include <ExtCtrls.hpp>
+#include <DdeMan.hpp>
+#include <Graphics.hpp>
+//---------------------------------------------------------------------------
+#include "Util.h"
+#include "StringLib.h"
+
+#define        WM_POPUP        (WM_APP+0x200)
+#define        WM_NOTIFYICON (WM_APP+0x201)
+#define        WM_TOGGLE       (WM_APP+0x202)
+#define        UM_SHORTCUT     (WM_APP+33)
+#define        WM_MOVESEND     (WM_APP+0x208)  // DCH_MOVESEND\82Ì\91ã\82í\82è\82ÉPostMessage\82Å\91\97\82é
+
+class TDCHookMainForm : public TForm
+{
+typedef TForm super;
+__published:   // IDE \8aÇ\97\9d\82Ì\83R\83\93\83|\81[\83l\83\93\83g
+       TMainMenu *MainMenu;
+       TMenuItem *File1;
+       TMenuItem *miExit;
+       TMenuItem *miHook;
+       TMenuItem *miUnhook;
+       TMenuItem *N1;
+       TMenuItem *miTest;
+       TMemo *Memo;
+       TSplitter *Splitter1;
+       TPaintBox *PaintBox;
+       TPanel *Panel1;
+       TMenuItem *miDdeTest;
+       TEdit *edFound;
+       TEdit *edWord;
+       TEdit *edPrev;
+       TPopupMenu *pmTrayIcon;
+       TMenuItem *miExit2;
+       TMenuItem *miAbout;
+       TMenuItem *N5;
+       TMenuItem *N6;
+       TMenuItem *miOption;
+       TMenuItem *miGroup;
+       TMenuItem *N4;
+       TMenuItem *miEnablePopup;
+       TTimer *BootTimer;
+       TImage *Image;
+       TTimer *TestTimer;
+       TButton *btnOK;
+       TLabel *lbVersion;
+       TMenuItem *miClickOnly;
+       TMenuItem *miReload;
+       TMenuItem *miClose;
+       TTimer *tmMenuClose;
+       TTimer *tmNotify;
+       TTimer *tmPopup;
+       TMenuItem *miReadMe;
+       TMenuItem *miIncSearch;
+       TTimer *tmMouseMove;
+       TMenuItem *N2;
+       TMenuItem *miConfig;
+       TMenuItem *miInstallMODI;
+       TTimer *tmMODIInstallCheck;
+       TTimer *tmMODINotify;
+       TMenuItem *miCheckLatest;
+       TMenuItem *miOCRText;
+       void __fastcall miHookClick(TObject *Sender);
+       void __fastcall miUnhookClick(TObject *Sender);
+       void __fastcall miExitClick(TObject *Sender);
+       void __fastcall miTestClick(TObject *Sender);
+       void __fastcall miDdeTestClick(TObject *Sender);
+       void __fastcall FormCreate(TObject *Sender);
+       void __fastcall miAboutClick(TObject *Sender);
+       void __fastcall miOptionClick(TObject *Sender);
+       void __fastcall pmTrayIconPopup(TObject *Sender);
+       void __fastcall miEnablePopupClick(TObject *Sender);
+       void __fastcall FormCloseQuery(TObject *Sender, bool &CanClose);
+       void __fastcall BootTimerTimer(TObject *Sender);
+       void __fastcall ImageMouseUp(TObject *Sender, TMouseButton Button,
+                 TShiftState Shift, int X, int Y);
+       void __fastcall FormKeyPress(TObject *Sender, char &Key);
+       void __fastcall TestTimerTimer(TObject *Sender);
+       void __fastcall btnOKClick(TObject *Sender);
+       void __fastcall ImageMouseDown(TObject *Sender, TMouseButton Button,
+                 TShiftState Shift, int X, int Y);
+       void __fastcall ImageMouseMove(TObject *Sender, TShiftState Shift, int X,
+                 int Y);
+       void __fastcall miClickOnlyClick(TObject *Sender);
+       void __fastcall miReloadClick(TObject *Sender);
+       void __fastcall miCloseClick(TObject *Sender);
+       void __fastcall tmMenuCloseTimer(TObject *Sender);
+       void __fastcall tmNotifyTimer(TObject *Sender);
+       void __fastcall tmPopupTimer(TObject *Sender);
+       void __fastcall miReadMeClick(TObject *Sender);
+       void __fastcall miIncSearchClick(TObject *Sender);
+       void __fastcall tmMouseMoveTimer(TObject *Sender);
+       void __fastcall miConfigClick(TObject *Sender);
+       void __fastcall tmMODIInstallCheckTimer(TObject *Sender);
+       void __fastcall tmMODINotifyTimer(TObject *Sender);
+       void __fastcall miCheckLatestClick(TObject *Sender);
+       void __fastcall miOCRTextClick(TObject *Sender);
+private:       // \83\86\81[\83U\81[\90é\8c¾
+       //void __fastcall IdleHandler(TObject *sender, bool &done);
+
+       bool BootUp;
+       bool Capturing;
+       POINT CapPoint;
+       class TDCHookLoader *hDll;
+
+       int SavedWidth;
+
+       // Popup Configuration //
+       bool GroupOpen;
+       AnsiString GroupName;
+       bool CtrlClose;
+       bool IgnoreJ;
+       bool Banner;
+       int CaptureMode;        // 0:conventional 1:use AMODI
+       bool AMODIAvail;        // AMODI available or not
+       AnsiString AMODIPath;
+       bool MouseIncSrch;
+public:                // \83\86\81[\83U\81[\90é\8c¾
+       __fastcall TDCHookMainForm(TComponent* Owner);
+       void EvCopyData(TMessage&);
+       void InitAMODI();
+       void Start();
+       void MenuClosed();
+       void ShowNotify();
+       void EvToggle( TMessage & );
+       void EvShortcut( TMessage & );
+       void EvGetVersion( TMessage & );
+
+       // Hooking //
+       bool Hook();
+       void Unhook();
+
+       // Popup Control //
+       POINT CursorPoint;
+       void SetupConfig();
+       void SetupConfig2();
+       void SetupAMODI();
+       bool EnablePopup;
+       bool DoPopup( const tchar *text, const tchar *prevtext, bool movesend );
+       tchar *PopupText;
+       int PopupLoc;
+       bool PopupMoveSend;
+       void EvPopup(TMessage &);
+       int DoPopupRetry;
+       void EvMoveSend(TMessage &);
+       void EvMoveSend(bool enable);
+
+       // Tray Icon Control //
+       void RegisterTrayIcon( bool flag );
+       void EvNotifyIcon( TMessage & );
+       void SaveConfig();
+       void EnableClickOnly( bool enable );
+       void DokoPopMenu( bool all );
+
+       // PDIC Control //
+       void __fastcall miDicGroup(TObject *Sender);
+       void OpenDicGroup( const char *name );
+       TDdeClientConv *OpenPdic( const char *topic );
+       void ClosePdic( TDdeClientConv *dde );
+
+       // WM_COPYDATA control //
+       HWND FindPdic( );
+       LRESULT SendCopyData( HWND hwnd, int message, const char *str );
+
+       void NotifyAMODI();
+
+       void Reboot();
+       
+protected:
+       BEGIN_MESSAGE_MAP
+               VCL_MESSAGE_HANDLER(WM_COPYDATA, TMessage, EvCopyData)
+               VCL_MESSAGE_HANDLER(WM_POPUP, TMessage, EvPopup)
+               VCL_MESSAGE_HANDLER(WM_MOVESEND, TMessage, EvMoveSend)
+               VCL_MESSAGE_HANDLER(WM_NOTIFYICON, TMessage, EvNotifyIcon)
+               VCL_MESSAGE_HANDLER(WM_TOGGLE, TMessage, EvToggle)
+               VCL_MESSAGE_HANDLER(UM_SHORTCUT, TMessage, EvShortcut)
+               VCL_MESSAGE_HANDLER(WM_GET_VERSION, TMessage, EvGetVersion)
+       END_MESSAGE_MAP(TForm)
+};
+//---------------------------------------------------------------------------
+extern PACKAGE TDCHookMainForm *DCHookMainForm;
+//---------------------------------------------------------------------------
+
+extern bool Reboot;
+
+#endif
+
diff --git a/DCHookTest/DCHookTest.bpr b/DCHookTest/DCHookTest.bpr
new file mode 100644 (file)
index 0000000..825bde7
--- /dev/null
@@ -0,0 +1,634 @@
+<?xml version='1.0' encoding='utf-8' ?>
+<!-- C++Builder XML Project -->
+<PROJECT>
+  <MACROS>
+    <VERSION value="BCB.05.03"/>
+    <PROJECT value="DCHookTest.exe"/>
+    <OBJFILES value="obj\DCHookTest.obj obj\DCHookMain.obj obj\StringLib.obj 
+      obj\PopupConfig.obj obj\Util.obj obj\Notify.obj obj\mustr.obj 
+      obj\HookDLl.obj obj\HookLoader.obj obj\DCHookLoader.obj obj\prgprof.obj 
+      obj\MODINotifyDlg.obj obj\prgconfig.obj obj\OCRTextFrm.obj"/>
+    <RESFILES value="DCHookTest.res obj\icon.res"/>
+    <IDLFILES value=""/>
+    <DEFFILE value=""/>
+    <RESDEPEN value="$(RESFILES) DCHookMain.dfm PopupConfig.dfm Notify.dfm MODINotifyDlg.dfm 
+      OCRTextFrm.dfm"/>
+    <LIBFILES value=""/>
+    <LIBRARIES value="VCLDB50.lib TNTLIBR.lib Vclx50.lib vcl50.lib"/>
+    <SPARELIBS value="vcl50.lib Vclx50.lib TNTLIBR.lib VCLDB50.lib"/>
+    <PACKAGES value="vcl50.bpi"/>
+    <PATHCPP value=".;"/>
+    <PATHPAS value=".;"/>
+    <PATHRC value=".;"/>
+    <PATHASM value=".;"/>
+    <DEBUGLIBPATH value="$(BCB)\lib\debug"/>
+    <RELEASELIBPATH value="$(BCB)\lib\release"/>
+    <LINKER value="ilink32"/>
+    <USERDEFINES value="USE_UNICODE;DCHOOK"/>
+    <SYSDEFINES value="NO_STRICT"/>
+    <MAINSOURCE value="DCHookTest.cpp"/>
+    <INCLUDEPATH value="K:\Borland\CBuilder5\Bin\;$(BCB)\Lib;$(BCB)\include;$(BCB)\include\vcl"/>
+    <LIBPATH value="K:\Borland\CBuilder5\Bin\;$(BCB)\Projects\Lib;$(BCB)\lib\obj;$(BCB)\lib"/>
+    <WARNINGS value="-w-par -w-8027 -w-8026"/>
+    <WARNOPTSTR value=""/>
+  </MACROS>
+  <OPTIONS>
+    <CFLAG1 value="-O2 -H=dchooktest.csm -Vx -Ve -X- -a4 -5 -b- -k- -vi -c -tW -tWM"/>
+    <PFLAGS value="-N2obj -N0obj -$Y- -$L- -$D- -v -JPHNE -M"/>
+    <RFLAGS value=""/>
+    <AFLAGS value="/mx /w2 /zn"/>
+    <LFLAGS value="-Iobj -D&quot;&quot; -aa -Tpe -GD -s"/>
+  </OPTIONS>
+  <LINKER>
+    <ALLOBJ value="c0w32.obj sysinit.obj $(OBJFILES)"/>
+    <ALLRES value="$(RESFILES)"/>
+    <ALLLIB value="$(LIBFILES) $(LIBRARIES) import32.lib cp32mt.lib"/>
+  </LINKER>
+  <IDEOPTIONS>
+[Version Info]
+IncludeVerInfo=1
+AutoIncBuild=1
+MajorVer=2
+MinorVer=0
+Release=23
+Build=77
+Debug=0
+PreRelease=0
+Special=0
+Private=0
+DLL=0
+Locale=1041
+CodePage=932
+
+[Version Info Keys]
+CompanyName=Doko Pop Project
+FileDescription=DokoPop for Windows
+FileVersion=2.0.23.77
+InternalName=DokoPop
+LegalCopyright=Copyright (c) DokoPopProject
+LegalTrademarks=
+OriginalFilename=DKPP.EXE
+ProductName=DokoPop
+ProductVersion=2.0
+Comments=
+
+[Excluded Packages]
+$(BCB)\Bin\dclite50.bpl=Borland Integrated Translation Environment
+
+[HistoryLists\hlIncludePath]
+Count=16
+Item0=K:\Borland\CBuilder5\Bin\;$(BCB)\Lib;$(BCB)\include;$(BCB)\include\vcl
+Item1=K:\Borland\CBuilder5\Bin;$(BCB)\Lib;$(BCB)\include;$(BCB)\include\vcl
+Item2=$(BCB)\Lib;$(BCB)\include;$(BCB)\include\vcl
+Item3=R:\Borland\CBuilder5\Bin\;C:\Borland\CBuilder5\Bin\;$(BCB)\Lib;$(BCB)\include;$(BCB)\include\vcl
+Item4=R:\Borland\CBuilder5\Bin;C:\Borland\CBuilder5\Bin\;$(BCB)\Lib;$(BCB)\include;$(BCB)\include\vcl
+Item5=C:\Borland\CBuilder5\Bin\;$(BCB)\Lib;$(BCB)\include;$(BCB)\include\vcl
+Item6=C:\Borland\CBuilder5\Bin;$(BCB)\Lib;$(BCB)\include;$(BCB)\include\vcl
+Item7=..\..\Filer;$(BCB)\Lib;$(BCB)\include;$(BCB)\include\vcl
+Item8=$(BCB)\Lib;$(BCB)\include;$(BCB)\include\vcl;D:\units\
+Item9=$(BCB)\Lib;$(BCB)\include;$(BCB)\include\vcl;..\..\units
+Item10=$(BCB)\include;$(BCB)\include\vcl;..\..\units
+Item11=$(BCB)\include;$(BCB)\include\vcl;..\..\units
+Item12=$(BCB)\include;$(BCB)\include\vcl;..\..\units;$(BCB)\include\vcl;..\..\units
+Item13=
+Item14=$(BCB)\include;$(BCB)\include\vcl
+Item15=$(BCB)\include;$(BCB)\include\vcl
+
+[HistoryLists\hlLibraryPath]
+Count=13
+Item0=K:\Borland\CBuilder5\Bin\;$(BCB)\Projects\Lib;$(BCB)\lib\obj;$(BCB)\lib
+Item1=K:\Borland\CBuilder5\Bin;$(BCB)\Projects\Lib;$(BCB)\lib\obj;$(BCB)\lib
+Item2=$(BCB)\Projects\Lib;$(BCB)\lib\obj;$(BCB)\lib
+Item3=R:\Borland\CBuilder5\Bin\;C:\Borland\CBuilder5\Bin\;$(BCB)\Projects\Lib;$(BCB)\lib\obj;$(BCB)\lib
+Item4=R:\Borland\CBuilder5\Bin;C:\Borland\CBuilder5\Bin\;$(BCB)\Projects\Lib;$(BCB)\lib\obj;$(BCB)\lib
+Item5=C:\Borland\CBuilder5\Bin\;$(BCB)\Projects\Lib;$(BCB)\lib\obj;$(BCB)\lib
+Item6=C:\Borland\CBuilder5\Bin;$(BCB)\Projects\Lib;$(BCB)\lib\obj;$(BCB)\lib
+Item7=..\..\Filer;$(BCB)\Projects\Lib;$(BCB)\lib\obj;$(BCB)\lib
+Item8=$(BCB)\Projects\Lib;$(BCB)\lib\obj;$(BCB)\lib;D:\units\
+Item9=$(BCB)\Projects\Lib;$(BCB)\lib\obj;$(BCB)\lib;..\..\units
+Item10=$(BCB)\Projects\Lib;$(BCB)\lib\obj;$(BCB)\lib;..\..\units
+Item11=$(BCB)\lib\obj;$(BCB)\lib;$(BCB)\lib
+Item12=
+
+[HistoryLists\hlDebugSourcePath]
+Count=1
+Item0=$(BCB)\source\vcl
+
+[HistoryLists\hlConditionals]
+Count=10
+Item0=USE_UNICODE;DCHOOK
+Item1=USE_UNICODE;DCHOOK;_DEBUG
+Item2=USE_UNICODE;_DEBUG;DCHOOK
+Item3=USE_UNICODE;UNICODE;_UNICODE;_DEBUG;DCHOOK
+Item4=USE_UNICODE;_DEBUG
+Item5=USE_UNICODE
+Item6=_DEBUG
+Item7=_DEBUG;USE_UNICODE
+Item8=_UNICODE
+Item9=DEBUG
+
+[HistoryLists\hlIntOutputDir]
+Count=2
+Item0=obj
+Item1=.\obj
+
+[Debugging]
+DebugSourceDirs=$(BCB)\source\vcl
+
+[Parameters]
+RunParams=
+HostApplication=
+RemoteHost=
+RemotePath=
+RemoteDebug=0
+
+[Compiler]
+ShowInfoMsgs=0
+LinkDebugVcl=0
+LinkCGLIB=0
+  <!-- EurekaLog First Line
+[Exception Log]
+EurekaLog Version=6105
+Activate=0
+Activate Handle=1
+Save Log File=1
+Foreground Tab=0
+Freeze Activate=0
+Freeze Timeout=0
+SMTP From=eurekalog@email.com
+SMTP Host=
+SMTP Port=25
+SMTP UserID=
+SMTP Password=
+Append to Log=0
+TerminateBtn Operation=2
+Errors Number=32
+Errors Terminate=3
+Email Address=
+Email Object=
+Email Send Options=0
+Output Path=
+Encrypt Password=
+AutoCloseDialogSecs=0
+WebSendMode=0
+SupportULR=
+HTMLLayout Count=15
+HTMLLine0="%3Chtml%3E"
+HTMLLine1="  %3Chead%3E"
+HTMLLine2="  %3C/head%3E"
+HTMLLine3="  %3Cbody TopMargin=10 LeftMargin=10%3E"
+HTMLLine4="    %3Ctable width="100%%" border="0"%3E"
+HTMLLine5="      %3Ctr%3E"
+HTMLLine6="        %3Ctd nowrap%3E"
+HTMLLine7="          %3Cfont face="Lucida Console, Courier" size="2"%3E"
+HTMLLine8="            %3C%%HTML_TAG%%%3E"
+HTMLLine9="          %3C/font%3E"
+HTMLLine10="        %3C/td%3E"
+HTMLLine11="      %3C/tr%3E"
+HTMLLine12="    %3C/table%3E"
+HTMLLine13="  %3C/body%3E"
+HTMLLine14="%3C/html%3E"
+AutoCrashOperation=2
+AutoCrashNumber=10
+AutoCrashMinutes=1
+WebURL=
+WebUserID=
+WebPassword=
+WebPort=0
+AttachedFiles=
+ProxyURL=
+ProxyUser=
+ProxyPassword=
+ProxyPort=8080
+TrakerUser=
+TrakerPassword=
+TrakerAssignTo=
+TrakerProject=
+TrakerCategory=
+TrakerTrialID=
+ZipPassword=
+PreBuildEvent=
+PostSuccessfulBuildEvent=
+PostFailureBuildEvent=
+ExceptionDialogType=2
+Count=0
+EMail Message Line Count=0
+loNoDuplicateErrors=0
+loAppendReproduceText=0
+loDeleteLogAtVersionChange=0
+loAddComputerNameInLogFileName=0
+loSaveModulesAndProcessesSections=1
+loSaveAssemblerAndCPUSections=1
+soAppStartDate=1
+soAppName=1
+soAppVersionNumber=1
+soAppParameters=1
+soAppCompilationDate=1
+soAppUpTime=1
+soExcDate=1
+soExcAddress=1
+soExcModuleName=1
+soExcModuleVersion=1
+soExcType=1
+soExcMessage=1
+soExcID=1
+soExcCount=1
+soExcStatus=1
+soExcNote=1
+soUserID=1
+soUserName=1
+soUserEmail=1
+soUserPrivileges=1
+soUserCompany=1
+soActCtlsFormClass=1
+soActCtlsFormText=1
+soActCtlsControlClass=1
+soActCtlsControlText=1
+soCmpName=1
+soCmpTotalMemory=1
+soCmpFreeMemory=1
+soCmpTotalDisk=1
+soCmpFreeDisk=1
+soCmpSysUpTime=1
+soCmpProcessor=1
+soCmpDisplayMode=1
+soCmpDisplayDPI=1
+soCmpVideoCard=1
+soCmpPrinter=1
+soOSType=1
+soOSBuildN=1
+soOSUpdate=1
+soOSLanguage=1
+soOSCharset=1
+soNetIP=1
+soNetSubmask=1
+soNetGateway=1
+soNetDNS1=1
+soNetDNS2=1
+soNetDHCP=1
+soCustomData=1
+sndShowSendDialog=1
+sndShowSuccessFailureMsg=0
+sndSendEntireLog=0
+sndSendXMLLogCopy=0
+sndSendScreenshot=1
+sndUseOnlyActiveWindow=0
+sndSendLastHTMLPage=1
+sndSendInSeparatedThread=0
+sndAddDateInFileName=0
+sndAddComputerNameInFileName=0
+edoSendErrorReportChecked=1
+edoAttachScreenshotChecked=1
+edoShowCopyToClipOption=1
+edoShowDetailsButton=1
+edoShowInDetailedMode=0
+edoShowInTopMostMode=0
+edoUseEurekaLogLookAndFeel=0
+edoShowSendErrorReportOption=1
+edoShowAttachScreenshotOption=1
+edoShowCustomButton=0
+csoShowDLLs=1
+csoShowBPLs=1
+csoShowBorlandThreads=1
+csoShowWindowsThreads=1
+csoDoNotStoreProcNames=0
+boPauseBorlandThreads=0
+boDoNotPauseMainThread=0
+boPauseWindowsThreads=0
+boUseMainModuleOptions=1
+boCopyLogInCaseOfError=1
+boSaveCompressedCopyInCaseOfError=0
+boHandleSafeCallExceptions=1
+boCallRTLExceptionEvent=0
+boCatchHandledExceptions=0
+loCatchLeaks=0
+loGroupsSonLeaks=1
+loHideBorlandLeaks=1
+loFreeAllLeaks=1
+loCatchLeaksExceptions=1
+cfoReduceFileSize=1
+cfoCheckFileCorruption=0
+cfoUseEL7=0
+Count mtInformationMsgCaption=1
+mtInformationMsgCaption0="Information."
+Count mtQuestionMsgCaption=1
+mtQuestionMsgCaption0="Question."
+Count mtErrorMsgCaption=1
+mtErrorMsgCaption0="Error."
+Count mtDialog_Caption=1
+mtDialog_Caption0="Error occurred"
+Count mtDialog_ErrorMsgCaption=2
+mtDialog_ErrorMsgCaption0="An error has occurred during program execution."
+mtDialog_ErrorMsgCaption1="Please read the following information for further details."
+Count mtDialog_GeneralCaption=1
+mtDialog_GeneralCaption0="General"
+Count mtDialog_GeneralHeader=1
+mtDialog_GeneralHeader0="General Information"
+Count mtDialog_CallStackCaption=1
+mtDialog_CallStackCaption0="Call Stack"
+Count mtDialog_CallStackHeader=1
+mtDialog_CallStackHeader0="Call Stack Information"
+Count mtDialog_ModulesCaption=1
+mtDialog_ModulesCaption0="Modules"
+Count mtDialog_ModulesHeader=1
+mtDialog_ModulesHeader0="Modules Information"
+Count mtDialog_ProcessesCaption=1
+mtDialog_ProcessesCaption0="Processes"
+Count mtDialog_ProcessesHeader=1
+mtDialog_ProcessesHeader0="Processes Information"
+Count mtDialog_AsmCaption=1
+mtDialog_AsmCaption0="Assembler"
+Count mtDialog_AsmHeader=1
+mtDialog_AsmHeader0="Assembler Information"
+Count mtDialog_CPUCaption=1
+mtDialog_CPUCaption0="CPU"
+Count mtDialog_CPUHeader=1
+mtDialog_CPUHeader0="CPU Information"
+Count mtDialog_OKButtonCaption=1
+mtDialog_OKButtonCaption0="%26OK"
+Count mtDialog_TerminateButtonCaption=1
+mtDialog_TerminateButtonCaption0="%26Terminate"
+Count mtDialog_RestartButtonCaption=1
+mtDialog_RestartButtonCaption0="%26Restart"
+Count mtDialog_DetailsButtonCaption=1
+mtDialog_DetailsButtonCaption0="%26Details"
+Count mtDialog_CustomButtonCaption=1
+mtDialog_CustomButtonCaption0="%26Help"
+Count mtDialog_SendMessage=1
+mtDialog_SendMessage0="%26Send this error via Internet"
+Count mtDialog_ScreenshotMessage=1
+mtDialog_ScreenshotMessage0="%26Attach a Screenshot image"
+Count mtDialog_CopyMessage=1
+mtDialog_CopyMessage0="%26Copy to Clipboard"
+Count mtDialog_SupportMessage=1
+mtDialog_SupportMessage0="Go to the Support Page"
+Count mtMSDialog_ErrorMsgCaption=1
+mtMSDialog_ErrorMsgCaption0="The application has encountered a problem. We are sorry for the inconvenience."
+Count mtMSDialog_RestartCaption=1
+mtMSDialog_RestartCaption0="Restart application."
+Count mtMSDialog_TerminateCaption=1
+mtMSDialog_TerminateCaption0="Terminate application."
+Count mtMSDialog_PleaseCaption=1
+mtMSDialog_PleaseCaption0="Please tell us about this problem."
+Count mtMSDialog_DescriptionCaption=1
+mtMSDialog_DescriptionCaption0="We have created an error report that you can send to us. We will treat this report as confidential and anonymous."
+Count mtMSDialog_SeeDetailsCaption=1
+mtMSDialog_SeeDetailsCaption0="To see what data the error report contains,"
+Count mtMSDialog_SeeClickCaption=1
+mtMSDialog_SeeClickCaption0="click here."
+Count mtMSDialog_HowToReproduceCaption=1
+mtMSDialog_HowToReproduceCaption0="What were you doing when the problem happened (optional)?"
+Count mtMSDialog_EmailCaption=1
+mtMSDialog_EmailCaption0="Email address (optional):"
+Count mtMSDialog_SendButtonCaption=1
+mtMSDialog_SendButtonCaption0="%26Send Error Report"
+Count mtMSDialog_NoSendButtonCaption=1
+mtMSDialog_NoSendButtonCaption0="%26Don't Send"
+Count mtLog_AppHeader=1
+mtLog_AppHeader0="Application"
+Count mtLog_AppStartDate=1
+mtLog_AppStartDate0="Start Date"
+Count mtLog_AppName=1
+mtLog_AppName0="Name/Description"
+Count mtLog_AppVersionNumber=1
+mtLog_AppVersionNumber0="Version Number"
+Count mtLog_AppParameters=1
+mtLog_AppParameters0="Parameters"
+Count mtLog_AppCompilationDate=1
+mtLog_AppCompilationDate0="Compilation Date"
+Count mtLog_AppUpTime=1
+mtLog_AppUpTime0="Up Time"
+Count mtLog_ExcHeader=1
+mtLog_ExcHeader0="Exception"
+Count mtLog_ExcDate=1
+mtLog_ExcDate0="Date"
+Count mtLog_ExcAddress=1
+mtLog_ExcAddress0="Address"
+Count mtLog_ExcModuleName=1
+mtLog_ExcModuleName0="Module Name"
+Count mtLog_ExcModuleVersion=1
+mtLog_ExcModuleVersion0="Module Version"
+Count mtLog_ExcType=1
+mtLog_ExcType0="Type"
+Count mtLog_ExcMessage=1
+mtLog_ExcMessage0="Message"
+Count mtLog_ExcID=1
+mtLog_ExcID0="ID"
+Count mtLog_ExcCount=1
+mtLog_ExcCount0="Count"
+Count mtLog_ExcStatus=1
+mtLog_ExcStatus0="Status"
+Count mtLog_ExcNote=1
+mtLog_ExcNote0="Note"
+Count mtLog_UserHeader=1
+mtLog_UserHeader0="User"
+Count mtLog_UserID=1
+mtLog_UserID0="ID"
+Count mtLog_UserName=1
+mtLog_UserName0="Name"
+Count mtLog_UserEmail=1
+mtLog_UserEmail0="Email"
+Count mtLog_UserCompany=1
+mtLog_UserCompany0="Company"
+Count mtLog_UserPrivileges=1
+mtLog_UserPrivileges0="Privileges"
+Count mtLog_ActCtrlsHeader=1
+mtLog_ActCtrlsHeader0="Active Controls"
+Count mtLog_ActCtrlsFormClass=1
+mtLog_ActCtrlsFormClass0="Form Class"
+Count mtLog_ActCtrlsFormText=1
+mtLog_ActCtrlsFormText0="Form Text"
+Count mtLog_ActCtrlsControlClass=1
+mtLog_ActCtrlsControlClass0="Control Class"
+Count mtLog_ActCtrlsControlText=1
+mtLog_ActCtrlsControlText0="Control Text"
+Count mtLog_CmpHeader=1
+mtLog_CmpHeader0="Computer"
+Count mtLog_CmpName=1
+mtLog_CmpName0="Name"
+Count mtLog_CmpTotalMemory=1
+mtLog_CmpTotalMemory0="Total Memory"
+Count mtLog_CmpFreeMemory=1
+mtLog_CmpFreeMemory0="Free Memory"
+Count mtLog_CmpTotalDisk=1
+mtLog_CmpTotalDisk0="Total Disk"
+Count mtLog_CmpFreeDisk=1
+mtLog_CmpFreeDisk0="Free Disk"
+Count mtLog_CmpSystemUpTime=1
+mtLog_CmpSystemUpTime0="System Up Time"
+Count mtLog_CmpProcessor=1
+mtLog_CmpProcessor0="Processor"
+Count mtLog_CmpDisplayMode=1
+mtLog_CmpDisplayMode0="Display Mode"
+Count mtLog_CmpDisplayDPI=1
+mtLog_CmpDisplayDPI0="Display DPI"
+Count mtLog_CmpVideoCard=1
+mtLog_CmpVideoCard0="Video Card"
+Count mtLog_CmpPrinter=1
+mtLog_CmpPrinter0="Printer"
+Count mtLog_OSHeader=1
+mtLog_OSHeader0="Operating System"
+Count mtLog_OSType=1
+mtLog_OSType0="Type"
+Count mtLog_OSBuildN=1
+mtLog_OSBuildN0="Build #"
+Count mtLog_OSUpdate=1
+mtLog_OSUpdate0="Update"
+Count mtLog_OSLanguage=1
+mtLog_OSLanguage0="Language"
+Count mtLog_OSCharset=1
+mtLog_OSCharset0="Charset"
+Count mtLog_NetHeader=1
+mtLog_NetHeader0="Network"
+Count mtLog_NetIP=1
+mtLog_NetIP0="IP Address"
+Count mtLog_NetSubmask=1
+mtLog_NetSubmask0="Submask"
+Count mtLog_NetGateway=1
+mtLog_NetGateway0="Gateway"
+Count mtLog_NetDNS1=1
+mtLog_NetDNS10="DNS 1"
+Count mtLog_NetDNS2=1
+mtLog_NetDNS20="DNS 2"
+Count mtLog_NetDHCP=1
+mtLog_NetDHCP0="DHCP"
+Count mtLog_CustInfoHeader=1
+mtLog_CustInfoHeader0="Custom Information"
+Count mtCallStack_Address=1
+mtCallStack_Address0="Address"
+Count mtCallStack_Name=1
+mtCallStack_Name0="Module"
+Count mtCallStack_Unit=1
+mtCallStack_Unit0="Unit"
+Count mtCallStack_Class=1
+mtCallStack_Class0="Class"
+Count mtCallStack_Procedure=1
+mtCallStack_Procedure0="Procedure/Method"
+Count mtCallStack_Line=1
+mtCallStack_Line0="Line"
+Count mtCallStack_MainThread=1
+mtCallStack_MainThread0="Main"
+Count mtCallStack_ExceptionThread=1
+mtCallStack_ExceptionThread0="Exception Thread"
+Count mtCallStack_RunningThread=1
+mtCallStack_RunningThread0="Running Thread"
+Count mtCallStack_CallingThread=1
+mtCallStack_CallingThread0="Calling Thread"
+Count mtCallStack_ThreadID=1
+mtCallStack_ThreadID0="ID"
+Count mtCallStack_ThreadPriority=1
+mtCallStack_ThreadPriority0="Priority"
+Count mtCallStack_ThreadClass=1
+mtCallStack_ThreadClass0="Class"
+Count mtCallStack_LeakCaption=1
+mtCallStack_LeakCaption0="Memory Leak"
+Count mtCallStack_LeakData=1
+mtCallStack_LeakData0="Data"
+Count mtCallStack_LeakType=1
+mtCallStack_LeakType0="Type"
+Count mtCallStack_LeakSize=1
+mtCallStack_LeakSize0="Total size"
+Count mtCallStack_LeakCount=1
+mtCallStack_LeakCount0="Count"
+Count mtSendDialog_Caption=1
+mtSendDialog_Caption0="Send."
+Count mtSendDialog_Message=1
+mtSendDialog_Message0="Message"
+Count mtSendDialog_Resolving=1
+mtSendDialog_Resolving0="Resolving DNS..."
+Count mtSendDialog_Login=1
+mtSendDialog_Login0="Login..."
+Count mtSendDialog_Connecting=1
+mtSendDialog_Connecting0="Connecting with server..."
+Count mtSendDialog_Connected=1
+mtSendDialog_Connected0="Connected with server."
+Count mtSendDialog_Sending=1
+mtSendDialog_Sending0="Sending message..."
+Count mtSendDialog_Sent=1
+mtSendDialog_Sent0="Message sent."
+Count mtSendDialog_SelectProject=1
+mtSendDialog_SelectProject0="Select project..."
+Count mtSendDialog_Searching=1
+mtSendDialog_Searching0="Searching..."
+Count mtSendDialog_Modifying=1
+mtSendDialog_Modifying0="Modifying..."
+Count mtSendDialog_Disconnecting=1
+mtSendDialog_Disconnecting0="Disconnecting..."
+Count mtSendDialog_Disconnected=1
+mtSendDialog_Disconnected0="Disconnected."
+Count mtReproduceDialog_Caption=1
+mtReproduceDialog_Caption0="Request"
+Count mtReproduceDialog_Request=1
+mtReproduceDialog_Request0="Please describe the steps to reproduce the error:"
+Count mtReproduceDialog_OKButtonCaption=1
+mtReproduceDialog_OKButtonCaption0="%26OK"
+Count mtModules_Handle=1
+mtModules_Handle0="Handle"
+Count mtModules_Name=1
+mtModules_Name0="Name"
+Count mtModules_Description=1
+mtModules_Description0="Description"
+Count mtModules_Version=1
+mtModules_Version0="Version"
+Count mtModules_Size=1
+mtModules_Size0="Size"
+Count mtModules_LastModified=1
+mtModules_LastModified0="Modified"
+Count mtModules_Path=1
+mtModules_Path0="Path"
+Count mtProcesses_ID=1
+mtProcesses_ID0="ID"
+Count mtProcesses_Name=1
+mtProcesses_Name0="Name"
+Count mtProcesses_Description=1
+mtProcesses_Description0="Description"
+Count mtProcesses_Version=1
+mtProcesses_Version0="Version"
+Count mtProcesses_Memory=1
+mtProcesses_Memory0="Memory"
+Count mtProcesses_Priority=1
+mtProcesses_Priority0="Priority"
+Count mtProcesses_Threads=1
+mtProcesses_Threads0="Threads"
+Count mtProcesses_Path=1
+mtProcesses_Path0="Path"
+Count mtCPU_Registers=1
+mtCPU_Registers0="Registers"
+Count mtCPU_Stack=1
+mtCPU_Stack0="Stack"
+Count mtCPU_MemoryDump=1
+mtCPU_MemoryDump0="Memory Dump"
+Count mtSend_SuccessMsg=1
+mtSend_SuccessMsg0="The message was sent successfully."
+Count mtSend_FailureMsg=1
+mtSend_FailureMsg0="Sorry, sending the message didn't work."
+Count mtSend_BugClosedMsg=2
+mtSend_BugClosedMsg0="These BUG is just closed."
+mtSend_BugClosedMsg1="Contact the program support to obtain an update."
+Count mtSend_UnknownErrorMsg=1
+mtSend_UnknownErrorMsg0="Unknown error."
+Count mtSend_InvalidLoginMsg=1
+mtSend_InvalidLoginMsg0="Invalid login request."
+Count mtSend_InvalidSearchMsg=1
+mtSend_InvalidSearchMsg0="Invalid search request."
+Count mtSend_InvalidSelectionMsg=1
+mtSend_InvalidSelectionMsg0="Invalid selection request."
+Count mtSend_InvalidInsertMsg=1
+mtSend_InvalidInsertMsg0="Invalid insert request."
+Count mtSend_InvalidModifyMsg=1
+mtSend_InvalidModifyMsg0="Invalid modify request."
+Count mtFileCrackedMsg=2
+mtFileCrackedMsg0="This file is cracked."
+mtFileCrackedMsg1="The application will be closed."
+Count mtException_LeakMultiFree=1
+mtException_LeakMultiFree0="Multi Free memory leak."
+Count mtException_LeakMemoryOverrun=1
+mtException_LeakMemoryOverrun0="Memory Overrun leak."
+Count mtException_AntiFreeze=1
+mtException_AntiFreeze0="The application seems to be frozen."
+Count mtInvalidEmailMsg=1
+mtInvalidEmailMsg0="Invalid email."
+TextsCollection=English
+EurekaLog Last Line -->
+</IDEOPTIONS>
+</PROJECT>
diff --git a/DCHookTest/DCHookTest.cpp b/DCHookTest/DCHookTest.cpp
new file mode 100644 (file)
index 0000000..40ac715
--- /dev/null
@@ -0,0 +1,67 @@
+//---------------------------------------------------------------------------
+#include <vcl.h>
+#pragma hdrstop
+USERES("DCHookTest.res");
+USEFORM("DCHookMain.cpp", DCHookMainForm);
+USEUNIT("StringLib.cpp");
+USEFORM("PopupConfig.cpp", PopupConfigDlg);
+USEUNIT("Util.cpp");
+USEFORM("Notify.cpp", NotifyForm);
+USERC("icon.rc");
+USEUNIT("mustr.cpp");
+USEUNIT("HookDLl.cpp");
+USEUNIT("HookLoader.cpp");
+USEUNIT("DCHookLoader.cpp");
+USE("..\Diary.txt", File);
+USEUNIT("prgprof.cpp");
+USEFORM("MODINotifyDlg.cpp", MODINotifyDialog);
+USEUNIT("prgconfig.cpp");
+USEFORM("OCRTextFrm.cpp", OCRTextForm);
+//---------------------------------------------------------------------------
+#include "prgconfig.h"
+#include "DCHookMain.h"
+//---------------------------------------------------------------------------
+
+WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
+{
+#if __PROTO
+       SYSTEMTIME st;
+       GetSystemTime(&st);
+       if ( (st.wYear>=2016 && st.wMonth>=12) || st.wYear>=2017){
+               int ret = MessageBox(NULL, "\8e\8e\8dì\94Å\82Ì\8eg\97p\8aú\8cÀ\82ª\90Ø\82ê\82Ü\82µ\82½\81B\90V\82µ\82¢DokoPop!\82ð\93ü\8eè\82µ\82Ä\82­\82¾\82³\82¢", APPNAME, MB_YESNO);
+               if (ret != IDNO){
+                       ShowLatestVersion();
+                       return 0;
+               }
+       }
+#endif
+
+       HWND hwnd = FindPrev();
+       if ( hwnd ){
+               if (CheckVersion(hwnd)<0){
+                       // The older version already lauched.
+                       MessageBox(NULL, "DokoPop!\82ª\82·\82Å\82É\8bN\93®\82µ\82Ä\82¢\82Ü\82·\81B\r\8cÃ\82¢\83o\81[\83W\83\87\83\93\82ÌDokoPop!\82ð\83A\83\93\83C\83\93\83X\83g\81[\83\8b\82µ\82Ä\82­\82¾\82³\82¢", APPNAME, MB_OK);
+                       return 0;
+               }
+               MoveToTop( hwnd );
+               return 0;
+       }
+       try
+       {
+               Application->Initialize();
+               Application->Title = "DokoPop";
+               Application->CreateForm(__classid(TDCHookMainForm), &DCHookMainForm);
+               Application->Run();
+       }
+       catch (Exception &exception)
+       {
+               Application->ShowException(&exception);
+       }
+       if (Reboot){
+               _WinExec(Application->ExeName.c_str(), SW_SHOW, 0);
+       }
+       return 0;
+}
+//---------------------------------------------------------------------------
+
+
diff --git a/DCHookTest/DCHookTest.dfm b/DCHookTest/DCHookTest.dfm
new file mode 100644 (file)
index 0000000..d29f0c2
Binary files /dev/null and b/DCHookTest/DCHookTest.dfm differ
diff --git a/DCHookTest/DCHookTest.h b/DCHookTest/DCHookTest.h
new file mode 100644 (file)
index 0000000..4cee011
--- /dev/null
@@ -0,0 +1,27 @@
+//---------------------------------------------------------------------------
+#ifndef DCHookTestH
+#define DCHookTestH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <Controls.hpp>
+#include <StdCtrls.hpp>
+#include <Forms.hpp>
+#include <Menus.hpp>
+//---------------------------------------------------------------------------
+class TForm1 : public TForm
+{
+__published:   // IDE \8aÇ\97\9d\82Ì\83R\83\93\83|\81[\83l\83\93\83g
+       TMainMenu *MainMenu1;
+       TMenuItem *File1;
+       TMenuItem *Exit1;
+       TMenuItem *Hook1;
+       TMenuItem *Unhook1;
+       TMenuItem *N1;
+private:       // \83\86\81[\83U\81[\90é\8c¾
+public:                // \83\86\81[\83U\81[\90é\8c¾
+       __fastcall TForm1(TComponent* Owner);
+};
+//---------------------------------------------------------------------------
+extern PACKAGE TForm1 *Form1;
+//---------------------------------------------------------------------------
+#endif
diff --git a/DCHookTest/DCHookTest.mak b/DCHookTest/DCHookTest.mak
new file mode 100644 (file)
index 0000000..9f0a76b
--- /dev/null
@@ -0,0 +1,184 @@
+# ---------------------------------------------------------------------------
+!if !$d(BCB)
+BCB = $(MAKEDIR)\..
+!endif
+
+# ---------------------------------------------------------------------------
+# IDE SECTION
+# ---------------------------------------------------------------------------
+# The following section of the project makefile is managed by the BCB IDE.
+# It is recommended to use the IDE to change any of the values in this
+# section.
+# ---------------------------------------------------------------------------
+
+VERSION = BCB.05.03
+# ---------------------------------------------------------------------------
+PROJECT = DCHookTest.exe
+OBJFILES = DCHookTest.obj DCHookMain.obj StringLib.obj PopupConfig.obj Util.obj \
+    Notify.obj
+RESFILES = DCHookTest.res icon.res
+MAINSOURCE = DCHookTest.cpp
+RESDEPEN = $(RESFILES) DCHookMain.dfm PopupConfig.dfm Notify.dfm
+LIBFILES = 
+IDLFILES = 
+IDLGENFILES = 
+LIBRARIES = Vclx50.lib vcl50.lib
+PACKAGES = vcl50.bpi
+SPARELIBS = vcl50.lib Vclx50.lib
+DEFFILE = 
+# ---------------------------------------------------------------------------
+PATHCPP = .;
+PATHASM = .;
+PATHPAS = .;
+PATHRC = .;
+DEBUGLIBPATH = $(BCB)\lib\debug
+RELEASELIBPATH = $(BCB)\lib\release
+USERDEFINES = 
+SYSDEFINES = NO_STRICT
+INCLUDEPATH = ..\..\Filer;$(BCB)\Lib;$(BCB)\include;$(BCB)\include\vcl
+LIBPATH = ..\..\Filer;$(BCB)\Projects\Lib;$(BCB)\lib\obj;$(BCB)\lib
+WARNINGS= -w-par -w-8027 -w-8026
+# ---------------------------------------------------------------------------
+CFLAG1 = -O2 -H=dchooktest.csm -Vx -Ve -X- -a4 -5 -b- -k- -vi -c -tW -tWM
+IDLCFLAGS = 
+PFLAGS = -$Y- -$L- -$D- -v -JPHNE -M
+RFLAGS = 
+AFLAGS = /mx /w2 /zn
+LFLAGS = -D"" -aa -Tpe -GD -s
+# ---------------------------------------------------------------------------
+ALLOBJ = c0w32.obj sysinit.obj $(OBJFILES)
+ALLRES = $(RESFILES)
+ALLLIB = $(LIBFILES) $(LIBRARIES) import32.lib cp32mt.lib
+# ---------------------------------------------------------------------------
+!ifdef IDEOPTIONS
+
+[Version Info]
+IncludeVerInfo=0
+AutoIncBuild=0
+MajorVer=1
+MinorVer=0
+Release=0
+Build=0
+Debug=0
+PreRelease=0
+Special=0
+Private=0
+DLL=0
+
+[Version Info Keys]
+CompanyName=
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+Comments=
+
+[Debugging]
+DebugSourceDirs=$(BCB)\source\vcl
+
+!endif
+
+
+
+
+
+# ---------------------------------------------------------------------------
+# MAKE SECTION
+# ---------------------------------------------------------------------------
+# This section of the project file is not used by the BCB IDE.  It is for
+# the benefit of building from the command-line using the MAKE utility.
+# ---------------------------------------------------------------------------
+
+.autodepend
+# ---------------------------------------------------------------------------
+!if "$(USERDEFINES)" != ""
+AUSERDEFINES = -d$(USERDEFINES:;= -d)
+!else
+AUSERDEFINES =
+!endif
+
+!if !$d(BCC32)
+BCC32 = bcc32
+!endif
+
+!if !$d(CPP32)
+CPP32 = cpp32
+!endif
+
+!if !$d(DCC32)
+DCC32 = dcc32
+!endif
+
+!if !$d(TASM32)
+TASM32 = tasm32
+!endif
+
+!if !$d(LINKER)
+LINKER = ilink32
+!endif
+
+!if !$d(BRCC32)
+BRCC32 = brcc32
+!endif
+
+
+# ---------------------------------------------------------------------------
+!if $d(PATHCPP)
+.PATH.CPP = $(PATHCPP)
+.PATH.C   = $(PATHCPP)
+!endif
+
+!if $d(PATHPAS)
+.PATH.PAS = $(PATHPAS)
+!endif
+
+!if $d(PATHASM)
+.PATH.ASM = $(PATHASM)
+!endif
+
+!if $d(PATHRC)
+.PATH.RC  = $(PATHRC)
+!endif
+# ---------------------------------------------------------------------------
+$(PROJECT): $(IDLGENFILES) $(OBJFILES) $(RESDEPEN) $(DEFFILE)
+    $(BCB)\BIN\$(LINKER) @&&!
+    $(LFLAGS) -L$(LIBPATH) +
+    $(ALLOBJ), +
+    $(PROJECT),, +
+    $(ALLLIB), +
+    $(DEFFILE), +
+    $(ALLRES)
+!
+# ---------------------------------------------------------------------------
+.pas.hpp:
+    $(BCB)\BIN\$(DCC32) $(PFLAGS) -U$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -O$(INCLUDEPATH) --BCB {$< }
+
+.pas.obj:
+    $(BCB)\BIN\$(DCC32) $(PFLAGS) -U$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -O$(INCLUDEPATH) --BCB {$< }
+
+.cpp.obj:
+    $(BCB)\BIN\$(BCC32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n$(@D) {$< }
+
+.c.obj:
+    $(BCB)\BIN\$(BCC32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n$(@D) {$< }
+
+.c.i:
+    $(BCB)\BIN\$(CPP32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n. {$< }
+
+.cpp.i:
+    $(BCB)\BIN\$(CPP32) $(CFLAG1) $(WARNINGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -n. {$< }
+
+.asm.obj:
+    $(BCB)\BIN\$(TASM32) $(AFLAGS) -i$(INCLUDEPATH:;= -i) $(AUSERDEFINES) -d$(SYSDEFINES:;= -d) $<, $@
+
+.rc.res:
+    $(BCB)\BIN\$(BRCC32) $(RFLAGS) -I$(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -fo$@ $<
+# ---------------------------------------------------------------------------
+
+
+
+
diff --git a/DCHookTest/DCHookTest.rc b/DCHookTest/DCHookTest.rc
new file mode 100644 (file)
index 0000000..b8eeb55
--- /dev/null
@@ -0,0 +1 @@
+0 ICON "dkpps.ico"
diff --git a/DCHookTest/DCHookTest.res b/DCHookTest/DCHookTest.res
new file mode 100644 (file)
index 0000000..0832256
Binary files /dev/null and b/DCHookTest/DCHookTest.res differ
diff --git a/DCHookTest/DKPU.txt b/DCHookTest/DKPU.txt
new file mode 100644 (file)
index 0000000..22aed01
--- /dev/null
@@ -0,0 +1,208 @@
+==============================================================
+                  \82Ç\82±\83|\83b\83v\81I/Unicode    Ver.2.0
+==============================================================
+\8fÐ\89î ---------------------------------------------------------
+
+\81@\81u\82Ç\82±\83|\83b\83v\81I/Unicode\81v\82Í\81ATaN\8dì\82ÌPersonal Dictionary/Unicode\94Å(\88È\89ºPDIC)
+\81@\82Æ\98A\8cg\82µ\82Ä\81A\83}\83E\83X\83N\83\8a\83b\83N\82É\82æ\82Á\82Ä\83}\83E\83X\88Ê\92u\82Ì\92P\8cê\82ð\8c\9f\8dõ\81A\93ú\96{\8cê\96ó\82È
+\81@\82Ç\82ð\83|\83b\83v\83A\83b\83v\83E\83B\83\93\83h\83E\82É\82æ\82Á\82Ä\95\\8e¦\82·\82é\83\\83t\83g\83E\83F\83A\82Å\82·\81B
+\81@Unicode\82É\91Î\89\9e\82µ\82Ä\82¢\82Ü\82·\81B
+
+\93®\8dì\8am\94FOS ---------------------------------------------------
+
+\81@WindowsXP/Vista/7/8/8.1
+
\81¦Windows2000\82Å\8eg\97p\82·\82é\82±\82Æ\82à\89Â\94\\82Å\82·\82ª\81A\90Ý\92è\82ª\95K\97v\82Å\82·\81B
+
+\96â\91è\93_ -------------------------------------------------------
+
+\81E\95¡\90\94\8ds\82É\82Ü\82½\82ª\82é\8fn\8cê\82Í\83q\83b\83g\82µ\82È\82¢
+
+\8f\80\94õ ---------------------------------------------------------
+
+\81@DKPU20.EXE\82ð\82»\82Ì\82Ü\82Ü\8eÀ\8ds\82µ\82Ä\89º\82³\82¢\81B
+\81@\8e©\93®\93I\82É\83C\83\93\83X\83g\81[\83\8b\82³\82ê\82Ü\82·\81B
+\81@\83X\83^\81[\83g\83A\83b\83v\82É\93o\98^\82µ\82½\95û\82ª\95Ö\97\98\82Å\82·\81B(Windows\8bN\93®\8e\9e\82ÉDokoPop!\82à\8bN\93®)
+
+\81@\82Ç\82±\83|\83b\83v\81I\82É\82ÍPDIC/Unicode Ver.0.67\88È\8d\82ª\95K\97v\82Å\82·\81B
+\81@http://homepage3.nifty.com/TaN/pdic-unicode.html
+  \82©\82ç\83_\83E\83\93\83\8d\81[\83h\82µ\82Ä\89º\82³\82¢\81B
+
+\8eg\97p\95û\96@ -----------------------------------------------------
+
+\81@DKPU.EXE\82ð\8bN\93®\82·\82é\82Æ\83^\83X\83N\83g\83\8c\83C\82É\8fí\92\93\82µ\82Ü\82·\81B(DP\82Æ\8f\91\82¢\82Ä\82 \82é\83A\83C\83R\83\93)
+\81@Ctrl\83L\81[\82ð\89\9f\82µ\82È\82ª\82ç\83}\83E\83X\82Ì\89E\83{\83^\83\93\82ð\83N\83\8a\83b\83N\82·\82é\82Æ\81A\83N\83\8a\83b\83N\82µ\82½\88Ê\92u\82Ì
+\81@\92P\8cê\82Ü\82½\82Í\8fn\8cê\82Ì\88Ó\96¡\82ð\95\\8e¦\82µ\82Ü\82·\81B
+
+  \81y\92\8d\88Ó\81zWin32\94ÅDokoPop!\82Æ\93¯\8e\9e\82É\8fí\92\93\82³\82¹\82Ä\82¨\82­\82±\82Æ\82Í\89Â\94\\82Å\82·\82ª\81A
+          \83|\83b\83v\83A\83b\83v\82Ì\82½\82ß\82Ì\83L\81[\91\80\8dì\82Í\95Ê\81X\82Ì\91g\82Ý\8d\87\82í\82¹\82É\82·\82é\95K\97v\82ª\82 \82è\82Ü\82·\81B
+          \83^\83X\83N\83g\83\8c\83C\82ð\89E\83N\83\8a\83b\83N\82µ\82Ä\81u\90Ý\92è...\81v\82Å\95Ï\8dX\82µ\82Ä\82­\82¾\82³\82¢\81B
+          \93¯\8e\9e\8fí\92\93\82É\82Í\91o\95û\82Æ\82àVer.1.11\88È\8fã\82ª\95K\97v\82Å\82·\81B
+
+  \81y\92\8d\88Ó\81zPDIC\96{\91Ì\82Í\95K\82¸\8e«\8f\91\83O\83\8b\81[\83v\82ð\83I\81[\83v\83\93\82µ\82½\8fó\91Ô\82É\82µ\82Ä\82¨\82¢\82Ä\82­\82¾\82³\82¢\81B
+          \82Â\82Ü\82è\81A\92Ê\8fí\82Ì\8c\9f\8dõ(WORD\97\93\93ü\97Í\81j\82ª\82Å\82«\82é\8fó\91Ô\82É\82µ\82Ä\82¨\82¢\82Ä\82­\82¾\82³\82¢\81B
+          (\83\81\83j\83\85\81[\82Ì File | \8e«\8f\91\83O\83\8b\81[\83v\83I\81[\83v\83\93)
+          \8e«\8f\91\95Ï\8a·\92\86\82È\82Ç\81A\92Ê\8fí\82Ì\8c\9f\8dõ\82ª\82Å\82«\82È\82¢\8fó\91Ô\82Å\82Í\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82Í
+          \82Å\82«\82Ü\82¹\82ñ\81B
+
+  \81y\92\8d\88Ó\81zMS-Word\82Å\82Í Ctrl+\89E\83N\83\8a\83b\83\82ª\83J\83b\83g\81\95\83y\81[\83X\83g\82É\8a\84\82è\93\96\82Ä\82ç\82ê\82Ä\82¢\82é
+          \82½\82ß\81A\82¤\82Ü\82­\93®\8dì\82µ\82È\82¢\82Æ\82«\82ª\82 \82è\82Ü\82·\81B
+          \81i\81u\82Í\82\82ß\82É\91I\91ð\82µ\82Ä\82­\82¾\82³\82¢\81v\82È\82Ç\82Æ\8fo\82Ä\82­\82é\81j
+          \82à\82µ\82±\82Ì\96â\91è\82ð\89ñ\94ð\82µ\82½\82¢\8fê\8d\87\82Í\81A\8e\9f\82Ì\81u\82¿\82å\82Á\82Æ\95Ö\97\98\82È\8eg\97p\95û\96@\81v
+          \82É\82 \82é\82æ\82¤\82É\81A\81u\89E\83N\83\8a\83b\83N\82¾\82¯\82Å\83|\83b\83v\83A\83b\83v\81v\82É\82·\82é\82©\81A
+          \8e\9f\82Ì\82æ\82¤\82É\90Ý\92è\82ð\8ds\82Á\82Ä\82­\82¾\82³\82¢\81B
+          DokoPop!\82Ì\83^\83X\83N\83g\83\8c\83C\82Ì\83\81\83j\83\85\81[\82©\82ç\81A[\90Ý\92è...]\82ð\91I\82Ñ\81A
+          \81u\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\81v\82©\82ç\81A\83|\83b\83v\83A\83b\83v\82ð\82³\82¹\82é\82Æ\82«\82Ì\91g\82Ý\8d\87\82í\82¹\82ð
+          \91I\82ñ\82Å\82­\82¾\82³\82¢\81B
+          Alt + \89E\83N\83\8a\83b\83\82Å\82 \82ê\82Î\96â\91è\82È\82¢\82æ\82¤\82Å\82·\81B
+
+\82¿\82å\82Á\82Æ\95Ö\97\98\82È\8eg\97p\95û\96@ ---------------------------------------
+
+\81@\81uCtrl + \89E\83N\83\8a\83b\83N\81v\82Í\82í\82¸\82ç\82í\82µ\82¢\81I\81I
+\81@\82Æ\82¢\82¤\90l\82É\82Í\81A
+
+\81@\81u\89E\83N\83\8a\83b\83N\82¾\82¯\82Å\83|\83b\83v\83A\83b\83v\81v
+
+\81@\82Æ\82¢\82¤\95û\96@\82à\82 \82è\82Ü\82·\81B
+\81@Ctrl + Alt + \89E\83N\83\8a\83b\83\82ÅON/OFF\82Ì\90Ø\82è\91Ö\82¦\82ª\82Å\82«\82Ü\82·\81B
+\81@\81i\90Ø\82è\91Ö\82¦\8e\9e\82É\83\81\83b\83Z\81[\83W\82ª\8fo\82Ü\82·)
+
+\81@\83q\83\93\83g\81F\81u\89E\83N\83\8a\83b\83N\82¾\82¯\81v\82É\82µ\82½\8fê\8d\87\81A\81uCtrl + \89E\83N\83\8a\83b\83N\81v\82ð\82·\82é\82Æ\81A
+\81@\81@\81@\81@\81@\92Ê\8fí\82Ì\89E\83N\83\8a\83b\83N\83\81\83j\83\85\81[\82ª\8fo\82Ä\82«\82Ü\82·\81B
+\81@\81@\81@\81@\81@\82¿\82å\82¤\82Ç\81uCtrl\81v\82ª\8bt\93]\82·\82é\8a´\82\82É\82È\82è\82Ü\82·\81B
+
+\83\81\83j\83\85\81[ -----------------------------------------------------
+
+\81@\83^\83X\83N\83g\83\8c\83C\82ÌDokoPop!\83A\83C\83R\83\93\82ð\89E\83N\83\8a\83b\83N\82·\82é\82Æ\83\81\83j\83\85\81[\82ª\8c»\82ê\82Ü\82·\81B
+
+\81@\8e«\8f\91\83O\83\8b\81[\83v         - PDIC\82Ì\8e«\8f\91\83O\83\8b\81[\83v\82Ì\95Ï\8dX\82ð\8ds\82¢\82Ü\82·
+\81@\89E\83N\83\8a\83b\83N\8c\9f\8dõ       - \83}\83E\83X\82Ì\89E\83N\83\8a\83b\83N\82¾\82¯\82Å\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82ð\8ds\82¢\82Ü\82·
+  \83C\83\93\83N\83\8a\83\81\83\93\83^\83\8b\83T\81[\83` - PDIC\96{\91Ì\82Å\83C\83\93\83N\83\8a\83\81\83\93\83^\83\8b\83T\81[\83`\82ð\8ds\82¢\82Ü\82·
+                           PDIC\88È\8aO\82Ì\83A\83v\83\8a\8fã\82Å\83}\83E\83X\82ð\88Ú\93®\82·\82é\82Æ\81A
+                           WORD\97\93\82É\83}\83E\83X\89º\82Ì\83e\83L\83X\83g\82ª\8e©\93®\93I\82É\83R\83s\81[\82³\82ê\82Ü\82·
+\81@\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\97L\8cø - \8c\9f\8dõ\82ð\97L\8cø\81^\96³\8cø\82É\82µ\82Ü\82·
+\81@\90Ý\92è                 - \8ae\8eí\90Ý\92è\82ð\8ds\82¢\82Ü\82·
+\81@\90à\96¾\8f\91\82ð\95\\8e¦         - \82±\82Ì\83t\83@\83C\83\8b\82ð\95\\8e¦\82µ\82Ü\82·
+\81@\83o\81[\83W\83\87\83\93           - version\95\\8e¦
+\81@\8fI\97¹                 - \82Ç\82±\83|\83b\83v\81I\82Ì\8fI\97¹
+
+\90Ý\92è ---------------------------------------------------------
+
+  \83^\83X\83N\83g\83\8c\83C\82Ì\89E\83N\83\8a\83b\83N\82Å\8fo\82Ä\82«\82½\83\81\83j\83\85\81[\82Ì\81u\90Ý\92è\81v\82Å\82·\81B
+
+  \81¡\8bN\93®\8e\9e\82É\83X\83v\83\89\83b\83V\83\85\82ð\95\\8e¦\82·\82é
+    \8bN\93®\8e\9e\82Ì\89æ\96Ê\92\86\89\9b\82É\8fo\82Ä\82­\82é\83E\83B\83\93\83h\83E\82Ì
+    \95\\8e¦\82ð\97L\8cø\81^\96³\8cø\82É\82µ\82Ü\82·\81B
+
+    \81\9a\8bN\93®\8e\9e\82Ì\83X\83v\83\89\83b\83V\83\85\83r\83b\83g\83}\83b\83v\82ð\83J\83X\83^\83}\83C\83Y\81\9a
+    DKPU.EXE\82ª\82 \82é\83t\83H\83\8b\83_\81[\82É DKPU.BMP \82Æ\82¢\82¤\83t\83@\83C\83\8b\82ª\82 \82é\82Æ\81A
+    \82»\82Ì\83r\83b\83g\83}\83b\83v\82ð\8bN\93®\8e\9e\82Æ\83o\81[\83W\83\87\83\93...\82Ì\82Æ\82«\82É\95\\8e¦\82µ\82Ü\82·\81B
+
+  \81¡\8e«\8f\91\83O\83\8b\81[\83v\82ð\8ew\92è\82·\82é
+    \82±\82±\82ð\83`\83F\83b\83N\82·\82é\82Æ\81A\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82ð\8ds\82¤\82Æ\82«\82É
+    \82±\82±\82Å\8ew\92è\82µ\82½\8e«\8f\91\83O\83\8b\81[\83v\82ð\8eg\97p\82µ\82Ü\82·\81B
+    PDIC\96{\91Ì\82Å\82Ì\8e«\8f\91\83O\83\8b\81[\83v\82Ì\91I\91ð\82ª\95Ï\8dX\82³\82ê\82Ü\82·\81B
+
+  \81¡\83|\83b\83v\83A\83b\83v\8c\9f\8dõ - \83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82ð\8ds\82¤\83}\83E\83X\82Æ\83L\81[\82Ì\91g\82Ý\8d\87\82í\82¹\82ð\8ew\92è
+    \82µ\82Ü\82·\81B
+
+  \81¡\89E\83N\83\8a\83b\83N\8c\9f\8dõON/OFF
+    \89E\83N\83\8a\83b\83N\8c\9f\8dõ\82Ì\97L\8cø\81E\96³\8cø\82ð\90Ø\82è\91Ö\82¦\82é\83}\83E\83X\82Æ\83L\81[\82Ì\91g\82Ý\8d\87\82í\82¹\82Å\82·\81B
+
+  \81¡Ctrl\83L\81[\82ð\97£\82µ\82½\82ç\83|\83b\83v\83A\83b\83v\82ð\95Â\82\82é
+    Ctrl+\83}\83E\83X\83N\83\8a\83b\83N\82Å\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82ð\8ds\82¤\82æ\82¤\82É\82µ\82½\8fê\8d\87\81A
+    \83|\83b\83v\83A\83b\83v\95\\8e¦\82³\82ê\82½\8cã\81ACtrl\83L\81[\82ð\97£\82µ\82½\82ç\83|\83b\83v\83A\83b\83v\82µ\82½
+    \83E\83B\83\93\83h\83E\82ð\95Â\82\82Ü\82·\81B
+    \81i\8f«\97\88\93I\82É\82±\82Ì\83I\83v\83V\83\87\83\93\82Í\96³\82­\82µ\82Ü\82· - \8d¢\82é\81I\82Æ\82¢\82¤\95û\82Í\82¨\92m\82ç\82¹\82­\82¾\82³\82¢\81j
+
+  \81¡\89p\90\94\8e\9a\82Ì\82Ý\8c\9f\8dõ\82·\82é
+    \93ú\96{\8cê\81E\89p\90\94\8e\9a\8d¬\8dÝ\82Ì\95\8fÍ\82ª\82 \82Á\82½\8fê\8d\87\81A\93ú\96{\8cê\82ð\96³\8e\8b\82µ\82Ä\8c\9f\8dõ\82ð\8ds\82¢\82Ü\82·\81B
+    \8d¬\8dÝ\95\8fÍ\82Å\82Í ON \82É\82µ\82½\82Ù\82¤\82ª\83q\83b\83g\82µ\82â\82·\82­\82È\82è\82Ü\82·\81B
+    \82Ü\82½\81A\83t\83\89\83\93\83X\8cê\81A\83h\83C\83c\8cê\82Ì\82æ\82¤\82È\83E\83\80\83\89\83E\83g\81E\83A\83N\83T\83\93\82È\82Ç\82ð
+    \8aÜ\82Þ\95\8fÍ\82Å\82Í\82±\82±\82ð OFF \82É\82µ\82È\82¢\82Æ\82¤\82Ü\82­\93®\8dì\82µ\82È\82¢\8fê\8d\87\82ª\82 \82è\82Ü\82·\81B
+
+  \81¡AMODI\82ð\8eg\97p\82·\82é
+    \82±\82Ì\8b@\94\\82ð\97L\8cø\82É\82·\82é\82Æ\81A\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82Å\82«\82é\82Æ\82±\82ë\82ª\91\9d\82¦\82Ü\82·\81B
+    \92Ê\8fí\81A\82±\82±\82Í\95K\82¸\97L\8cø\82É\82µ\82Ä\82­\82¾\82³\82¢\81B
+    \81¦\82±\82Ì\8b@\94\\82ð\8eg\97p\82·\82é\82É\82Í\81AMODI\82ð\83C\83\93\83X\83g\81[\83\8b\82·\82é\95K\97v\82ª\82 \82è\82Ü\82·\81B
+    \81@\95\\8e¦\82É\8f]\82Á\82Ä\83C\83\93\83X\83g\81[\83\8b\82ð\8ds\82Á\82Ä\82­\82¾\82³\82¢\81B
+    \81¦AMODI\82Æ\82ÍMODI\8b@\94\\82ð\97\98\97p\82·\82é\95t\91®\8eÀ\8ds\83t\83@\83C\83\8bamodi.exe\82Ì\82±\82Æ\82Å\82·\81B
+
+  \81¡AMODI\82Ì\8fê\8f\8a - \8fã\8b\89\8eÒ\8cü\82¯
+    MODI\82ð\83C\83\93\83X\83g\81[\83\8b\82Å\82«\82È\82¢\8fê\8d\87\82É\81A\91¼\82ÌPC\82É\82 \82éAMODI\82ð\97\98\97p\82·\82é\82±\82Æ\82ÅMODI\82ð\97\98\97p\89Â\94\\82É\82µ\82Ü\82·\81B
+    \8fê\8f\8a\82Æ\82µ\82Ä\81A
+    \amodi
+    \82ð\8ew\92è\82µ\82Ü\82·\81B
+    \97á\81F
+    \\server\temp\amodi
+    \81¦\83t\83@\83C\83\8b\8b¤\97L\8co\97R\82Å\97\98\97p\82µ\82Ü\82·\81B
+
+\8c¾\8cê\94»\92èDLL --------------------------------------------------
+
+\81@DokoPop!/Unicode\82Å\82Í\81A\8c\9f\8dõ\91Î\8fÛ\82Ì\92P\8cê\82ð\90Ø\82è\8fo\82·\8dÛ\82É\81A\91Î\8fÛ\8c¾\8cê\82ª
+\81@\89¢\95Ä\8cn\82Ì\8c¾\8cê - \82±\82±\82Å\82Í\92P\8cê\82Ì\8bæ\90Ø\82è\82É\94¼\8ap\83X\83y\81[\83X\82ð\8eg\82¤\8c¾\8cê\82Æ\82¢\82¤\88Ó\96¡\82Å
+\81@\92è\8b` - \82ð\91O\92ñ\82Æ\82µ\82Ä\88µ\82Á\82Ä\82¢\82Ü\82·\81B
+\81@\82µ\82©\82µ\81A\89¢\95Ä\8cn\88È\8aO\82Ì\8c¾\8cê\81A\97á\82¦\82Î\93ú\96{\8cê\82Ì\82æ\82¤\82É\92P\8cê\82Ì\8bæ\90Ø\82è\82Í\93ú\96{\8cê\82ð
+\81@\97\9d\89ð\82Å\82«\82é\90l\82É\82µ\82©\82í\82©\82è\82Ü\82¹\82ñ\81B\93\96\91R\81A\83R\83\93\83s\83\85\81[\83^\81[\82É\82à\92P\8cê\82Ì\8bæ\90Ø\82è\82ð
+\81@\8aÈ\92P\82É\97\9d\89ð\82³\82¹\82é\82±\82Æ\82Í\82Å\82«\82Ü\82¹\82ñ\81B
+\81@\81i\93ú\96{\8cê\93ü\97Í\82Å\95\90ß\82Ì\8bæ\90Ø\82è\82ð\82Æ\82«\82Ç\82«\8aÔ\88á\82¦\82é\82æ\82¤\82É\81j
+\81@\82³\82ç\82É\81AUnicode\82Å\88µ\82¦\82é\8c¾\8cê\82É\82Í\93ú\96{\8cê\82Ì\82æ\82¤\82È\8c¾\8cê\82ª\90\94\91½\82­\82 \82è\81A
+\81@\8ae\8c¾\8cê\82Ì\95\96@\82ð\95×\8b­\82µ\81A\91g\82Ý\8d\9e\82Þ\95K\97v\82ª\82 \82è\82Ü\82·\81B
+
+\81@\82±\82Ì\82½\82ß\82Ì\8aJ\94­\8fî\95ñ\82ð\82±\82¿\82ç\82Å\8cö\8aJ\82µ\82Ä\82¢\82Ü\82·\81B
+\81@http://homepage3.nifty.com/TaN/pdic-unicode.html
+
+\82»\82Ì\91¼ -------------------------------------------------------
+
+\81@\8dÄ\97\98\97p\81E\8dÄ\94z\95z\81E\89ü\95Ï\82È\82Ç\82Í\8e©\97R\82Å\82·\81B
+\81@\82±\82Ì\83\\83t\83g\83E\83F\83A\82É\82æ\82é\91¹\8aQ\82Í\88ê\90Ø\82»\82Ì\90Ó\94C\82ð\95\89\82¢\82Ü\82¹\82ñ\81B
+
+\81@\82±\82Ìprogram\82Í\81Aopen source\82Å\82 \82éDCHook\82Ìsample program\82Å\82·\81B
+\81@\83\\81[\83X\83t\83@\83C\83\8b\82Í\81A
+\81@http://dokopop.sourceforge.jp/
+\81@\82É\82 \82è\82Ü\82·\81B
+
+\81@\82±\82Ì\83\\83t\83g\83E\83F\83A\82Ì\83T\83|\81[\83g\82Í\8ds\82Á\82Ä\82¢\82Ü\82¹\82ñ\81B\82½\82¾\82µ\81A
+\81@http://www4.plala.or.jp/cgi-bin/wforum/wforum.cgi/grape/dkpp
+\81@\82É\82Ä\81A\8fî\95ñ\8cð\8a·\82ð\8ds\82Á\82Ä\82¢\82Ü\82·\81B
+
+\81@PDIC/Unicode\82Í
+\81@http://homepage3.nifty.com/TaN/pdic-unicode.html
+
+\97\9a\97ð ---------------------------------------------------------
+
+>> Ver.2.00 <<
+  \81EMODI\91Î\89\9e\82É\82æ\82è\81A\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82ª\82Å\82«\82é\82Æ\82±\82ë\82ª\91\9d\82¦\82½
+  \81E\83}\83E\83X\88Ú\93®\82É\82æ\82éPDIC\96{\91Ì\82Ì\83C\83\93\83N\83\8a\83\81\83\93\83^\83\8b\83T\81[\83`\8b@\94\\82Ì\92Ç\89Á
+
+>> Ver.1.23 <<
+  \81EDDE\82Å\91\97\90M\82·\82é\83f\81[\83^\82Ì\8c`\8e®\82ª\90³\82µ\82­\8ew\92è\82³\82ê\82Ä\82¢\82È\82©\82Á\82½(CF_TEXT->CF_UNICODETEXT)
+
+>> Ver.1.22 <<
+  \81E\83N\83\8a\83b\83N\82·\82é\91Î\8fÛ\82Ì\83E\83B\83\93\83h\83E\82ª\94ñUnicode\82Å\82 \82é\8fê\8d\87\93®\8dì\82µ\82È\82©\82Á\82½
+
+>> Ver.1.21 <<
+  \81E\8e«\8f\91\83O\83\8b\81[\83v\82Ì\91I\91ð\82ª\90³\82µ\82­\93®\8dì\82µ\82È\82¢\96â\91è\82ð\8fC\90³
+
+>> Ver.1.20 <<
+  \81EPDIC/Unicode Ver.5.0.x\82É\91Î\89\9e
+
+>> Ver.1.15 <<
+  \81EPDIC/Unicode Ver.0.83\82É\91Î\89\9e
+  \81Edialog\82Ì\8fo\82é\8fê\8f\8a\82ðDesktopCenter\81¨ScreenCenter (\83}\83\8b\83`\83\82\83j\83^\91Î\89\9e)
+
+>> Ver.1.14 <<
+  \81EDokoPop!\82É\8aÖ\82µ\82Ä\82Í\92Ê\8fí\82Ì\83o\81[\83W\83\87\83\93\94Ô\8d\86\82ð\95t\82¯\82é\82±\82Æ\82É\82µ\82½
+    - DokoPop!\82Í\83À\94Å\82Æ\90³\8e®\94Å\82Ì\8eÀ\8dÛ\93I\82È\88á\82¢\82ª\96³\82¢\82½\82ß
+    - DokoPop!\82Í\83I\81[\83v\83\93\83\\81[\83X\82Å\82 \82è\81APDIC\96{\91Ì\82Æ\82Í\95Ê\94z\95z\82Å\82 \82é\82½\82ß\81A
+      PDIC\96{\91Ì\82Æ\93¯\8aú\82·\82é\83À\94Å\82Æ\8c¾\82¤\93K\93\96\82È\8bæ\90Ø\82è\82ª\96³\82¢\82½\82ß
+  \81E\83o\81[\83W\83\87\83\93\94Ô\8d\86\82Ífor Win32\94Å\82Æ\8b¤\92Ê\89»\81i\83\\81[\83X\83R\81[\83h\82ª\93¯\82\82½\82ß\81j
+  * \95\82Ì\8dÅ\8cã\82Ì\92P\8cê\82ª\83q\83b\83g\82µ\82È\82©\82Á\82½\81iDokoPop!\82Ì\8dÅ\90V\94Å\82ª\95K\97v\81j
+    \81y\8c´\88ö\81z
+  \81@\8eæ\93¾\82µ\82½\95\8e\9a\97ñ\82Ì\8dÅ\8cã\82É\83S\83~\82ª\95t\91®\82µ\82½\82±\82Æ\82É\82æ\82è\81A\82»\82ê\82ðPDIC\82ª\92Ê\8fí\82Ì\83e\83L\83X\83g
+  \81@\82Æ\94F\8e¯\82µ\82Ä\82µ\82Ü\82¢\81A\95\82Ì\8dÅ\8cã\82Ì\83s\83\8a\83I\83h\82ª\92P\8cê\92\86\82Ì\95\8e\9a\97ñ\82Æ\82µ\82Ä\8f\88\97\9d\82³\82ê\82½\82½\82ß\81B
+
+>> Ver.0.10 <<
+\81E\8dÅ\8f\89\82Ì\8cö\8aJ
+
+--------------------------------------------------------------
diff --git a/DCHookTest/HookDLl.cpp b/DCHookTest/HookDLl.cpp
new file mode 100644 (file)
index 0000000..e269c7d
--- /dev/null
@@ -0,0 +1,4 @@
+#include <windows.h>
+#pragma hdrstop
+#include "HookDll.h"
+
diff --git a/DCHookTest/HookDLl.h b/DCHookTest/HookDLl.h
new file mode 100644 (file)
index 0000000..740280b
--- /dev/null
@@ -0,0 +1,22 @@
+#ifndef __HookDll_h
+#define        __HookDll_h
+
+class THookDllI {
+public:
+       virtual ~THookDllI(){}
+       virtual bool Load(HWND hwnd) = 0;
+       virtual void Unload() = 0;
+       virtual bool IsLoaded() = 0;
+
+       virtual bool Init(HWND hwnd) = 0;
+       virtual void Uninit() = 0;
+       virtual int Config( int clickonly, int keyaction, int keyflag ) = 0;
+       virtual int Config2( struct TDCHConfig *cfg ) = 0;
+       virtual int Capture( ) = 0;
+       virtual int CaptureAsync() = 0;
+       virtual int CaptureAsyncWait() = 0;
+       virtual int Debug() = 0;
+};
+
+
+#endif
diff --git a/DCHookTest/HookLoader.cpp b/DCHookTest/HookLoader.cpp
new file mode 100644 (file)
index 0000000..3ce0430
--- /dev/null
@@ -0,0 +1,294 @@
+#include <windows.h>
+#pragma hdrstop
+#include "stdafx.h"
+#include "HookLoader.h"
+#include "../DCHook64/DCHook64.h"
+#include "Util.h"
+
+#define        HOOK64_SUBDIR   0               // x64\8aÖ\98A\83t\83@\83C\83\8b\82Ísub directory x64\82Ö
+
+HWND hwnd64;
+
+THookLoader::THookLoader(const char *dllname)
+       :DllName(dllname)
+{
+       hDll = NULL;
+       DCHInit = NULL;
+       DCHConfig = NULL;
+       DCHConfig2 = NULL;
+       DCHCapture = NULL;
+       DCHWaitForCaptureResult = NULL;
+       DCHUninit = NULL;
+#ifdef _DEBUG
+       DCDebug = NULL;
+#endif
+
+       hThread = NULL;
+       dwThreadId = 0;
+}
+THookLoader::~THookLoader()
+{
+       Uninit();
+}
+bool THookLoader::Load(HWND hwnd)
+{
+       if (hDll)
+               return true;
+
+       hDll = LoadLibrary( DllName );
+       if ( !hDll )
+       {
+               GetLastError();
+#ifndef _DEBUG
+               DBW("Cannot load DLL:%s",DllName);
+#endif
+               // DKPPHK.DLL \82ª\82È\82¯\82ê\82ΠDCHOOK.DLL\82ðload
+               DllName = "DCHOOK.DLL";
+
+               hDll = LoadLibrary( DllName );
+               if ( !hDll ){
+                       DBW("Cannot load DLL:%s",DllName);
+                       return false;
+               }
+       }
+
+       DCHInit = (FNDCHInit)GetProcAddress( hDll, "Init" );
+       DCHUninit = (FNDCHUninit)GetProcAddress( hDll, "Uninit" );
+       DCHConfig = (FNDCHConfig)GetProcAddress( hDll, "Config" );
+       DCHConfig2 = (FNDCHConfig2)GetProcAddress( hDll, "Config2" );
+       DCHCapture = (FNDCHCapture)GetProcAddress( hDll, "Capture" );
+       DCHWaitForCaptureResult = (FNDCHWaitForCaptureResult)GetProcAddress( hDll, "WaitForCaptureResult" );
+#ifdef _DEBUG
+       DCDebug = (FNDebug)GetProcAddress( hDll, "Debug" );
+#endif
+
+       if (!DCHInit || !DCHUninit || !DCHConfig || !DCHConfig2 || !DCHCapture || !DCHWaitForCaptureResult){
+               FreeLibrary(hDll);
+               hDll = NULL;
+               return false;
+       }
+
+#if 0
+#ifdef USE_UNICODE
+       const char *pVxdPath = NULL;
+#else
+       AnsiString VxdPath;
+       if (!WindowsNT){
+               // for Windows9x
+               VxdPath = ExtractFilePath( Application->ExeName );
+               char path[256];
+               GetShortPathName( VxdPath.c_str(), path, sizeof(path) );
+               VxdPath = path;
+               VxdPath += "HK95D.VXD";
+       }
+       const char *pVxdPath = VxdPath.data();
+#endif
+
+       if ( !DCHInit( hwnd, DllName, WindowsNT, pVxdPath ) ){
+               FreeLibrary( hDll );
+               hDll = NULL;
+               DBW("Cannot initialized DLL");
+               return false;
+       }
+#endif
+
+       return true;
+}
+
+void THookLoader::Unload()
+{
+       if (!hDll)
+               return;
+       DCHUninit();
+       FreeLibrary(hDll);
+       hDll = NULL;
+       DCHUninit = NULL;
+}
+
+bool THookLoader::Init(HWND hwnd)
+{
+       DBW("Init");
+       return DCHInit(hwnd, NULL, NULL, NULL);
+}
+void THookLoader::Uninit()
+{
+       if (DCHUninit) DCHUninit();
+}
+
+int THookLoader::Capture()
+{
+       if (!hDll)
+               return 0;
+       return DCHCapture(NULL, NULL, true, false);
+}
+int THookLoader::CaptureAsync()
+{
+       if (!hDll)
+               return 0;
+       int ret = DCHCapture(NULL, NULL, true, true);
+       int result = DCHWaitForCaptureResult(false, 0);
+       DBW("result:%d", result);
+       if (result != 0){
+               // wait data\82 \82è
+               OpenThread();
+       }
+       return ret;
+}
+int THookLoader::CaptureAsyncWait()
+{
+       return 0;
+}
+
+void THookLoader::OpenThread()
+{
+       DBW("OpenThread: %08X", hThread);
+       if (hThread) return;
+
+       ThreadEnd = false;
+       hThread = CreateThread(NULL, 0, cbWaitCaptureThread, this, CREATE_SUSPENDED, &dwThreadId);
+       ResumeThread(hThread);
+}
+
+DWORD WINAPI THookLoader::cbWaitCaptureThread(LPVOID This)
+{
+       ((THookLoader*)This)->WaitCaptureThread();
+       return 0;
+}
+
+void THookLoader::WaitCaptureThread()
+{
+       DCHWaitForCaptureResult(true, 3000);
+       hThread = NULL;
+}
+
+static const char *MyWinTitle = "<Processing...in dchook>";
+inline HANDLE __WinExec( const char *cmd, int show, const char *dir=NULL )
+{
+       return WinExecEx(cmd, show, dir, MyWinTitle);
+}
+
+//#ifdef _DEBUG
+#if 0
+const char *StrDCHK64EXE = "..\\dchk64\\x64\\Debug\\dchk64.exe";       // for debug
+#else
+#if HOOK64_SUBDIR
+const char *StrDCHK64EXE = "x64\\DKPUHK64.exe";
+#else
+const char *StrDCHK64EXE = "DKPUHK64.exe";
+#endif
+#endif
+
+THookLoader64::THookLoader64(HWND hwnd_recv)
+       :hwndRecv(hwnd_recv)
+{
+       hwndTarget = NULL;
+       hProc = NULL;
+       LoadPending = false;
+}
+THookLoader64::~THookLoader64()
+{
+       if (hProc)
+               CloseHandle(hProc);
+       Unload();
+}
+bool THookLoader64::Load(HWND hwnd)
+{
+#if 1  // Find already launched hook executer.
+       HWND hwndFound = FindWindow("dchk64", "DCHK64");
+//     HWND hwndFound = FindApp("dchk64", "DCHK64", "");
+       if (hwndFound){
+               DBW("x64:Found %08X already launched exe", hwndFound);
+               hwndTarget = hwndFound;
+               hwnd64 = hwndTarget;
+               return true;
+       }
+#endif
+#if 1
+       char param[280];
+       wsprintf(param, "%s %08X", StrDCHK64EXE, hwndRecv);
+       hProc = __WinExec(param, SW_HIDE, 0);   // Launch dchk64.exe
+       if (!hProc){
+               DBW("Launch failed: %s", param);
+               return false;
+       }
+       LoadPending = true;
+       //WaitForInputIdle(hProc, 3000);
+#endif
+       return true;
+}
+void THookLoader64::Unload()
+{
+       if (!hProc)
+               return;
+       Uninit();
+       TerminateProcess(hProc, 0);
+       CloseHandle(hProc);
+       hProc = NULL;
+       LoadPending = false;
+}
+bool THookLoader64::Init(HWND hwnd)
+{
+       DBW("x64:Init hwndTarget=%08X", hwndTarget);
+       if (!hwndTarget){
+               DBW("Init failed");
+               return false;
+       }
+       DBW("x64:Init");
+       HDCInitParam p = {hwnd};
+       return Send(HDC_Init, &p, sizeof(p)) ? true : false;
+}
+void THookLoader64::Uninit( )
+{
+       if (!hwndTarget)
+               return ;
+       Send(HDC_Uninit, 0);
+       LoadPending = false;
+}
+int THookLoader64::Config( int clickonly, int keyaction, int keyflag )
+{
+       if (!hwndTarget)
+               return false;
+       HDCConfigParam p = {clickonly, keyaction, keyflag };
+       return Send(HDC_Config, &p, sizeof(p));
+}
+int THookLoader64::Config2( struct TDCHConfig *cfg )
+{
+       if (!hwndTarget)
+               return false;
+       return Send(HDC_Config2, cfg, sizeof(*cfg));
+}
+int THookLoader64::Capture()
+{
+       if (!hwndTarget)
+               return false;
+       return Send(HDC_Capture, 0);
+}
+int THookLoader64::CaptureAsync()
+{
+       if (!hwndTarget)
+               return false;
+       return Send(HDC_CaptureAsync, 0);
+}
+int THookLoader64::CaptureAsyncWait()
+{
+       if (!hwndTarget)
+               return false;
+       return Send(HDC_CaptureAsyncWait, 0);
+}
+int THookLoader64::Debug()
+{
+       if (!hwndTarget)
+               return false;
+       return Send(HDC_Debug, 0);
+}
+
+int THookLoader64::Send(int msg, void *data, int len)
+{
+       COPYDATASTRUCT cds;
+       memset(&cds, 0, sizeof(cds));
+       cds.dwData = msg;
+       cds.lpData = data;
+       cds.cbData = len;
+       return (int)SendMessage(hwndTarget, WM_COPYDATA, 0, (LPARAM)&cds);
+}
+
diff --git a/DCHookTest/HookLoader.h b/DCHookTest/HookLoader.h
new file mode 100644 (file)
index 0000000..0787498
--- /dev/null
@@ -0,0 +1,91 @@
+#ifndef __HookLoader_h
+#define        __HookLoader_h
+
+#include "../DCHook/DCHook.h"
+#include "HookDll.h"
+
+class THookLoader : public THookDllI {
+public:
+       THookLoader(const char *dllname);
+       ~THookLoader();
+       virtual bool Load(HWND hwnd);
+       virtual void Unload();
+       virtual bool IsLoaded()
+               { return hDll!=NULL; }
+
+       virtual bool Init(HWND hwnd);
+       virtual void Uninit();
+       virtual int Config( int clickonly, int keyaction, int keyflag )
+               { return DCHConfig(clickonly, keyaction, keyflag); }
+       virtual int Config2( struct TDCHConfig *cfg )
+               { return DCHConfig2(cfg); }
+       virtual int Capture();
+       virtual int CaptureAsync();
+       virtual int CaptureAsyncWait();
+       virtual int Debug()
+#ifdef _DEBUG
+               { return DCDebug(); }
+#else
+               { return 0; }
+#endif
+protected:
+       HANDLE hThread;
+       DWORD dwThreadId;
+       bool ThreadEnd;
+       void OpenThread();
+       static DWORD WINAPI cbWaitCaptureThread(LPVOID This);
+       void WaitCaptureThread();
+
+protected:
+       const char *DllName;
+       HINSTANCE hDll;
+       FNDCHInit DCHInit;
+       FNDCHUninit DCHUninit;
+       FNDCHConfig DCHConfig;
+       FNDCHConfig2 DCHConfig2;
+       FNDCHCapture DCHCapture;
+       FNDCHWaitForCaptureResult DCHWaitForCaptureResult;
+#ifdef _DEBUG
+       FNDebug DCDebug;
+       #define COMPSIZE        16
+       char share[ COMPSIZE ];
+#endif
+};
+
+class THookLoader64 : public THookDllI {
+public:
+       THookLoader64(HWND hwnd_recv);
+       virtual ~THookLoader64();
+       virtual bool Load(HWND hwnd);
+       virtual void Unload();
+       virtual bool IsLoaded()
+               { return hProc!=NULL; }
+
+       virtual bool Init(HWND hwnd);
+       virtual void Uninit() ;
+       virtual int Config( int clickonly, int keyaction, int keyflag );
+       virtual int Config2( struct TDCHConfig *cfg );
+       virtual int Capture();
+       virtual int CaptureAsync();
+       virtual int CaptureAsyncWait();
+       virtual int Debug();
+       void SetTarget(HWND hwnd)
+               { hwndTarget = hwnd; }
+       bool WaitFor() const
+       {
+               return WaitForInputIdle(hProc, 500)==0;
+       }
+       bool IsPending() const { return LoadPending; }
+       void Notify64() { LoadPending = false; }
+
+protected:
+       int Send(int msg, void *data=NULL, int len=0);
+
+       HWND hwndRecv;  // receive window handle (=main window handle)
+       HWND hwndTarget;        // main window handle of pdhk64.exe
+       HANDLE hProc;
+       bool LoadPending;
+};
+
+#endif
+
diff --git a/DCHookTest/MODINotifyDlg.cpp b/DCHookTest/MODINotifyDlg.cpp
new file mode 100644 (file)
index 0000000..5062db4
--- /dev/null
@@ -0,0 +1,102 @@
+//---------------------------------------------------------------------------
+
+#include <vcl.h>
+#pragma hdrstop
+
+#include "MODINotifyDlg.h"
+#include "Util.h"
+//---------------------------------------------------------------------------
+#pragma package(smart_init)
+#pragma resource "*.dfm"
+
+// \8eQ\8dl\81Fhttps://msdn.microsoft.com/ja-jp/library/5a4x27ek(v=vs.110).aspx
+#define        URL_DNF_INSTALL         "https://www.microsoft.com/ja-JP/download/details.aspx?id=40773"
+#define        URL_MODI_INSTALL        "http://support.microsoft.com/kb/982760"
+
+TMODINotifyDialog *MODINotifyDialog;
+//---------------------------------------------------------------------------
+__fastcall TMODINotifyDialog::TMODINotifyDialog(TComponent* Owner)
+       : TForm(Owner)
+{
+       LinkClicked = false;
+       modiInstalled = false;
+       amodiRunable = false;
+}
+//---------------------------------------------------------------------------
+void __fastcall TMODINotifyDialog::FormCreate(TObject *Sender)
+{
+       MoveCenter(Handle, NULL);
+       reMsgId = GetDlgCtrlID(reMsg->Handle);
+       //SetWindowLong(Handle, GWL_USERDATA, (LONG)reMsg->Handle);
+       SendMessage(reMsg->Handle, EM_AUTOURLDETECT, (WPARAM)TRUE, 0 ); // RichEdit 2.0 only
+       DWORD emask = SendMessage(reMsg->Handle, EM_GETEVENTMASK, 0, 0);
+       SendMessage(reMsg->Handle, EM_SETEVENTMASK, 0, emask | ENM_LINK);
+
+       modiInstalled = MODIInstalled();
+       amodiRunable = AMODIRunable();
+
+       SetMessage();   
+}
+//---------------------------------------------------------------------------
+void TMODINotifyDialog::SetMessage()
+{
+       if (modiInstalled && !amodiRunable){
+               reMsg->Lines->Add(
+"\81y\8fd\97v\81\95\8e\9a\94F\8e¯\82ð\8eg\97p\82·\82é\82É\82Í .NET Framework 4.5.1 \88È\8fã\82ª\95K\97v\82Å\82·\n"
+"\n"
+URL_DNF_INSTALL"\n"
+"\n"
+"\83\8a\83\93\83N\90æ\82©\82ç\83C\83\93\83X\83g\81[\83\8b\82ð\8ds\82Á\82Ä\82­\82¾\82³\82¢\n"
+"\n"
+"\81¦\83\8a\83\93\83N\90æ\82ª\8c©\82Â\82©\82ç\82È\82¢\8fê\8d\87\82Í\".NET Framework \83C\83\93\83X\83g\81[\83\8b\"\82Å\8c\9f\8dõ\82µ\82Ä\82­\82¾\82³\82¢\81B\n"
+"\81¦\95\8e\9a\94F\8e¯\82ð\8eg\97p\82·\82é\82Æ\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82ª\82Å\82«\82é\83A\83v\83\8a\82ª\91\9d\82¦\82Ü\82·\81B\n"
+               );
+       } else {
+               reMsg->Lines->Add(
+"\81y\8fd\97v\81z MODI\82ª\83C\83\93\83X\83g\81[\83\8b\82³\82ê\82Ä\82¢\82Ü\82¹\82ñ\81I\81I\n"
+"\n"
+"MODI\82ª\83C\83\93\83X\83g\81[\83\8b\82³\82ê\82Ä\82¢\82é\82Æ\81A\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82ª\82Å\82«\82é\83A\83v\83\8a\82ª\91\9d\82¦\82Ü\82·\81B\n"
+"\n"
+URL_MODI_INSTALL"\n"
+"\n"
+"\83\8a\83\93\83N\90æ\82É\82 \82é\82¢\82¸\82ê\82©\82Ì\95û\96@\82Å\83C\83\93\83X\83g\81[\83\8b\82ð\8ds\82Á\82Ä\82­\82¾\82³\82¢\81B\n"
+"\81¦\92Ê\8fí\82Í\81u\95û\96@\82Q\81v\n"
+"\81¦MODI\82Í\"Microsoft Office Document Imaging\"\82Ì\97ª\82Å\82·\n"
+"\81¦\8fã\8bL\83\8a\83\93\83N\82ª\8aJ\82¯\82È\82¢\8fê\8d\87\82Í \"MODI\" \"\83C\83\93\83X\83g\81[\83\8b\" \82È\82Ç\82Å\8c\9f\8dõ\82µ\82Ä\82Ý\82Ä\82­\82¾\82³\82¢\n"
+               );
+       }
+}
+void __fastcall TMODINotifyDialog::tmInstallCheckTimer(TObject *Sender)
+{
+       bool _modiInstalled = MODIInstalled();
+       bool _amodiRunable = AMODIRunable();
+       if (_modiInstalled && _amodiRunable){
+               // ready to go
+               Close();
+       } else {
+               if (modiInstalled!=_modiInstalled || amodiRunable!=_amodiRunable){
+                       modiInstalled = _modiInstalled;
+                       amodiRunable = _amodiRunable;
+                       SetMessage();
+               }
+       }
+}
+//---------------------------------------------------------------------------
+void TMODINotifyDialog::EvNotify( TMessage &msg )
+{
+       if (msg.WParam==reMsgId){
+               NMHDR *nmhdr = (NMHDR*)msg.LParam;
+               if (nmhdr->code==EN_LINK){
+                       ENLINK *enlink = (ENLINK*)nmhdr;
+                       if (enlink->msg == WM_LBUTTONDOWN){
+                               bool dnf = modiInstalled && !amodiRunable;
+                               HINSTANCE hInst = ShellExecute(Handle, NULL, dnf ? URL_DNF_INSTALL : URL_MODI_INSTALL, NULL, NULL, SW_SHOWNORMAL);
+                               if ((int)hInst>32){
+                                       LinkClicked = true;
+                               }
+                       }
+               }
+       }
+}
+
+
diff --git a/DCHookTest/MODINotifyDlg.dfm b/DCHookTest/MODINotifyDlg.dfm
new file mode 100644 (file)
index 0000000..49178ff
--- /dev/null
@@ -0,0 +1,44 @@
+object MODINotifyDialog: TMODINotifyDialog
+  Left = 199
+  Top = 120
+  BorderStyle = bsDialog
+  Caption = 'DokoPop!'
+  ClientHeight = 263
+  ClientWidth = 486
+  Color = clBtnFace
+  Font.Charset = SHIFTJIS_CHARSET
+  Font.Color = clWindowText
+  Font.Height = -12
+  Font.Name = '\82l\82\82o\83S\83V\83b\83N'
+  Font.Style = []
+  OldCreateOrder = False
+  OnCreate = FormCreate
+  PixelsPerInch = 96
+  TextHeight = 12
+  object reMsg: TRichEdit
+    Left = 14
+    Top = 12
+    Width = 458
+    Height = 213
+    TabStop = False
+    Anchors = [akLeft, akTop, akRight, akBottom]
+    ReadOnly = True
+    TabOrder = 0
+  end
+  object btnClose: TButton
+    Left = 206
+    Top = 233
+    Width = 75
+    Height = 25
+    Anchors = [akBottom]
+    Cancel = True
+    Caption = 'Close'
+    ModalResult = 2
+    TabOrder = 1
+  end
+  object tmInstallCheck: TTimer
+    OnTimer = tmInstallCheckTimer
+    Left = 328
+    Top = 232
+  end
+end
diff --git a/DCHookTest/MODINotifyDlg.h b/DCHookTest/MODINotifyDlg.h
new file mode 100644 (file)
index 0000000..4a50f29
--- /dev/null
@@ -0,0 +1,37 @@
+//---------------------------------------------------------------------------
+
+#ifndef MODINotifyDlgH
+#define MODINotifyDlgH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <Controls.hpp>
+#include <StdCtrls.hpp>
+#include <Forms.hpp>
+#include <ComCtrls.hpp>
+#include <ExtCtrls.hpp>
+//---------------------------------------------------------------------------
+class TMODINotifyDialog : public TForm
+{
+__published:   // IDE \8aÇ\97\9d\82Ì\83R\83\93\83|\81[\83l\83\93\83g
+       TRichEdit *reMsg;
+       TButton *btnClose;
+       TTimer *tmInstallCheck;
+       void __fastcall FormCreate(TObject *Sender);
+       void __fastcall tmInstallCheckTimer(TObject *Sender);
+private:       // \83\86\81[\83U\81[\90é\8c¾
+       BEGIN_MESSAGE_MAP
+               VCL_MESSAGE_HANDLER(WM_NOTIFY, TMessage, EvNotify);
+       END_MESSAGE_MAP( TForm )
+       void EvNotify( TMessage &msg );
+       int reMsgId;
+       bool modiInstalled;
+       bool amodiRunable;
+public:                // \83\86\81[\83U\81[\90é\8c¾
+       __fastcall TMODINotifyDialog(TComponent* Owner);
+       void SetMessage();
+       bool LinkClicked;
+};
+//---------------------------------------------------------------------------
+extern PACKAGE TMODINotifyDialog *MODINotifyDialog;
+//---------------------------------------------------------------------------
+#endif
diff --git a/DCHookTest/Notify.cpp b/DCHookTest/Notify.cpp
new file mode 100644 (file)
index 0000000..6c00977
--- /dev/null
@@ -0,0 +1,66 @@
+//---------------------------------------------------------------------------
+
+#include <vcl.h>
+#pragma hdrstop
+
+#include "Notify.h"
+namespace popenable {
+#include "popenable.h" // generated by bmp2rgn
+}
+namespace popdisable {
+#include "popdisable.h"        // generated by bmp2rgn
+}
+//---------------------------------------------------------------------------
+#pragma package(smart_init)
+#pragma resource "*.dfm"
+TNotifyForm *NotifyForm;
+//---------------------------------------------------------------------------
+__fastcall TNotifyForm::TNotifyForm(TComponent* Owner)
+       : TForm(Owner)
+{
+       hRgn = NULL;
+}
+//---------------------------------------------------------------------------
+void __fastcall TNotifyForm::FormShow(TObject *Sender)
+{
+       Setup();
+       if (hRgn)
+               DeleteObject(hRgn);
+       if (enable){
+               hRgn = ExtCreateRegion (0,
+               sizeof(popenable::bmp2rgn_rgnBytes),
+               &popenable::bmp2rgn_rgnData);
+       } else {
+               hRgn = ExtCreateRegion (0,
+               sizeof(popdisable::bmp2rgn_rgnBytes),
+               &popdisable::bmp2rgn_rgnData);
+       }
+       SetWindowRgn( Handle, hRgn, TRUE );
+}
+//---------------------------------------------------------------------------
+void TNotifyForm::Setup()
+{
+       EnableBmp->Visible = enable;
+       DisableBmp->Visible = !enable;
+       TImage *bmp = enable ? EnableBmp : DisableBmp;
+       Width = bmp->Width;
+       Height = bmp->Height;
+       bmp->Top = 0;
+       bmp->Left = 0;
+//     ReleaseCapture();
+       SetCapture( Handle );   // capture\82Å\82«\82È\82¢\81B\82È\82º\81H
+}
+void __fastcall TNotifyForm::FormMouseMove(TObject *Sender,
+         TShiftState Shift, int X, int Y)
+{
+       ReleaseCapture( );
+       Close();
+}
+//---------------------------------------------------------------------------
+void __fastcall TNotifyForm::FormDestroy(TObject *Sender)
+{
+       DeleteObject( hRgn );   
+}
+//---------------------------------------------------------------------------
+
+
diff --git a/DCHookTest/Notify.dfm b/DCHookTest/Notify.dfm
new file mode 100644 (file)
index 0000000..c5f7f0c
--- /dev/null
@@ -0,0 +1,1211 @@
+object NotifyForm: TNotifyForm
+  Left = 913
+  Top = 701
+  BorderStyle = bsNone
+  ClientHeight = 50
+  ClientWidth = 240
+  Color = cl3DLight
+  Font.Charset = SHIFTJIS_CHARSET
+  Font.Color = clWindowText
+  Font.Height = -12
+  Font.Name = '\82l\82\82o\83S\83V\83b\83N'
+  Font.Style = []
+  OldCreateOrder = False
+  OnDestroy = FormDestroy
+  OnMouseMove = FormMouseMove
+  OnShow = FormShow
+  PixelsPerInch = 96
+  TextHeight = 12
+  object EnableBmp: TImage
+    Left = 0
+    Top = 0
+    Width = 241
+    Height = 25
+    Picture.Data = {
+      07544269746D617056490000424D56490000000000003600000028000000F000
+      00001A000000010018000000000020490000C30E0000C30E0000000000000000
+      0000FDFBFDFDFBFDFDFBFDC9EC7BC9EC7BB0DE3BA3E11DA3E11DA3E11DA3E11D
+      A3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E1
+      1DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3
+      E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11D
+      A3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E1
+      1DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3
+      E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11D
+      A3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E1
+      1DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3
+      E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11D
+      A3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E1
+      1DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3
+      E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11D
+      A3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E1
+      1DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3
+      E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11D
+      A3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E1
+      1DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3
+      E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11D
+      A3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E1
+      1DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3
+      E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11D
+      ACDE30C9EC7BC9EC7BFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDC3E86CA7DF25A3E1
+      1DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3
+      E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11D
+      A3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E1
+      1DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3
+      E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11D
+      A3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E1
+      1DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3
+      E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11D
+      A3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E1
+      1DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3
+      E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11D
+      A3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E1
+      1DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3
+      E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11D
+      A3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E1
+      1DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3
+      E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11D
+      A3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E1
+      1DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3
+      E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11D
+      A3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E1
+      1DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DACDE30C9EC7BFDFBFDFD
+      FBFDFDFBFDC9EC7BA7DF25A3E11DA3E11DA3E11D96BC43779140697E3C697E3C
+      697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E
+      3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C69
+      7E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C
+      697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E
+      3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C69
+      7E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C
+      697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E
+      3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C69
+      7E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C
+      697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E
+      3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C69
+      7E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C
+      697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E
+      3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C69
+      7E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C
+      697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E
+      3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C69
+      7E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C
+      697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E
+      3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C69
+      7E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C697E3C869B39
+      A4DD21A3E11DA3E11DA7DF25C9EC7BFDFBFDC9EC7BA7DF25A3E11DA3E11DA3CD
+      479DC7419DC7418F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+      8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+      8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+      8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+      8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+      8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+      8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+      8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+      8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+      8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+      8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+      8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+      8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+      8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+      8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+      8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+      8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+      8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+      8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+      8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+      8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+      8F8F8F8F8F8F8F8F8F8F727272595959697E3C869B39A3E11DA3E11DADDE32C9
+      EC7BC2E766A3E11DA3E11DB1DB56AAD44FC0C0C0CFCFCFCFCFCFDADADADADADA
+      DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+      DADADADADADADADADADADADADADADADADBDBDBDBDBDBDBDBDBDBDBDBDADADADA
+      DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+      DADADADADADADADADADADADADADADADADADADADADADBDBDBDCDCDCDDDDDDDDDD
+      DDDDDDDDDBDBDBDADADADADADADADADADADADADADADADADADADADADADADADADA
+      DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+      DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+      DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+      DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+      DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+      DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+      DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+      DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+      DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+      DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+      DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+      DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+      DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+      DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+      DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+      DADADADADADADADADADADADADADADADADADADADADADADACFCFCFC0C0C0A2A2A2
+      818181697E3C869B39A3E11DA3E11DC9EC7BA7DF25A3E11DA7DF25BCE463E6E6
+      E6EDEBEDF5F3F5FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFD
+      FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFCFDFDFCFD
+      FEFCFEFEFCFEFEFCFEFEFCFEFDFCFDFDFCFDFDFBFDFDFBFDFDFBFDFDFBFDFDFB
+      FDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFD
+      FBFDFDFCFDFEFCFEFEFDFEFEFEFEFEFEFEFEFEFEFEFDFEFEFCFEFDFCFDFDFBFD
+      FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFB
+      FDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFCFDFDFCFDFDFBFDFDFBFDFDFBFDFD
+      FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+      FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFB
+      FDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFD
+      FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+      FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFB
+      FDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFD
+      FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+      FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFB
+      FDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFD
+      FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+      FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFB
+      FDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFD
+      FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+      FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFB
+      FDFDFBFDFDFBFDFDFBFDF5F3F5E6E6E6C0C0C0818181779140A4DD21A3E11DB0
+      DF3AA3E11DA3E11DBFE45EFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+      FDFBFDFDFBFDFDFCFDFEFDFEFEFEFEFFFEFFFFFEFFFEFEFEFEFDFEFEFCFEFEFC
+      FEFEFDFEFEFDFEFEFEFEFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FEFFFFFEFFFEFEFEFEFDFEFEFDFEFDFCFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+      FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFEFCFEFEFEFEFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFEFFFEFEFEFEFEFEFEFDFEFEFCFEFDFCFDFDFBFDFD
+      FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFEFCFEFEFDFEFEFEFE
+      FFFEFFFFFEFFFFFEFFFFFEFFFFFEFFFFFEFFFFFEFFFEFCFEFEFCFEFEFCFEFEFC
+      FEFDFCFDFDFCFDFDFCFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFD
+      FBFDFDFBFDFEFCFEFEFCFEFEFCFEFEFCFEFDFCFDFDFCFDFDFBFDFDFBFDFDFBFD
+      FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFCFDFDFBFDFDFBFDFDFBFDFDFBFDFDFB
+      FDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFD
+      FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+      FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFB
+      FDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFD
+      FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+      FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFC
+      FDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFD
+      FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFCFDFEFCFEFEFDFEFEFDFEFEFDFEFEFDFE
+      FEFDFEFEFDFEFDFCFDFDFCFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFB
+      FDFDFCFDFDFCFDFEFCFEFEFDFEFEFDFEFEFDFEFEFDFEFEFCFEFDFCFDFDFCFDFD
+      FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+      E6E6E6B4B4B48181818CAE44A3E11DA3E11DA3E11DA3E11DC9EC7BFDFBFDFDFB
+      FDFDFBFDFDFBFDFDFBFDFDFBFDFDFCFDFEFDFEFEFEFEFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE
+      FFFEFEFEFEFDFEFDFCFDFDFBFDFDFBFDFDFBFDFDFBFDFDFCFDFDFCFDFEFCFEFF
+      FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFEFFFEFEFEFEFEFEFEFDFEFEFDFEFEFD
+      FEFEFDFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFF
+      FFFEFFFFFEFFFEFEFEFEFDFEFEFDFEFEFEFEFFFEFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFEFFFEFDFEFEFDFEFEFCFEFDFCFDFDFCFDFEFCFEFEFDFEFFFEFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFEFFFEFEFEFEFEFEFEFEFE
+      FEFEFEFEFEFEFEFEFEFEFDFEFEFDFEFEFDFEFEFCFEFDFCFDFEFCFEFEFDFEFCFC
+      FCFBFBFBFFFFFFFFFFFFFFFFFFFEFEFEFFFFFFFFFFFFFFFFFFFFFEFFFEFEFEFA
+      FAFAFCFCFCFEFEFEFCFCFCFDFCFDFFFEFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFEFFFEFEFEFEFDFEFDFCFDFDFBFDFDFBFDFDFBFDFDFB
+      FDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDF5F3F5CFCFCF8F8F8F8CAE44A3E11DA3
+      E11DA3E11DA3E11DC9EC7BFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFEFCFEFFFEFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFEFEFEFFFFFFFFFEFFFEFEFEFEFEFE
+      FEFEFEFFFEFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFBBBBBBBBBBBBBBBBBBDDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFDFDFDFDFDFDFE
+      FEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFEFFFEFDFEFEFCFEFDFCFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+      FDFBFDDADADAB4B4B496BC43A3E11DA3E11DA3E11DA3E11DC9EC7BFDFBFDFDFB
+      FDFDFBFDFDFBFDFEFDFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF999999DDDDDDFFFFFFFFFFFFFFFFFF
+      FFFFFF888888FFFFFFFFFFFFFFFFFFFFFFFFEEEEEE555555888888FFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEEEEEE44
+      4444888888FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      777777888888EEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEEEE
+      EE555555888888FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFF444444BBBBBB333333666666DDDDDDFFFFFFFFFFFFDDDDDD666666DDDDDD
+      FFFFFF555555888888FFFFFFFFFFFF888888888888FFFFFFFFFFFF9999998888
+      88FFFFFFFFFFFFFFFFFFFFFFFF99999911111100000000000000000000000088
+      8888FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF888888888888FFFFFFFFFF
+      FF999999000000888888FFFFFFFFFFFFDDDDDD888888FFFFFFFFFFFFBBBBBB33
+      3333CCCCCCFFFFFF888888444444888888FFFFFFFFFFFF444444444444222222
+      888888FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDD
+      DDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFCCCCCC888888888888999999EEEEEEFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFEEEEEE666666444444777777EEEEEEFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCCCCCC888888888888999999EEEEEEFF
+      FFFFFFFFFFFFFFFFFFFFFFDDDDDDAAAAAAFFFFFFFFFFFFFFFFFFEEEEEEBBBBBB
+      999999888888999999FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFEFD
+      FEFEFCFEFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDE6E6E6B4B4B496BC43A3E11DA3
+      E11DA3E11DA3E11DC9EC7BFDFBFDFDFBFDFDFBFDFEFCFEFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FF444444000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFF999999222222333333DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAAAAAA111111666666FFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBBBBBB666666111111BBBBBBFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF999999222222333333DDDDDDFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF444444BBBBBBEEEEEE8888882222
+      22CCCCCC999999111111777777DDDDDDFFFFFFBBBBBB333333666666FFFFFF88
+      8888888888EEEEEE333333222222999999FFFFFFFFFFFFFFFFFFFFFFFF111111
+      CCCCCCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFF888888888888FFFFFFFFFFFFFFFFFF888888888888FFFFFFFFFFFF
+      DDDDDD333333444444EEEEEEDDDDDD888888111111CCCCCCCCCCCCBBBBBB0000
+      00FFFFFFFFFFFFFFFFFFFFFFFF888888888888FFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFF888888888888FFFFFFFFFFFFFFFFFFDDDDDDAAAAAA
+      888888888888999999FFFFFFFFFFFFFFFFFFFFFFFF9999991111117777778888
+      88333333111111AAAAAAFFFFFFFFFFFFFFFFFFFFFFFF666666888888EEEEEE66
+      6666777777FFFFFFEEEEEE888888DDDDDDFFFFFFFFFFFFFFFFFFFFFFFF999999
+      111111777777888888333333111111AAAAAAFFFFFFFFFFFFFFFFFFBBBBBB2222
+      22FFFFFFFFFFFF999999111111444444777777888888999999FFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFDFEFDFBFDFDFBFDFDFBFD
+      FDFBFDE6E6E6B4B4B49DC741A3E11DA3E11DA3E11DA3E11DC9EC7BFDFBFDFDFB
+      FDFDFCFDFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFCCCCCCFFFFFF444444BBBBBBFFFFFFFFFFFFFFFFFF
+      FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEEEEEE6666661111
+      11DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFCCCCCC000000AAAAAAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFBBBBBB111111AAAAAAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFEEEEEE666666111111DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFEEEEEEDD
+      DDDD444444BBBBBBFFFFFFCCCCCCBBBBBB222222333333EEEEEECCCCCCFFFFFF
+      FFFFFFEEEEEEFFFFFF888888CCCCCC888888888888BBBBBB777777EEEEEEEEEE
+      EEFFFFFFFFFFFFFFFFFFFFFFFF222222888888FFFFFF777777CCCCCCFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBBBBBB
+      BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8888882222224444444444
+      44444444222222888888FFFFFFFFFFFFFFFFFFFFFFFF66666633333333333399
+      9999999999222222EEEEEEFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF888888
+      888888FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8888888888
+      88FFFFFFEEEEEE444444222222666666888888888888999999FFFFFFFFFFFFFF
+      FFFFFFFFFF111111999999FFFFFFFFFFFFFFFFFFAAAAAA111111AAAAAAFFFFFF
+      FFFFFFFFFFFF666666888888EEEEEEAAAAAA222222666666111111666666CCCC
+      CCFFFFFFFFFFFFFFFFFFFFFFFF111111999999FFFFFFFFFFFFFFFFFFAAAAAA11
+      1111AAAAAAFFFFFFFFFFFFFFFFFF222222CCCCCCFFFFFFEEEEEEFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFEFDFEFDFBFDFDFBFDFDFBFDE6E6E6B4B4B496BC43A3E11DA3
+      E11DA3E11DA3E11DC9EC7BFDFBFDFDFBFDFEFDFEFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBBBBBB1111119999
+      99444444BBBBBBFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFF666666333333FFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF666666555555FFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBBBBBB111111EE
+      EEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF666666333333
+      FFFFFFFFFFFFFFFFFFFFFFFFAAAAAA444444444444BBBBBBFFFFFF1111114444
+      44111111333333444444444444FFFFFFFFFFFF99999922222200000000000022
+      2222222222444444444444333333888888FFFFFFFFFFFFFFFFFFFFFFFFCCCCCC
+      333333888888333333BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFF888888888888FFFFFFFFFFFFFFFFFFEEEEEE77
+      7777EEEEEE888888666666BBBBBBBBBBBBBBBBBB666666888888FFFFFFFFFFFF
+      FFFFFFFFFFFFEEEEEE111111444444FFFFFFFFFFFF444444999999FFFFFF0000
+      00FFFFFFFFFFFFFFFFFFFFFFFF888888888888FFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFF888888888888FFFFFFEEEEEE888888FFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000BBBBBBFFFFFFFFFF
+      FFFFFFFFFFFFFFCCCCCCEEEEEEFFFFFFFFFFFFFFFFFFEEEEEE66666644444433
+      3333222222999999EEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000
+      BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFCCCCCCEEEEEEFFFFFFFFFFFFFFFFFF7777
+      77888888FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFCFDFDFBFD
+      FBF9FBE6E6E6B4B4B49DC741A3E11DA3E11DA3E11DA3E11DC9EC7BFDFBFDFDFC
+      FDFBFAFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFCCCCCC111111222222888888BBBBBBBBBBBBBBBBBB
+      BBBBBB000000FFFFFFFFFFFFFFFFFFEEEEEEDDDDDDFFFFFFFFFFFFFFFFFFEEEE
+      EE222222888888FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBBBBBB000000FFFFFFFF
+      FFFFFFFFFF888888222222FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF999999
+      DDDDDDFFFFFFFFFFFFFFFFFF555555999999FFFFFFFFFFFFFFFFFFEEEEEEDDDD
+      DDFFFFFFFFFFFFFFFFFFEEEEEE222222888888FFFFFFFFFFFFFFFFFFFFFFFF44
+      4444111111666666AAAAAA444444FFFFFF444444BBBBBBFFFFFF444444FFFFFF
+      FFFFFFFFFFFFFFFFFFCCCCCC333333222222666666DDDDDD333333888888FFFF
+      FFFFFFFFFFFFFFEEEEEE666666DDDDDDFFFFFF888888111111444444999999EE
+      EEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF888888
+      888888FFFFFFFFFFFFFFFFFFEEEEEE5555553333337777772222224444444444
+      44444444222222888888FFFFFFFFFFFFFFFFFFFFFFFF555555888888222222EE
+      EEEEFFFFFF999999555555FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF888888
+      888888FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8888888888
+      88FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFF000000BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBBBBBB444444FFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFF000000BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFBBBBBB444444FFFFFFFFFFFFEEEEEEFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFAF9FAF5F4F5F5F3F5E6E6E6B4B4B496BC43A3E11DA3
+      E11DA3E11DA3E11DC9EC7BFDFBFDFDFCFDFDFCFDFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCCCC
+      CC000000333333444444444444444444444444444444FFFFFFFFFFFFFFFFFFAA
+      AAAA111111CCCCCCFFFFFFFFFFFFFFFFFF999999222222FFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFBBBBBB000000FFFFFFFFFFFFFFFFFFBBBBBB000000FFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFDDDDDD000000DDDDDD999999888888FFFFFF88888855
+      5555FFFFFFFFFFFFFFFFFFAAAAAA111111CCCCCCFFFFFFFFFFFFFFFFFF999999
+      222222FFFFFFFFFFFFFFFFFFFFFFFFAAAAAA000000444444DDDDDD1111114444
+      44111111333333444444444444FFFFFFFFFFFFBBBBBBEEEEEE333333222222CC
+      CCCC888888333333DDDDDDEEEEEECCCCCCFFFFFFFFFFFFFFFFFF888888111111
+      888888BBBBBB222222888888666666111111666666FFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFF888888888888FFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFF888888000000666666BBBBBBBBBBBBBBBBBB666666888888FFFFFFFFFFFF
+      DDDDDD333333CCCCCCFFFFFF999999AAAAAA999999BBBBBB444444FFFFFF0000
+      00FFFFFFFFFFFFFFFFFFFFFFFF888888888888FFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFF888888888888FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000BBBBBBFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44444400000044444433
+      3333111111444444444444777777FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000
+      BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FF000000FFFFFFFFFFFF222222222222555555888888BBBBBBFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCF6F4F6
+      F5F3F5E6E6E6B4B4B496BC43A3E11DA3E11DA3E11DA3E11DC9EC7BFDFBFDFEFC
+      FEFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF888888888888FFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF888888333333FFFFFFFFFFFFFFFF
+      FFEEEEEE000000CCCCCCFFFFFFFFFFFFFFFFFFFFFFFFBBBBBB000000FFFFFFFF
+      FFFFFFFFFFBBBBBB000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF999999777777
+      FFFFFF222222999999FFFFFFBBBBBB333333FFFFFFFFFFFFFFFFFFFFFFFF8888
+      88333333FFFFFFFFFFFFFFFFFFEEEEEE000000CCCCCCFFFFFFFFFFFFFFFFFFFF
+      FFFF111111BBBBBBEEEEEEDDDDDDBBBBBB333333888888CCCCCCFFFFFFFFFFFF
+      FFFFFF000000FFFFFFFFFFFFCCCCCC111111CCCCCCCCCCCCFFFFFFBBBBBB4444
+      44FFFFFFFFFFFFFFFFFFFFFFFF999999000000777777888888FFFFFFFFFFFFFF
+      FFFFDDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF888888
+      888888FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6666660000000000000000
+      00000000000000888888FFFFFFFFFFFFFFFFFF999999111111CCCCCCCCCCCC11
+      1111888888888888333333BBBBBB000000FFFFFFFFFFFFFFFFFFFFFFFF888888
+      888888FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8888888888
+      88FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFF000000BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBBBBBB333333BBBBBBBBBBBBCCCCCCFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFF000000BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF333333CCCCCCFFFFFFFFFFFFCCCCCC
+      AAAAAA888888CCCCCCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFDFCFDF6F4F6F5F3F5DADADAB4B4B49DC741A3E11DA3
+      E11DA3E11DA3E11DC9EC7BFDFBFDFEFCFEFDFDFDFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEEEEEEBBBBBBBBBB
+      BBAAAAAA111111BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBFFFFFFFFFFFFFF
+      FFFFFFFFFF444444555555888888888888888888222222888888FFFFFFFFFFFF
+      FFFFFFFFFFFFBBBBBB000000FFFFFFFFFFFFFFFFFFBBBBBB000000FFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEEEEEE999999FFFFFFFFFFFFDDDDDDCC
+      CCCCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF444444555555888888888888888888
+      222222888888FFFFFFFFFFFFCCCCCC4444441111113333331111113333337777
+      77888888888888555555222222CCCCCCFFFFFF44444444444444444444444422
+      2222222222444444444444444444777777FFFFFFFFFFFFFFFFFFBBBBBBBBBBBB
+      666666777777FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFF888888888888FFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFEEEEEE111111DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFAAAAAACCCCCCCCCCCC999999CCCCCC3333331111114444444444
+      44FFFFFFFFFFFFFFFFFFFFFFFF888888888888FFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFF888888555555FFFFFFFFFFFF666666888888888888
+      888888888888DDDDDDFFFFFFFFFFFFFFFFFFFFFFFF000000BBBBBBFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBBBBBBBBBBBBBBBBBBBBBBBB88
+      8888333333DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000
+      BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6666662222
+      22000000222222444444BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCF6F4F6
+      F5F3F5E6E6E6B4B4B496BC43A3E11DA3E11DA3E11DA3E11DC9EC7BFDFBFDFDFC
+      FDFCFBFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFCCCCCC444444444444444444111111333333444444444444
+      444444444444444444FFFFFFFFFFFFFFFFFFFFFFFFBBBBBB0000008888888888
+      88888888777777EEEEEEFFFFFFFFFFFFFFFFFFFFFFFFBBBBBB000000FFFFFFFF
+      FFFFFFFFFFBBBBBB000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFBBBBBB000000888888888888888888777777EEEEEEFFFFFFFFFFFFEEEEEEBB
+      BBBB333333888888DDDDDD777777333333EEEEEE999999222222BBBBBBFFFFFF
+      FFFFFFBBBBBB888888888888888888444444444444888888888888888888BBBB
+      BBFFFFFFFFFFFFFFFFFF44444444444444444400000022222200000033333399
+      9999FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF888888
+      888888FFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000
+      00000000000000000000000000BBBBBBBBBBBB00000000000000000000000000
+      0000444444BBBBBB444444FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDD
+      DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBBBBBB4444
+      44FFFFFFFFFFFF999999888888888888888888888888DDDDDDFFFFFFFFFFFFFF
+      FFFFFFFFFF000000BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFBBBBBB8888887777774444443333331111114444444444441111118888
+      88FFFFFFFFFFFFFFFFFFFFFFFF000000BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF888888888888BBBBBBCCCCCCFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFAF9FAF5F4F5F5F3F5DADADAB9B9B99DC741A3E11DA3
+      E11DA3E11DA3E11DC9EC7BFDFBFDFDFBFDFAF8FAFEFEFEFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFF888888777777FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFF333333888888FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFDDDDDD888888DDDDDDFFFFFFFFFFFFCCCCCC444444FFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF333333888888FFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF444444BBBBBBFFFFFFFFFFFF8888
+      88333333666666EEEEEEFFFFFFFFFFFFFFFFFFBBBBBB88888888888888888844
+      4444444444888888888888888888BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFF555555999999FFFFFFEEEEEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFF888888666666BBBBBBBBBBBBFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFF888888666666FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFF444444BBBBBBFFFFFFFFFFFFBBBBBB444444FFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFDDDDDD555555FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000BBBBBBFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB
+      BBBB444444FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000
+      BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FF999999555555FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEF7F6F7F5F3F5
+      F5F3F5E6E6E6C0C0C0A3CD47A3E11DA3E11DA3E11DA3E11DBFE45EFDFBFDFDFB
+      FDF7F6F7FCFBFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCCCCCC999999FFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDEEEEEEFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFDDDDDDEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFF999999DDDDDDFFFFFFFFFFFFFFFFFF666666EEEEEEFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF999999999999FFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAAAAAAAAAAAAFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF999999
+      444444444444444444FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCCCCCC888888FFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF777777BBBBBBFF
+      FFFFFFFFFFDDDDDD888888FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDD888888FFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDAAAAAAFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFAF8FAF6F4F6F5F3F5F5F3F5E6E6E6B1DB56A8D34DA3E11DA3
+      E11DA7DF25A3E11DADDE32C9EC7BFDFBFDFBF9FBF8F6F8FCFBFCFFFEFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFEFEFEFEFEFEFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFAF8FAF6F4F6F5F3F5F5F3F5
+      F5F3F5EDEBEDB1DB56A3E11DA3E11DB0DF3ABBE255A3E11DA3E11DC9EC7BC9EC
+      7BFDFBFDFBF9FBF7F6F7FAF9FAFCFCFCFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFF
+      FFFEFFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFDFEFEFE
+      FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFDFDFDFDFCFDFCFBFCFC
+      FBFCFCFBFCFDFCFDFDFCFDFDFCFDFDFCFDFCFCFCFCFBFCFCFBFCFBFAFBFBFAFB
+      FAF9FAF9F8F9F9F8F9F9F7F9F9F7F9F9F8F9FAF8FAFAF9FAFAFAFAFBFAFBFBFA
+      FBFBFAFBFCFBFCFCFCFCFDFCFDFDFDFDFEFDFEFEFEFEFEFEFEFEFEFEFEFEFEFE
+      FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
+      FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFEFFFEFEFEFEFE
+      FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFEFF
+      FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFEFFFFFE
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FEFFFEFEFEFEFEFEFEFEFEFEFEFEFEFDFEFEFDFEFDFDFDFDFDFDFDFDFDFEFDFE
+      FEFDFEFDFDFDFDFCFDFCFBFCFBFAFBFBFAFBFCFBFCFDFCFDFDFDFDFCFCFCFAF9
+      FAF7F6F7F6F4F6F5F3F5F5F3F5F5F3F5F5F3F5C2E86FB1DF41A3E11DA3E11DC9
+      EC7BC9EC7BA4E01FA3E11DA3E11DC6EA72C9EC7BFDFBFDFDFBFDFDFBFDFDFCFD
+      FEFCFEFEFDFEFEFDFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
+      FEFEFEFEFEFEFEFEFDFEFEFDFEFEFDFEFEFDFEFEFCFEFEFCFEFEFCFEFEFCFEFD
+      FCFDFDFCFDFDFCFDFDFCFDFDFCFDFDFCFDFDFCFDFDFCFDFDFCFDFDFCFDFDFCFD
+      FDFCFDFDFCFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFB
+      FDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFD
+      FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+      FDFCFDFDFCFDFDFCFDFEFCFEFEFCFEFEFCFEFEFCFEFDFCFDFDFCFDFDFCFDFDFC
+      FDFDFCFDFDFCFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFD
+      FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFEFCFEFEFCFE
+      FEFCFEFEFCFEFEFCFEFEFCFEFEFCFEFEFDFEFEFDFEFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFDFBFDFDFBFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFDFEFEFD
+      FEFEFDFEFEFDFEFEFDFEFEFDFEFEFDFEFEFDFEFEFCFEFEFCFEFEFCFEFEFCFEFE
+      FCFEFEFCFEFEFCFEFEFCFEFEFCFEFEFCFEFEFCFEFEFCFEFDFCFDFDFCFDFDFCFD
+      FDFCFDFDFCFDFDFCFDFDFCFDFDFCFDFDFCFDFDFCFDFDFCFDFDFCFDFDFCFDFDFC
+      FDFDFBFDFDFBFDFDFBFDFDFCFDFDFCFDFDFCFDFDFCFDFDFBFDFDFBFDFDFBFDFD
+      FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+      C7EB78BCE258A3E11DA3E11DACDE30C9EC7BFDFBFDC3E86CA4E01FA3E11DA3E1
+      1DB0DE3BC3E86CC9EC7BC9EC7BC8EC7BC9EC7BC9EC7BC9ED7BC9EC7CC9EC7CC9
+      EC7CC9EC7BC9EC7BC9EC7BC9EC7CC9EC7BC9EC7CC9EC7BC8EC7AC9EC7BC9EC7B
+      C9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC8EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC
+      7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9
+      EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7B
+      C9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC
+      7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9
+      EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7B
+      C9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC
+      7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9
+      EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7B
+      C9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC
+      7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9
+      EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7B
+      C9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC
+      7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9
+      EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC8EC7AC9EC7BC9EC7BC9EC7B
+      C9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC
+      7BC8EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9
+      EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7B
+      C9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC7BC9EC
+      7BC9EC7BC9EC7BC9EC7BC9EC7BC2E766A7DF25A3E11DA3E11DA7DF25C9EC7BFD
+      FBFDFDFBFDFDFBFDC3E86CA4E01FA3E11DA3E11DA3E11DA3E11DA3E11DA3E11D
+      A3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E1
+      1DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3
+      E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11D
+      A3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E1
+      1DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3
+      E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11D
+      A3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E1
+      1DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3
+      E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11D
+      A3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E1
+      1DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3
+      E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11D
+      A3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E1
+      1DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3
+      E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11D
+      A3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E1
+      1DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3
+      E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11D
+      A3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E1
+      1DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3
+      E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11D
+      A3E11DA3E11DA9DF2AC9EC7BFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDC9EC7BB9E2
+      50A7DF25A3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3
+      E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11D
+      A3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E1
+      1DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3
+      E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11D
+      A3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E1
+      1DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3
+      E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11D
+      A3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E1
+      1DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3
+      E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11D
+      A3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E1
+      1DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3
+      E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11D
+      A3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E1
+      1DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3
+      E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11D
+      A3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E1
+      1DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3
+      E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11D
+      A3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E11DA3E1
+      1DA3E11DA3E11DA3E11DA3E11DA3E11DA7DF25C2E766C9EC7BFDFBFDFDFBFDFD
+      FBFD}
+    Visible = False
+  end
+  object DisableBmp: TImage
+    Left = 0
+    Top = 24
+    Width = 241
+    Height = 25
+    Picture.Data = {
+      07544269746D617056490000424D56490000000000003600000028000000F000
+      00001A000000010018000000000020490000C30E0000C30E0000000000000000
+      0000FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDF1CFCDEAAEA4E9958DE9958DE9958D
+      E9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE995
+      8DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9
+      958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958D
+      E9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE995
+      8DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9
+      958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958D
+      E9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE995
+      8DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9
+      958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958D
+      E9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE995
+      8DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9
+      958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958D
+      E9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE995
+      8DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9
+      958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958D
+      E9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE995
+      8DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9
+      958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958D
+      E9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE995
+      8DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9
+      958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DEAAEA4
+      EFC5C2FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFBF3F3EBBAB6E89B
+      96E9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9
+      958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958D
+      E9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE995
+      8DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9
+      958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958D
+      E9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE995
+      8DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9
+      958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958D
+      E9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE995
+      8DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9
+      958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958D
+      E9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE995
+      8DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9
+      958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958D
+      E9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE995
+      8DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9
+      958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958D
+      E9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE995
+      8DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9
+      958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958D
+      E9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE995
+      8DE9958DE2928DE38E8AE38E8AE38E8AE9958DEAA39EEFC5C2FDFBFDFDFBFDFD
+      FBFDFDFBFDFDFBFDEBBAB6E9958DE9958DCD8F898181815959594C4C4C4C4C4C
+      4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C
+      4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C
+      4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C
+      4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C
+      4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C
+      4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C
+      4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C
+      4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C
+      4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C
+      4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C
+      4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C
+      4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C
+      4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C
+      4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C
+      4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C
+      4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C
+      4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C
+      4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C
+      4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C
+      4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C
+      4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C6A5654
+      C2837DE2928DE9958DEBBAB6FDFBFDFDFBFDFDFBFDEBBAB6E9958DE9958DA2A2
+      A28F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+      8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+      8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+      8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+      8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+      8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+      8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+      8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+      8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+      8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+      8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+      8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+      8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+      8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+      8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+      8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+      8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+      8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+      8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+      8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+      8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F
+      8F8F8F8F8F8F8F8F8F8F7272725959594C4C4C6A5654E38E8AE9958DF0CCC3FD
+      FBFDFBF1EFE39592E9958DCFCFCFB9B9B9C0C0C0CFCFCFCFCFCFDADADADADADA
+      DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+      DADADADADADADADADADADADADADADADADBDBDBDBDBDBDBDBDBDBDBDBDADADADA
+      DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+      DADADADADADADADADADADADADADADADADADADADADADBDBDBDCDCDCDDDDDDDDDD
+      DDDDDDDDDBDBDBDADADADADADADADADADADADADADADADADADADADADADADADADA
+      DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+      DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+      DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+      DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+      DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+      DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+      DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+      DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+      DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+      DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+      DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+      DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+      DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+      DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+      DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA
+      DADADADADADADADADADADADADADADADADADADADADADADACFCFCFC0C0C0A2A2A2
+      8181814C4C4C6A5654E9958DEAA39EFDFBFDEBBAB6E9958DEBBAB6EDEBEDE6E6
+      E6EDEBEDF5F3F5FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFD
+      FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFCFDFDFCFD
+      FEFCFEFEFCFEFEFCFEFEFCFEFDFCFDFDFCFDFDFBFDFDFBFDFDFBFDFDFBFDFDFB
+      FDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFD
+      FBFDFDFCFDFEFCFEFEFDFEFEFEFEFEFEFEFEFEFEFEFDFEFEFCFEFDFCFDFDFBFD
+      FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFB
+      FDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFCFDFDFCFDFDFBFDFDFBFDFDFBFDFD
+      FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+      FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFB
+      FDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFD
+      FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+      FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFB
+      FDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFD
+      FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+      FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFB
+      FDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFD
+      FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+      FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFB
+      FDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFD
+      FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+      FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFB
+      FDFDFBFDFDFBFDFDFBFDF5F3F5E6E6E6C0C0C0818181595959C2837DE9958DF3
+      D4CBEAA39EE9958DFBEBE9FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+      FDFBFDFDFBFDFDFCFDFEFDFEFEFEFEFFFEFFFFFEFFFEFEFEFEFDFEFEFCFEFEFC
+      FEFEFDFEFEFDFEFEFEFEFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FEFFFFFEFFFEFEFEFEFDFEFEFDFEFDFCFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+      FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFEFCFEFEFEFEFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFEFFFEFEFEFEFEFEFEFDFEFEFCFEFDFCFDFDFBFDFD
+      FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFEFCFEFEFDFEFEFEFE
+      FFFEFFFFFEFFFFFEFFFFFEFFFFFEFFFFFEFFFFFEFFFEFCFEFEFCFEFEFCFEFEFC
+      FEFDFCFDFDFCFDFDFCFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFD
+      FBFDFDFBFDFEFCFEFEFCFEFEFCFEFEFCFEFDFCFDFDFCFDFDFBFDFDFBFDFDFBFD
+      FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFCFDFDFBFDFDFBFDFDFBFDFDFBFDFDFB
+      FDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFD
+      FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+      FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFB
+      FDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFD
+      FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+      FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFC
+      FDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFD
+      FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFCFDFEFCFEFEFDFEFEFDFEFEFDFEFEFDFE
+      FEFDFEFEFDFEFDFCFDFDFCFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFB
+      FDFDFCFDFDFCFDFEFCFEFEFDFEFEFDFEFEFDFEFEFDFEFEFCFEFDFCFDFDFCFDFD
+      FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+      E6E6E6B4B4B4818181727272E9958DEBAFABE9958DE9958DFDFBFDFDFBFDFDFB
+      FDFDFBFDFDFBFDFDFBFDFDFBFDFDFCFDFEFDFEFEFEFEFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE
+      FFFEFEFEFEFDFEFDFCFDFDFBFDFDFBFDFDFBFDFDFBFDFDFCFDFDFCFDFEFCFEFF
+      FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFEFFFEFEFEFEFEFEFEFDFEFEFDFEFEFD
+      FEFEFDFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFF
+      FFFEFFFFFEFFFEFEFEFEFDFEFEFDFEFEFEFEFFFEFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFEFFFEFDFEFEFDFEFEFCFEFDFCFDFDFCFDFEFCFEFEFDFEFFFEFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFEFFFEFEFEFEFEFEFEFEFE
+      FEFEFEFEFEFEFEFEFEFEFDFEFEFDFEFEFDFEFEFCFEFDFCFDFEFCFEFEFDFEFCFC
+      FCFBFBFBFFFFFFFFFFFFFFFFFFFEFEFEFFFFFFFFFFFFFFFFFFFFFEFFFEFEFEFA
+      FAFAFCFCFCFEFEFEFCFCFCFDFCFDFFFEFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFEFFFEFEFEFEFDFEFDFCFDFDFBFDFDFBFDFDFBFDFDFB
+      FDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDF5F3F5CFCFCF8F8F8F727272E9958DE9
+      958DE9958DE9958DFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFEFCFEFFFEFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFEFEFEFFFFFFFFFEFFFEFEFEFEFEFE
+      FEFEFEFFFEFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFBBBBBBBBBBBBBBBBBBDDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFDFDFDFDFDFDFE
+      FEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFEFFFEFDFEFEFCFEFDFCFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+      FDFBFDDADADAB4B4B4818181E9958DE9958DE9958DE9958DFDFBFDFDFBFDFDFB
+      FDFDFBFDFDFBFDFEFDFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF999999DDDDDDFFFFFFFFFFFFFFFFFF
+      FFFFFF888888FFFFFFFFFFFFFFFFFFFFFFFFEEEEEE555555888888FFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEEEEEE44
+      4444888888FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      777777888888EEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEEEE
+      EE555555888888FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFF444444BBBBBB333333666666DDDDDDFFFFFFFFFFFFDDDDDD666666DDDDDD
+      FFFFFF555555888888FFFFFFFFFFFF888888888888FFFFFFFFFFFF9999998888
+      88FFFFFFFFFFFFFFFFFFFFFFFF99999911111100000000000000000000000088
+      8888FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF777777CCCCCCFFFFFF999999999999FFFF
+      FF777777FFFFFFEEEEEE999999FFFFFFDDDDDD888888FFFFFFFFFFFFBBBBBB33
+      3333CCCCCCFFFFFF888888444444888888FFFFFFFFFFFF444444444444222222
+      888888FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDDDDD
+      DDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFCCCCCC888888888888999999EEEEEEFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFEEEEEE666666444444777777EEEEEEFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCCCCCC888888888888999999EEEEEEFF
+      FFFFFFFFFFFFFFFFFFFFFFDDDDDDAAAAAAFFFFFFFFFFFFFFFFFFEEEEEEBBBBBB
+      999999888888999999FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFEFD
+      FEFEFCFEFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDE6E6E6B4B4B4818181E9958DE9
+      958DE9958DE9958DFDFBFDFDFBFDFDFBFDFDFBFDFEFCFEFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FF444444000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFF999999222222333333DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAAAAAA111111666666FFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBBBBBB666666111111BBBBBBFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF999999222222333333DDDDDDFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF444444BBBBBBEEEEEE8888882222
+      22CCCCCC999999111111777777DDDDDDFFFFFFBBBBBB333333666666FFFFFF88
+      8888888888EEEEEE333333222222999999FFFFFFFFFFFFFFFFFFFFFFFF111111
+      CCCCCCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88
+      8888333333FFFFFF888888888888CCCCCC222222FFFFFF666666555555FFFFFF
+      DDDDDD333333444444EEEEEEDDDDDD888888111111CCCCCCCCCCCCBBBBBB0000
+      00FFFFFFFFFFFFFFFFFFFFFFFF888888888888FFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFF888888888888FFFFFFFFFFFFFFFFFFDDDDDDAAAAAA
+      888888888888999999FFFFFFFFFFFFFFFFFFFFFFFF9999991111117777778888
+      88333333111111AAAAAAFFFFFFFFFFFFFFFFFFFFFFFF666666888888EEEEEE66
+      6666777777FFFFFFEEEEEE888888DDDDDDFFFFFFFFFFFFFFFFFFFFFFFF999999
+      111111777777888888333333111111AAAAAAFFFFFFFFFFFFFFFFFFBBBBBB2222
+      22FFFFFFFFFFFF999999111111444444777777888888999999FFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFDFEFDFBFDFDFBFDFDFBFD
+      FDFBFDE6E6E6B4B4B48F8F8FE9958DE9958DE9958DE9958DFDFBFDFDFBFDFDFB
+      FDFDFCFDFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFCCCCCCFFFFFF444444BBBBBBFFFFFFFFFFFFFFFFFF
+      FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEEEEEE6666661111
+      11DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFCCCCCC000000AAAAAAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFBBBBBB111111AAAAAAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFEEEEEE666666111111DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFEEEEEEDD
+      DDDD444444BBBBBBFFFFFFCCCCCCBBBBBB222222333333EEEEEECCCCCCFFFFFF
+      FFFFFFEEEEEEFFFFFF888888CCCCCC888888888888BBBBBB777777EEEEEEEEEE
+      EEFFFFFFFFFFFFFFFFFFFFFFFF222222888888FFFFFF777777CCCCCCFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBBBBBB
+      BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF444444AAAAAA444444AAAAAAAAAA
+      AA777777BBBBBB333333EEEEEEFFFFFFFFFFFFFFFFFF66666633333333333399
+      9999999999222222EEEEEEFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF888888
+      888888FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8888888888
+      88FFFFFFEEEEEE444444222222666666888888888888999999FFFFFFFFFFFFFF
+      FFFFFFFFFF111111999999FFFFFFFFFFFFFFFFFFAAAAAA111111AAAAAAFFFFFF
+      FFFFFFFFFFFF666666888888EEEEEEAAAAAA222222666666111111666666CCCC
+      CCFFFFFFFFFFFFFFFFFFFFFFFF111111999999FFFFFFFFFFFFFFFFFFAAAAAA11
+      1111AAAAAAFFFFFFFFFFFFFFFFFF222222CCCCCCFFFFFFEEEEEEFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFEFDFEFDFBFDFDFBFDFDFBFDE6E6E6B4B4B4818181E9958DE9
+      958DE9958DE9958DFDFBFDFDFBFDFDFBFDFEFDFEFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBBBBBB1111119999
+      99444444BBBBBBFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFF666666333333FFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF666666555555FFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBBBBBB111111EE
+      EEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF666666333333
+      FFFFFFFFFFFFFFFFFFFFFFFFAAAAAA444444444444BBBBBBFFFFFF1111114444
+      44111111333333444444444444FFFFFFFFFFFF99999922222200000000000022
+      2222222222444444444444333333888888FFFFFFFFFFFFFFFFFFFFFFFFCCCCCC
+      333333888888333333BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFF888888888888FFFFFFFFFFFFFFFFFFFFFFFF44
+      4444444444444444444444444444444444444444444444444444444444FFFFFF
+      FFFFFFFFFFFFEEEEEE111111444444FFFFFFFFFFFF444444999999FFFFFF0000
+      00FFFFFFFFFFFFFFFFFFFFFFFF888888888888FFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFF888888888888FFFFFFEEEEEE888888FFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000BBBBBBFFFFFFFFFF
+      FFFFFFFFFFFFFFCCCCCCEEEEEEFFFFFFFFFFFFFFFFFFEEEEEE66666644444433
+      3333222222999999EEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000
+      BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFCCCCCCEEEEEEFFFFFFFFFFFFFFFFFF7777
+      77888888FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFCFDFDFBFD
+      FBF9FBE6E6E6B4B4B48F8F8FE9958DE9958DE9958DE9958DFDFBFDFDFBFDFDFC
+      FDFBFAFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFCCCCCC111111222222888888BBBBBBBBBBBBBBBBBB
+      BBBBBB000000FFFFFFFFFFFFFFFFFFEEEEEEDDDDDDFFFFFFFFFFFFFFFFFFEEEE
+      EE222222888888FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBBBBBB000000FFFFFFFF
+      FFFFFFFFFF888888222222FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF999999
+      DDDDDDFFFFFFFFFFFFFFFFFF555555999999FFFFFFFFFFFFFFFFFFEEEEEEDDDD
+      DDFFFFFFFFFFFFFFFFFFEEEEEE222222888888FFFFFFFFFFFFFFFFFFFFFFFF44
+      4444111111666666AAAAAA444444FFFFFF444444BBBBBBFFFFFF444444FFFFFF
+      FFFFFFFFFFFFFFFFFFCCCCCC333333222222666666DDDDDD333333888888FFFF
+      FFFFFFFFFFFFFFEEEEEE666666DDDDDDFFFFFF888888111111444444999999EE
+      EEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF888888
+      888888FFFFFFFFFFFFFFFFFFFFFFFFBBBBBB8888883333338888883333338888
+      88333333666666666666BBBBBBFFFFFFFFFFFFFFFFFF555555888888222222EE
+      EEEEFFFFFF999999555555FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF888888
+      888888FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8888888888
+      88FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFF000000BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBBBBBB444444FFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFF000000BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFBBBBBB444444FFFFFFFFFFFFEEEEEEFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFAF9FAF5F4F5F5F3F5E6E6E6B4B4B4818181E9958DE9
+      958DE9958DE9958DFDFBFDFDFBFDFDFCFDFDFCFDFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCCCC
+      CC000000333333444444444444444444444444444444FFFFFFFFFFFFFFFFFFAA
+      AAAA111111CCCCCCFFFFFFFFFFFFFFFFFF999999222222FFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFBBBBBB000000FFFFFFFFFFFFFFFFFFBBBBBB000000FFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFDDDDDD000000DDDDDD999999888888FFFFFF88888855
+      5555FFFFFFFFFFFFFFFFFFAAAAAA111111CCCCCCFFFFFFFFFFFFFFFFFF999999
+      222222FFFFFFFFFFFFFFFFFFFFFFFFAAAAAA000000444444DDDDDD1111114444
+      44111111333333444444444444FFFFFFFFFFFFBBBBBBEEEEEE333333222222CC
+      CCCC888888333333DDDDDDEEEEEECCCCCCFFFFFFFFFFFFFFFFFF888888111111
+      888888BBBBBB222222888888666666111111666666FFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFF888888888888FFFFFFFFFFFFFFFFFFEEEEEEBB
+      BBBB888888333333888888333333888888333333666666666666BBBBBBEEEEEE
+      DDDDDD333333CCCCCCFFFFFF999999AAAAAA999999BBBBBB444444FFFFFF0000
+      00FFFFFFFFFFFFFFFFFFFFFFFF888888888888FFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFF888888888888FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000BBBBBBFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44444400000044444433
+      3333111111444444444444777777FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000
+      BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FF000000FFFFFFFFFFFF222222222222555555888888BBBBBBFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCF6F4F6
+      F5F3F5E6E6E6B4B4B4818181E9958DE9958DE9958DE9958DFDFBFDFDFBFDFEFC
+      FEFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF888888888888FFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF888888333333FFFFFFFFFFFFFFFF
+      FFEEEEEE000000CCCCCCFFFFFFFFFFFFFFFFFFFFFFFFBBBBBB000000FFFFFFFF
+      FFFFFFFFFFBBBBBB000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF999999777777
+      FFFFFF222222999999FFFFFFBBBBBB333333FFFFFFFFFFFFFFFFFFFFFFFF8888
+      88333333FFFFFFFFFFFFFFFFFFEEEEEE000000CCCCCCFFFFFFFFFFFFFFFFFFFF
+      FFFF111111BBBBBBEEEEEEDDDDDDBBBBBB333333888888CCCCCCFFFFFFFFFFFF
+      FFFFFF000000FFFFFFFFFFFFCCCCCC111111CCCCCCCCCCCCFFFFFFBBBBBB4444
+      44FFFFFFFFFFFFFFFFFFFFFFFF999999000000777777888888FFFFFFFFFFFFFF
+      FFFFDDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF888888
+      888888FFFFFFFFFFFFFFFFFFCCCCCC4444443333331111113333331111113333
+      33111111222222222222444444CCCCCCFFFFFF999999111111CCCCCCCCCCCC11
+      1111888888888888333333BBBBBB000000FFFFFFFFFFFFFFFFFFFFFFFF888888
+      888888FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8888888888
+      88FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFF000000BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBBBBBB333333BBBBBBBBBBBBCCCCCCFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFF000000BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF333333CCCCCCFFFFFFFFFFFFCCCCCC
+      AAAAAA888888CCCCCCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFDFCFDF6F4F6F5F3F5DADADAB4B4B48F8F8FE9958DE9
+      958DE9958DE9958DFDFBFDFDFBFDFEFCFEFDFDFDFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEEEEEEBBBBBBBBBB
+      BBAAAAAA111111BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBFFFFFFFFFFFFFF
+      FFFFFFFFFF444444555555888888888888888888222222888888FFFFFFFFFFFF
+      FFFFFFFFFFFFBBBBBB000000FFFFFFFFFFFFFFFFFFBBBBBB000000FFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEEEEEE999999FFFFFFFFFFFFDDDDDDCC
+      CCCCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF444444555555888888888888888888
+      222222888888FFFFFFFFFFFFCCCCCC4444441111113333331111113333337777
+      77888888888888555555222222CCCCCCFFFFFF44444444444444444444444422
+      2222222222444444444444444444777777FFFFFFFFFFFFFFFFFFBBBBBBBBBBBB
+      666666777777FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFF888888888888FFFFFFFFFFFFFFFFFFFFFFFF66
+      6666999999444444BBBBBB444444BBBBBB444444888888888888FFFFFFFFFFFF
+      FFFFFFFFFFFFAAAAAACCCCCCCCCCCC999999CCCCCC3333331111114444444444
+      44FFFFFFFFFFFFFFFFFFFFFFFF888888888888FFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFF888888555555FFFFFFFFFFFF666666888888888888
+      888888888888DDDDDDFFFFFFFFFFFFFFFFFFFFFFFF000000BBBBBBFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBBBBBBBBBBBBBBBBBBBBBBBB88
+      8888333333DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000
+      BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6666662222
+      22000000222222444444BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFCFCF6F4F6
+      F5F3F5E6E6E6B4B4B4818181E9958DE9958DE9958DE9958DFDFBFDFDFBFDFDFC
+      FDFCFBFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFCCCCCC444444444444444444111111333333444444444444
+      444444444444444444FFFFFFFFFFFFFFFFFFFFFFFFBBBBBB0000008888888888
+      88888888777777EEEEEEFFFFFFFFFFFFFFFFFFFFFFFFBBBBBB000000FFFFFFFF
+      FFFFFFFFFFBBBBBB000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFBBBBBB000000888888888888888888777777EEEEEEFFFFFFFFFFFFEEEEEEBB
+      BBBB333333888888DDDDDD777777333333EEEEEE999999222222BBBBBBFFFFFF
+      FFFFFFBBBBBB888888888888888888444444444444888888888888888888BBBB
+      BBFFFFFFFFFFFFFFFFFF44444444444444444400000022222200000033333399
+      9999FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF888888
+      888888FFFFFFFFFFFFFFFFFFFFFFFF9999991111111111113333331111113333
+      33111111222222222222999999FFFFFFBBBBBB00000000000000000000000000
+      0000444444BBBBBB444444FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDD
+      DDDDDDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBBBBBB4444
+      44FFFFFFFFFFFF999999888888888888888888888888DDDDDDFFFFFFFFFFFFFF
+      FFFFFFFFFF000000BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFBBBBBB8888887777774444443333331111114444444444441111118888
+      88FFFFFFFFFFFFFFFFFFFFFFFF000000BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF888888888888BBBBBBCCCCCCFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFAF9FAF5F4F5F5F3F5DADADAB9B9B98F8F8FE9958DE9
+      958DE9958DE9958DFDFBFDFDFBFDFDFBFDFAF8FAFEFEFEFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFF888888777777FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFF333333888888FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFDDDDDD888888DDDDDDFFFFFFFFFFFFCCCCCC444444FFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF333333888888FFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF444444BBBBBBFFFFFFFFFFFF8888
+      88333333666666EEEEEEFFFFFFFFFFFFFFFFFFBBBBBB88888888888888888844
+      4444444444888888888888888888BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFF555555999999FFFFFFEEEEEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFF888888666666BBBBBBBBBBBBFFFFFFFFFFFFFF
+      FFFF777777555555BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDDDFFFFFF
+      FFFFFFFFFFFFFFFFFF444444BBBBBBFFFFFFFFFFFFBBBBBB444444FFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFDDDDDD555555FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000BBBBBBFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB
+      BBBB444444FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000
+      BBBBBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FF999999555555FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEF7F6F7F5F3F5
+      F5F3F5E6E6E6C0C0C0A2A2A2E9958DE9958DEAA39EE9958DFBEBE9FDFBFDFDFB
+      FDF7F6F7FCFBFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCCCCCC999999FFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDEEEEEEFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFDDDDDDEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFF999999DDDDDDFFFFFFFFFFFFFFFFFF666666EEEEEEFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF999999999999FFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAAAAAAAAAAAAFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF999999
+      444444444444444444FFFFFFFFFFFFFFFFFFDDDDDD888888FFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF777777BBBBBBFF
+      FFFFFFFFFFDDDDDD888888FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDD888888FFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDDDDDDAAAAAAFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFAF8FAF6F4F6F5F3F5F5F3F5E6E6E6CFCFCFB4B4B4E9958DEB
+      AFABEBBAB6E9958DF0CCC3FDFBFDFDFBFDFBF9FBF8F6F8FCFBFCFFFEFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFEFEFEFEFEFEFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFAF8FAF6F4F6F5F3F5F5F3F5
+      F5F3F5EDEBEDCFCFCFE5A39DE9958DF3D4CBF7E6E2E9958DE9958DFDFBFDFDFB
+      FDFDFBFDFBF9FBF7F6F7FAF9FAFCFCFCFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFF
+      FFFEFFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFDFEFEFE
+      FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFDFDFDFDFCFDFCFBFCFC
+      FBFCFCFBFCFDFCFDFDFCFDFDFCFDFDFCFDFCFCFCFCFBFCFCFBFCFBFAFBFBFAFB
+      FAF9FAF9F8F9F9F8F9F9F7F9F9F7F9F9F8F9FAF8FAFAF9FAFAFAFAFBFAFBFBFA
+      FBFBFAFBFCFBFCFCFCFCFDFCFDFDFDFDFEFDFEFEFEFEFEFEFEFEFEFEFEFEFEFE
+      FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
+      FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFEFFFEFEFEFEFE
+      FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFEFF
+      FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFEFFFFFE
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FEFFFEFEFEFEFEFEFEFEFEFEFEFEFEFDFEFEFDFEFDFDFDFDFDFDFDFDFDFEFDFE
+      FEFDFEFDFDFDFDFCFDFCFBFCFBFAFBFBFAFBFCFBFCFDFCFDFDFDFDFCFCFCFAF9
+      FAF7F6F7F6F4F6F5F3F5F5F3F5F5F3F5F5F3F5F5F3F5E9D5D3E9958DEAA39EFD
+      FBFDFDFBFDEAB3AEE9958DEAA39EFDF9F7FDFBFDFDFBFDFDFBFDFDFBFDFDFCFD
+      FEFCFEFEFDFEFEFDFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
+      FEFEFEFEFEFEFEFEFDFEFEFDFEFEFDFEFEFDFEFEFCFEFEFCFEFEFCFEFEFCFEFD
+      FCFDFDFCFDFDFCFDFDFCFDFDFCFDFDFCFDFDFCFDFDFCFDFDFCFDFDFCFDFDFCFD
+      FDFCFDFDFCFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFB
+      FDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFD
+      FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+      FDFCFDFDFCFDFDFCFDFEFCFEFEFCFEFEFCFEFEFCFEFDFCFDFDFCFDFDFCFDFDFC
+      FDFDFCFDFDFCFDFDFCFDFDFCFDFDFCFDFDFCFDFDFCFDFDFCFDFDFCFDFDFCFDFD
+      FCFDFDFCFDFEFCFEFEFCFEFEFCFEFEFCFEFEFCFEFEFCFEFEFCFEFEFCFEFEFCFE
+      FEFCFEFEFCFEFEFCFEFEFCFEFEFCFEFEFDFEFEFDFEFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+      FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFDFEFEFD
+      FEFEFDFEFEFDFEFEFDFEFEFDFEFEFDFEFEFDFEFEFCFEFEFCFEFEFCFEFEFCFEFE
+      FCFEFEFCFEFEFCFEFEFCFEFEFCFEFEFCFEFEFCFEFEFCFEFDFCFDFDFCFDFDFCFD
+      FDFCFDFDFCFDFDFCFDFDFCFDFDFCFDFDFCFDFDFCFDFDFCFDFDFCFDFDFCFDFDFC
+      FDFDFBFDFDFBFDFDFBFDFDFCFDFDFCFDFDFCFDFDFCFDFDFBFDFDFBFDFDFBFDFD
+      FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+      FBF9FBF9E5E4E89B96E9958DEFC5C2FDFBFDFDFBFDFBF3F3EAB3AEE9958DE995
+      8DF1CFCDFBF3F3FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFD
+      FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+      FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFB
+      FDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFD
+      FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+      FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFB
+      FDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFD
+      FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+      FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFB
+      FDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFD
+      FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+      FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFB
+      FDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFD
+      FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+      FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFB
+      FDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFD
+      FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+      FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFB
+      FDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFD
+      FBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFD
+      FDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFB
+      FDFDFBFDFDFBFDFDFBFDFDFBFDFBF1EFEBBAB6E9958DE9958DEBBAB6FDFBFDFD
+      FBFDFDFBFDFDFBFDFBF3F3EAB3AEE9958DE9958DE9958DE9958DE9958DE9958D
+      E9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE995
+      8DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9
+      958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958D
+      E9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE995
+      8DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9
+      958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958D
+      E9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE995
+      8DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9
+      958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958D
+      E9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE995
+      8DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9
+      958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958D
+      E9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE995
+      8DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9
+      958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958D
+      E9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE995
+      8DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9
+      958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958D
+      E9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE995
+      8DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9
+      958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958D
+      E9958DE39592EEC5BBFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDFDFBFDF7E3
+      DEEBBAB6E79E9BE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9
+      958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958D
+      E9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE995
+      8DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9
+      958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958D
+      E9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE995
+      8DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9
+      958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958D
+      E9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE995
+      8DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9
+      958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958D
+      E9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE995
+      8DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9
+      958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958D
+      E9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE995
+      8DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9
+      958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958D
+      E9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE995
+      8DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9
+      958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958D
+      E9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE9958DE995
+      8DE9958DE9958DE9958DE9958DE79E9BEBBAB6FBF1EFFDFBFDFDFBFDFDFBFDFD
+      FBFD}
+    Visible = False
+  end
+end
diff --git a/DCHookTest/Notify.h b/DCHookTest/Notify.h
new file mode 100644 (file)
index 0000000..23e10c5
--- /dev/null
@@ -0,0 +1,33 @@
+//---------------------------------------------------------------------------
+
+#ifndef NotifyH
+#define NotifyH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <Controls.hpp>
+#include <StdCtrls.hpp>
+#include <Forms.hpp>
+#include <ExtCtrls.hpp>
+#include <Graphics.hpp>
+//---------------------------------------------------------------------------
+class TNotifyForm : public TForm
+{
+__published:   // IDE \8aÇ\97\9d\82Ì\83R\83\93\83|\81[\83l\83\93\83g
+       TImage *EnableBmp;
+       TImage *DisableBmp;
+       void __fastcall FormShow(TObject *Sender);
+       void __fastcall FormMouseMove(TObject *Sender, TShiftState Shift, int X,
+          int Y);
+       void __fastcall FormDestroy(TObject *Sender);
+private:       // \83\86\81[\83U\81[\90é\8c¾
+       HRGN hRgn;
+public:                // \83\86\81[\83U\81[\90é\8c¾
+       bool enable;
+       __fastcall TNotifyForm(TComponent* Owner);
+       void Setup();
+};
+//---------------------------------------------------------------------------
+extern PACKAGE TNotifyForm *NotifyForm;
+//---------------------------------------------------------------------------
+#endif
+
diff --git a/DCHookTest/OCRTextFrm.cpp b/DCHookTest/OCRTextFrm.cpp
new file mode 100644 (file)
index 0000000..69a35d9
--- /dev/null
@@ -0,0 +1,46 @@
+//---------------------------------------------------------------------------
+
+#include <vcl.h>
+#pragma hdrstop
+
+#include "OCRTextFrm.h"
+#include "Util.h"
+//---------------------------------------------------------------------------
+#pragma package(smart_init)
+#pragma link "TntStdCtrls"
+#pragma link "TntStdCtrls"
+#pragma resource "*.dfm"
+TOCRTextForm *OCRTextForm;
+const char *sOCRText = "OCRText";
+//---------------------------------------------------------------------------
+__fastcall TOCRTextForm::TOCRTextForm(TComponent* Owner)
+       : TForm(Owner)
+{
+       VCL_SIZEABLE();
+}
+//---------------------------------------------------------------------------
+void __fastcall TOCRTextForm::FormShow(TObject *Sender)
+{
+       LoadForm(sOCRText, this, NULL);
+}
+//---------------------------------------------------------------------------
+void __fastcall TOCRTextForm::FormCloseQuery(TObject *Sender,
+      bool &CanClose)
+{
+       SaveForm(sOCRText, this, NULL);
+}
+//---------------------------------------------------------------------------
+void TOCRTextForm::SetText(const wchar_t *text)
+{
+       int wlen = wcslen(text);
+       char *buf = new char[wlen*2+1];
+       if (!buf) return;
+       BOOL defchar = FALSE;
+       WideCharToMultiByte( CP_ACP, 0,
+               text, wlen,
+               buf, wlen*2+1, 0, &defchar );
+       memo->Text = buf;
+       delete[] buf;
+}
+
+
diff --git a/DCHookTest/OCRTextFrm.dfm b/DCHookTest/OCRTextFrm.dfm
new file mode 100644 (file)
index 0000000..8018b87
--- /dev/null
@@ -0,0 +1,27 @@
+object OCRTextForm: TOCRTextForm
+  Left = 192
+  Top = 133
+  BorderStyle = bsDialog
+  Caption = '\94F\8e¯\83e\83L\83X\83g'
+  ClientHeight = 343
+  ClientWidth = 567
+  Color = clBtnFace
+  Font.Charset = SHIFTJIS_CHARSET
+  Font.Color = clWindowText
+  Font.Height = -12
+  Font.Name = '\82l\82\82o\83S\83V\83b\83N'
+  Font.Style = []
+  OldCreateOrder = False
+  OnCloseQuery = FormCloseQuery
+  OnShow = FormShow
+  PixelsPerInch = 96
+  TextHeight = 12
+  object memo: TMemo
+    Left = 0
+    Top = 0
+    Width = 567
+    Height = 343
+    Align = alClient
+    TabOrder = 0
+  end
+end
diff --git a/DCHookTest/OCRTextFrm.h b/DCHookTest/OCRTextFrm.h
new file mode 100644 (file)
index 0000000..f010df7
--- /dev/null
@@ -0,0 +1,26 @@
+//---------------------------------------------------------------------------
+
+#ifndef OCRTextFrmH
+#define OCRTextFrmH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <Controls.hpp>
+#include <StdCtrls.hpp>
+#include <Forms.hpp>
+//---------------------------------------------------------------------------
+class TOCRTextForm : public TForm
+{
+__published:   // IDE \8aÇ\97\9d\82Ì\83R\83\93\83|\81[\83l\83\93\83g
+       TMemo *memo;
+       void __fastcall FormShow(TObject *Sender);
+       void __fastcall FormCloseQuery(TObject *Sender, bool &CanClose);
+private:       // \83\86\81[\83U\81[\90é\8c¾
+public:                // \83\86\81[\83U\81[\90é\8c¾
+       __fastcall TOCRTextForm(TComponent* Owner);
+       void SetText(const wchar_t *text);
+};
+//---------------------------------------------------------------------------
+extern PACKAGE TOCRTextForm *OCRTextForm;
+//---------------------------------------------------------------------------
+#endif
+
diff --git a/DCHookTest/PopupConfig.cpp b/DCHookTest/PopupConfig.cpp
new file mode 100644 (file)
index 0000000..c4383e8
--- /dev/null
@@ -0,0 +1,228 @@
+//---------------------------------------------------------------------------
+#include <vcl.h>
+#pragma hdrstop
+
+#include "PopupConfig.h"
+#include "Util.h"
+#include "prgprof.h"
+#include "../DCHook/DCHook.h"
+//---------------------------------------------------------------------------
+#pragma package(smart_init)
+#pragma resource "*.dfm"
+TPopupConfigDlg *PopupConfigDlg;
+//---------------------------------------------------------------------------
+__fastcall TPopupConfigDlg::TPopupConfigDlg(TComponent* Owner)
+       : TForm(Owner)
+{
+       MODIAvail = true;
+}
+//---------------------------------------------------------------------------
+void __fastcall TPopupConfigDlg::cbGroupOpenClick(TObject *Sender)
+{
+       bool f = cbGroupOpen->Checked;
+       edGroupName->Enabled = f;
+       lbGroupName->Enabled = f;
+}
+//---------------------------------------------------------------------------
+void __fastcall TPopupConfigDlg::FormShow(TObject *Sender)
+{
+#if USE_DDE
+       cbGroupOpenClick( this );
+
+       // Add groups to combo-box //
+       TAppIni ini;
+       if ( !ini.hroot ){
+               return;
+       }
+
+       ini.ReadValues( PFS_GROUP, edGroupName->Items );
+
+       if (!cbGroupOpen->Checked ){
+               int sel = ini.ReadInteger( PFS_COMMON, PFS_GRPSEL, -1 );
+               edGroupName->ItemIndex = sel;
+       }
+#else  // !USE_DDE
+       // WM_COPYDATA\82Ì\8fê\8d\87\82Í\81A\8e«\8f\91\83O\83\8b\81[\83v\8ew\92è\82Í\82Å\82«\82È\82¢
+       cbGroupOpen->Enabled = false;
+       lbGroupName->Enabled = false;
+       edGroupName->Enabled = false;
+       lb1->Enabled = false;
+       lb2->Enabled = false;
+#endif
+       if (fWow64)
+               cbUse64->Visible = true;
+}
+//---------------------------------------------------------------------------
+void __fastcall TPopupConfigDlg::FormCloseQuery(TObject *Sender,
+         bool &CanClose)
+{
+       if (ModalResult!=mrOk) return;
+
+       if (cbToggleKey->ItemIndex != 0){
+               if (cbToggleKey->ItemIndex-1 == cbPopupKey->ItemIndex){
+                       // \93¯\82\83L\81[\82Í\8a\84\82è\93\96\82Ä\82ç\82ê\82È\82¢
+                       Application->MessageBox("\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82Æ\89E\83N\83\8a\83b\83N\8c\9f\8dõON/OFF\82Í\93¯\82\83L\81[\82ð\8a\84\82è\93\96\82Ä\82ç\82ê\82Ü\82¹\82ñ",Caption.c_str(),MB_OK);
+                       CanClose = false;
+                       return;
+               }
+       }
+}
+//---------------------------------------------------------------------------
+void __fastcall TPopupConfigDlg::cbCaptureModeChange(TObject *Sender)
+{
+       bool f = cbCaptureMode->ItemIndex != 2;
+#if 0
+       lbScaling->Enabled = f;
+       lbScaleNormal->Enabled = f;
+       tbScaling->Enabled = f;
+       lbScaleMax->Enabled = f;
+#endif
+       lbAMODIPath->Enabled = f;
+       edAMODIPath->Enabled = f;
+       btnBrowse->Enabled = f;
+}
+//---------------------------------------------------------------------------
+void __fastcall TPopupConfigDlg::btnHelpClick(TObject *Sender)
+{
+       ShowManual(Handle);
+}
+//---------------------------------------------------------------------------
+void __fastcall TPopupConfigDlg::actHelpExecute(TObject *Sender)
+{
+       ShowManual(Handle);
+}
+//---------------------------------------------------------------------------
+void __fastcall TPopupConfigDlg::lbDebugDblClick(TObject *Sender)
+{
+       miShowAMODI->Visible = true;
+}
+//---------------------------------------------------------------------------
+void __fastcall TPopupConfigDlg::miShowAMODIClick(TObject *Sender)
+{
+       ShowAMODI();
+}
+//---------------------------------------------------------------------------
+void __fastcall TPopupConfigDlg::cbDPISettingClick(TObject *Sender)
+{
+       bool setting = cbDPISetting->Checked;
+       lbScaling->Enabled = setting;
+       lbScaleNormal->Enabled = setting;
+       tbScaling->Enabled = setting;
+}
+//---------------------------------------------------------------------------
+/*
+Ctrl+\89E\83N\83\8a\83b\83N
+Shift+\89E\83N\83\8a\83b\83N
+Alt+\89E\83N\83\8a\83b\83N
+Ctrl+Shift+\89E\83N\83\8a\83b\83N
+Ctrl+Alt+\89E\83N\83\8a\83b\83N
+Shift+Alt+\89E\83N\83\8a\83b\83N
+Ctrl+\8d\83N\83\8a\83b\83N
+Shift+\8d\83N\83\8a\83b\83N
+Alt+\8d\83N\83\8a\83b\83N
+Ctrl+Shift+\8d\83N\83\8a\83b\83N
+Ctrl+Alt+\8d\83N\83\8a\83b\83N
+Shift+Alt+\8d\83N\83\8a\83b\83N
+\8d\83N\83\8a\83b\83N+\89E\83N\83\8a\83b\83N\81¨\8bp\89º
+*/
+int KeyCombTable[] = {
+       KF_CONTROL,
+       KF_SHIFT,
+       KF_MENU,
+       KF_CONTROL + KF_SHIFT,
+       KF_CONTROL + KF_MENU,
+       KF_SHIFT   + KF_MENU,
+       KF_CONTROL + KF_LEFTCLICK,
+       KF_SHIFT   + KF_LEFTCLICK,
+       KF_MENU    + KF_LEFTCLICK,
+       KF_CONTROL + KF_SHIFT + KF_LEFTCLICK,
+       KF_CONTROL + KF_MENU + KF_LEFTCLICK,
+       KF_SHIFT   + KF_MENU + KF_LEFTCLICK,
+       KF_MIDCLICK,
+       KF_CONTROL + KF_MIDCLICK,
+       KF_SHIFT   + KF_MIDCLICK,
+       KF_MENU    + KF_MIDCLICK,
+       KF_CONTROL + KF_SHIFT + KF_MIDCLICK,
+       KF_CONTROL + KF_MENU + KF_MIDCLICK,
+       KF_SHIFT   + KF_MENU + KF_MIDCLICK,
+       //KF_LRCLICK,
+       0
+};
+// key combination -> index
+int KeyCombToIndex( int keycomb )
+{
+       int i;
+       for (i=0;KeyCombTable[i];i++){
+               if (keycomb == KeyCombTable[i])
+                       return i;
+       }
+       return -1;
+}
+int IndexToKeyComb( int index )
+{
+       if (index < 0)
+               return 0;
+       return KeyCombTable[index];
+}
+void TPopupConfigDlg::SetPopupKey( int keycomb )
+{
+       cbPopupKey->ItemIndex = KeyCombToIndex( keycomb );
+}
+int TPopupConfigDlg::GetPopupKey( )
+{
+       return IndexToKeyComb( cbPopupKey->ItemIndex );
+}
+void TPopupConfigDlg::SetToggleKey( int keycomb )
+{
+       cbToggleKey->ItemIndex = KeyCombToIndex( keycomb )+1;
+}
+int TPopupConfigDlg::GetToggleKey( )
+{
+       return IndexToKeyComb( cbToggleKey->ItemIndex-1 );
+}
+
+void TPopupConfigDlg::SetDPIDetect(bool dpi_detect)
+{
+       cbDPISetting->Checked = !dpi_detect;
+}
+bool TPopupConfigDlg::GetDPIDetect()
+{
+       return !cbDPISetting->Checked;
+}
+void TPopupConfigDlg::SetScaler(int scale)
+{
+       if (scale<120){
+               tbScaling->Position = 0;
+       } else
+       if (scale<144){
+               tbScaling->Position = 1;
+       } else {
+               tbScaling->Position = 2;
+       }
+}
+int TPopupConfigDlg::GetScaler()
+{
+       switch (tbScaling->Position){
+               default: return 0;
+               case 1: return 120;
+               case 2: return 144;
+       }
+}
+
+void TPopupConfigDlg::SetCaptureMode(int mode)
+{
+       switch (mode){
+               case CM_TEXT | CM_IMAGE: cbCaptureMode->ItemIndex = 0; break;
+               case CM_IMAGE:                   cbCaptureMode->ItemIndex = 1; break;
+               case CM_TEXT:                    cbCaptureMode->ItemIndex = 2; break;
+       }
+}
+int TPopupConfigDlg::GetCaptureMode()
+{
+       switch (cbCaptureMode->ItemIndex){
+               default: case 0:        return CM_TEXT | CM_IMAGE;
+               case 1: return CM_IMAGE;
+               case 2: return CM_TEXT;
+       }
+}
+
diff --git a/DCHookTest/PopupConfig.dfm b/DCHookTest/PopupConfig.dfm
new file mode 100644 (file)
index 0000000..14e7ab9
--- /dev/null
@@ -0,0 +1,331 @@
+object PopupConfigDlg: TPopupConfigDlg
+  Left = 414
+  Top = 142
+  BorderStyle = bsDialog
+  Caption = '\82Ç\82±\83|\83b\83v\82Ì\90Ý\92è'
+  ClientHeight = 419
+  ClientWidth = 306
+  Color = clBtnFace
+  Font.Charset = SHIFTJIS_CHARSET
+  Font.Color = clWindowText
+  Font.Height = -12
+  Font.Name = '\82l\82\82o\83S\83V\83b\83N'
+  Font.Style = []
+  OldCreateOrder = False
+  PopupMenu = pmDebugMenu
+  Position = poScreenCenter
+  OnCloseQuery = FormCloseQuery
+  OnShow = FormShow
+  PixelsPerInch = 96
+  TextHeight = 12
+  object lb1: TLabel
+    Left = 40
+    Top = 54
+    Width = 240
+    Height = 12
+    Caption = '\8ew\92è\82µ\82È\82¢\8fê\8d\87\82Í\81APDIC\96{\91Ì\82ª\8c»\8dÝ\8aJ\82¢\82Ä\82¢\82é'
+  end
+  object lb2: TLabel
+    Left = 40
+    Top = 70
+    Width = 136
+    Height = 12
+    Caption = '\8e«\8f\91\83O\83\8b\81[\83v\82ð\8eg\97p\82µ\82Ü\82·'
+  end
+  object lbGroupName: TLabel
+    Left = 40
+    Top = 91
+    Width = 87
+    Height = 12
+    Caption = '\8e«\8f\91¸ÞÙ°Ìß\96¼(&N)'
+  end
+  object Label1: TLabel
+    Left = 24
+    Top = 120
+    Width = 107
+    Height = 12
+    Caption = '\83|\83b\83v\83A\83b\83v\8c\9f\8dõ(&P)\81F'
+    FocusControl = cbPopupKey
+  end
+  object Label2: TLabel
+    Left = 24
+    Top = 144
+    Width = 122
+    Height = 12
+    Caption = '\89E¸Ø¯¸\8c\9f\8dõON/OFF(&R):'
+    FocusControl = cbToggleKey
+  end
+  object lbAMODIPath: TLabel
+    Left = 27
+    Top = 302
+    Width = 139
+    Height = 12
+    Caption = 'AM&ODI\82Ì\8fê\8f\8a(\8fã\8b\89\8eÒ\8cü\82¯)'
+    Enabled = False
+    FocusControl = edAMODIPath
+  end
+  object lbScaling: TLabel
+    Left = 40
+    Top = 386
+    Width = 53
+    Height = 12
+    Caption = '\8ag\91å\97¦(&M)'
+    Enabled = False
+    FocusControl = tbScaling
+    Visible = False
+  end
+  object lbScaleNormal: TLabel
+    Left = 117
+    Top = 387
+    Width = 24
+    Height = 12
+    Caption = '\95W\8f\80'
+    Enabled = False
+    Visible = False
+  end
+  object lbScaleMax: TLabel
+    Left = 319
+    Top = 366
+    Width = 24
+    Height = 12
+    Caption = '\8dÅ\91å'
+    Visible = False
+  end
+  object lbDebug: TLabel
+    Left = 264
+    Top = 8
+    Width = 20
+    Height = 12
+    Caption = '     '
+    OnDblClick = lbDebugDblClick
+  end
+  object cbGroupOpen: TCheckBox
+    Left = 24
+    Top = 32
+    Width = 249
+    Height = 17
+    Caption = '\8e«\8f\91\83O\83\8b\81[\83v\82ð\8ew\92è\82·\82é(&G)'
+    TabOrder = 1
+    OnClick = cbGroupOpenClick
+  end
+  object cbCtrlClose: TCheckBox
+    Left = 24
+    Top = 224
+    Width = 233
+    Height = 17
+    Caption = 'Ctrl\83L\81[\82ð\97£\82µ\82½\82çÎ߯Ìß±¯Ìß\82ð\95Â\82\82é(&C)'
+    TabOrder = 6
+    Visible = False
+  end
+  object btnOK: TButton
+    Left = 12
+    Top = 379
+    Width = 75
+    Height = 25
+    Caption = 'OK'
+    Default = True
+    ModalResult = 1
+    TabOrder = 14
+  end
+  object btnCancel: TButton
+    Left = 112
+    Top = 379
+    Width = 75
+    Height = 25
+    Cancel = True
+    Caption = 'Cancel'
+    ModalResult = 2
+    TabOrder = 15
+  end
+  object edGroupName: TComboBox
+    Left = 136
+    Top = 88
+    Width = 145
+    Height = 20
+    ItemHeight = 12
+    TabOrder = 2
+  end
+  object cbBanner: TCheckBox
+    Left = 24
+    Top = 8
+    Width = 225
+    Height = 17
+    Caption = '\8bN\93®\8e\9e\82É\83X\83v\83\89\83b\83V\83\85\82ð\95\\8e¦\82·\82é(&B)'
+    Checked = True
+    State = cbChecked
+    TabOrder = 0
+  end
+  object Memo1: TMemo
+    Left = 32
+    Top = 168
+    Width = 257
+    Height = 49
+    TabStop = False
+    Alignment = taCenter
+    BorderStyle = bsNone
+    Color = clBtnFace
+    Lines.Strings = (
+      '\81¦"\89E¸Ø¯¸\8c\9f\8dõ"\82Æ\82Í\81A\83}\83E\83X\82Ì\89E\83N\83\8a\83b\83N\82¾\82¯\82Å'
+      '\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82ð\8ds\82¤\8b@\94\\82Å\82·'
+      '\81¦\91g\82Ý\8d\87\82í\82¹\82É\82æ\82Á\82Ä\82Í\83A\83v\83\8a\83P\81[\83V\83\87\83\93\82Æ'
+      '\8b£\8d\87\82µ\82Ä\82µ\82Ü\82¤\8fê\8d\87\82ª\82 \82è\82Ü\82·\81B')
+    ReadOnly = True
+    TabOrder = 5
+  end
+  object cbPopupKey: TComboBox
+    Left = 152
+    Top = 115
+    Width = 130
+    Height = 20
+    Style = csDropDownList
+    ItemHeight = 12
+    TabOrder = 3
+    Items.Strings = (
+      'Ctrl+\89E\83N\83\8a\83b\83N'
+      'Shift+\89E\83N\83\8a\83b\83N'
+      'Alt+\89E\83N\83\8a\83b\83N'
+      'Ctrl+Shift+\89E\83N\83\8a\83b\83N'
+      'Ctrl+Alt+\89E\83N\83\8a\83b\83N'
+      'Shift+Alt+\89E\83N\83\8a\83b\83N'
+      'Ctrl+\8d\83N\83\8a\83b\83N'
+      'Shift+\8d\83N\83\8a\83b\83N'
+      'Alt+\8d\83N\83\8a\83b\83N'
+      'Ctrl+Shift+\8d\83N\83\8a\83b\83N'
+      'Ctrl+Alt+\8d\83N\83\8a\83b\83N'
+      'Shift+Alt+\8d\83N\83\8a\83b\83N'
+      '\92\86\83N\83\8a\83b\83N'
+      'Ctrl+\92\86\83N\83\8a\83b\83N'
+      'Shift+\92\86\83N\83\8a\83b\83N'
+      'Alt+\92\86\83N\83\8a\83b\83N'
+      'Ctrl+Shift+\92\86\83N\83\8a\83b\83N'
+      'Ctrl+Alt+\92\86\83N\83\8a\83b\83N'
+      'Shift+Alt+\92\86\83N\83\8a\83b\83N')
+  end
+  object cbToggleKey: TComboBox
+    Left = 152
+    Top = 140
+    Width = 129
+    Height = 20
+    Style = csDropDownList
+    ItemHeight = 12
+    TabOrder = 4
+    Items.Strings = (
+      '\82È\82µ'
+      'Ctrl+\89E\83N\83\8a\83b\83N'
+      'Shift+\89E\83N\83\8a\83b\83N'
+      'Alt+\89E\83N\83\8a\83b\83N'
+      'Ctrl+Shift+\89E\83N\83\8a\83b\83N'
+      'Ctrl+Alt+\89E\83N\83\8a\83b\83N'
+      'Shift+Alt+\89E\83N\83\8a\83b\83N'
+      'Ctrl+\8d\83N\83\8a\83b\83N'
+      'Shift+\8d\83N\83\8a\83b\83N'
+      'Alt+\8d\83N\83\8a\83b\83N'
+      'Ctrl+Shift+\8d\83N\83\8a\83b\83N'
+      'Ctrl+Alt+\8d\83N\83\8a\83b\83N'
+      'Shift+Alt+\8d\83N\83\8a\83b\83N')
+  end
+  object cbIgnoreJ: TCheckBox
+    Left = 24
+    Top = 248
+    Width = 225
+    Height = 17
+    Caption = '\89p\90\94\8e\9a\82Ì\82Ý\8c\9f\8dõ\82·\82é(&J)'
+    TabOrder = 7
+  end
+  object edAMODIPath: TEdit
+    Left = 24
+    Top = 317
+    Width = 169
+    Height = 20
+    Enabled = False
+    TabOrder = 9
+  end
+  object btnBrowse: TButton
+    Left = 200
+    Top = 314
+    Width = 68
+    Height = 25
+    Caption = '\8eQ\8fÆ...'
+    Enabled = False
+    TabOrder = 10
+  end
+  object tbScaling: TTrackBar
+    Left = 146
+    Top = 383
+    Width = 121
+    Height = 20
+    Enabled = False
+    Max = 2
+    Orientation = trHorizontal
+    PageSize = 1
+    Frequency = 1
+    Position = 0
+    SelEnd = 0
+    SelStart = 0
+    TabOrder = 13
+    ThumbLength = 8
+    TickMarks = tmBottomRight
+    TickStyle = tsAuto
+    Visible = False
+  end
+  object btnHelp: TButton
+    Left = 212
+    Top = 379
+    Width = 75
+    Height = 25
+    Caption = '&Help'
+    TabOrder = 16
+    OnClick = btnHelpClick
+  end
+  object cbCaptureMode: TComboBox
+    Left = 24
+    Top = 276
+    Width = 193
+    Height = 20
+    Style = csDropDownList
+    ItemHeight = 12
+    TabOrder = 8
+    OnChange = cbCaptureModeChange
+    Items.Strings = (
+      '\95\8e\9a\94F\8e¯\81{\95\8e\9a\92\8a\8fo'
+      '\95\8e\9a\94F\8e¯\82Ì\82Ý'
+      '\95\8e\9a\92\8a\8fo\82Ì\82Ý')
+  end
+  object cbUse64: TCheckBox
+    Left = 24
+    Top = 344
+    Width = 193
+    Height = 17
+    Caption = '&64\83r\83b\83g\83t\83b\83N\82ð\8eg\97p\82·\82é'
+    TabOrder = 11
+    Visible = False
+  end
+  object cbDPISetting: TCheckBox
+    Left = 24
+    Top = 362
+    Width = 193
+    Height = 17
+    Caption = '\89ð\91\9c\93x\90Ý\92è\82ð\82·\82é(&D)'
+    TabOrder = 12
+    Visible = False
+    OnClick = cbDPISettingClick
+  end
+  object ActionList1: TActionList
+    Left = 272
+    Top = 272
+    object actHelp: TAction
+      Caption = 'Help'
+      ShortCut = 112
+      OnExecute = actHelpExecute
+    end
+  end
+  object pmDebugMenu: TPopupMenu
+    Left = 264
+    Top = 216
+    object miShowAMODI: TMenuItem
+      Caption = 'Show &AMODI'
+      Visible = False
+      OnClick = miShowAMODIClick
+    end
+  end
+end
diff --git a/DCHookTest/PopupConfig.h b/DCHookTest/PopupConfig.h
new file mode 100644 (file)
index 0000000..423bfda
--- /dev/null
@@ -0,0 +1,82 @@
+//---------------------------------------------------------------------------
+#ifndef PopupConfigH
+#define PopupConfigH
+//---------------------------------------------------------------------------
+#include <Classes.hpp>
+#include <Controls.hpp>
+#include <StdCtrls.hpp>
+#include <Forms.hpp>
+#include <ComCtrls.hpp>
+#include <ActnList.hpp>
+#include <Menus.hpp>
+//---------------------------------------------------------------------------
+
+enum eCaptureMode {
+       CM_TEXT = 1,    // \95\8e\9a\92\8a\8fo
+       CM_IMAGE = 2,   // OCR
+};
+
+class TPopupConfigDlg : public TForm
+{
+__published:   // IDE \8aÇ\97\9d\82Ì\83R\83\93\83|\81[\83l\83\93\83g
+       TCheckBox *cbGroupOpen;
+       TLabel *lb1;
+       TLabel *lbGroupName;
+       TCheckBox *cbCtrlClose;
+       TButton *btnOK;
+       TButton *btnCancel;
+       TLabel *lb2;
+       TComboBox *edGroupName;
+       TCheckBox *cbBanner;
+       TMemo *Memo1;
+       TLabel *Label1;
+       TComboBox *cbPopupKey;
+       TLabel *Label2;
+       TComboBox *cbToggleKey;
+       TCheckBox *cbIgnoreJ;
+       TLabel *lbAMODIPath;
+       TEdit *edAMODIPath;
+       TButton *btnBrowse;
+       TLabel *lbScaling;
+       TTrackBar *tbScaling;
+       TLabel *lbScaleNormal;
+       TLabel *lbScaleMax;
+       TButton *btnHelp;
+       TActionList *ActionList1;
+       TAction *actHelp;
+       TLabel *lbDebug;
+       TPopupMenu *pmDebugMenu;
+       TMenuItem *miShowAMODI;
+       TComboBox *cbCaptureMode;
+       TCheckBox *cbUse64;
+       TCheckBox *cbDPISetting;
+       void __fastcall cbGroupOpenClick(TObject *Sender);
+       void __fastcall FormShow(TObject *Sender);
+       void __fastcall FormCloseQuery(TObject *Sender, bool &CanClose);
+       void __fastcall btnHelpClick(TObject *Sender);
+       void __fastcall actHelpExecute(TObject *Sender);
+       void __fastcall lbDebugDblClick(TObject *Sender);
+       void __fastcall miShowAMODIClick(TObject *Sender);
+       void __fastcall cbCaptureModeChange(TObject *Sender);
+       void __fastcall cbDPISettingClick(TObject *Sender);
+private:       // \83\86\81[\83U\81[\90é\8c¾
+       bool MODIAvail;
+public:                // \83\86\81[\83U\81[\90é\8c¾
+       __fastcall TPopupConfigDlg(TComponent* Owner);
+       void SetPopupKey( int keycomb );
+       int GetPopupKey( );
+       void SetToggleKey( int keycomb );
+       int GetToggleKey( );
+       void SetDPIDetect(bool dpi_detect);
+       bool GetDPIDetect();
+       void SetScaler(int scale);
+       int GetScaler();
+       void SetMODIAvail(bool avail) { MODIAvail = avail; }
+       void SetCaptureMode(int mode);
+       int GetCaptureMode();
+};
+//---------------------------------------------------------------------------
+extern PACKAGE TPopupConfigDlg *PopupConfigDlg;
+//---------------------------------------------------------------------------
+#endif
+
diff --git a/DCHookTest/StringLib.cpp b/DCHookTest/StringLib.cpp
new file mode 100644 (file)
index 0000000..f630822
--- /dev/null
@@ -0,0 +1,243 @@
+//---------------------------------------------------------------------------
+#include <vcl.h>
+#pragma hdrstop
+
+#include "StringLib.h"
+
+//---------------------------------------------------------------------------
+#pragma package(smart_init)
+
+// pos\82©\82ç\92P\8cê\82ð\90Ø\82è\8fo\82·
+// pos\82Ístr\82©\82ç\82Ì\83I\83t\83Z\83b\83g
+// start,end\82Ístr\82©\82ç\82Ì\83I\83t\83Z\83b\83g\82ð\95Ô\82·
+// prevstart\82Í\81Astart\82Ì\82P\82Â\91O\82Ì\92P\8cê\81A\96³\82¢\8fê\8d\87\82Ístart\82Æ\93¯\82\92l
+// fLongest\82ªTRUE\82Ì\8fê\8d\87\82Í\81A\8dÅ\8d\8210\8cê\82Ü\82Åget\82·\82é(.)\82ð\8fI\82í\82è\82Æ\82Ý\82È\82·
+// about   : \82¢\82¢\89Á\8c¸\82È\82Æ\82±\82ë\82ð\83N\83\8a\83b\83N\82µ\82Ä\82à\92P\8cê\82³\82¦\82 \82ê\82Î\95K\82¸get\82·\82é
+// alnum   : \89p\90\94\8e\9a\88È\8aO\82Í\96³\8e\8b
+
+BOOL GetWord( const tchar *str, int pos, int &start, int &end, int &prevstart, bool fLongest, int wordcount, bool about, bool alnum )
+{
+       if ( !about )
+               if ( !IsWordChar( *(str+pos) ) )
+                       return FALSE;
+//     while ( *(str+pos) == ' ' || *(str+pos) == '\t' ){
+//             pos++;
+//     }
+
+       // \89ü\8ds\82Ì\8fê\8d\87\82Í\96³\82µ
+       if ( str[pos] == '\r' || str[pos] == '\n' ){
+               return false;
+       }
+
+       // pos\82ª\95\8e\9a\97ñ\82Ì\8fI\92[\81A\82 \82é\82¢\82Í\95\8e\9a\97ñ\82Ì\8fI\92[\82©\82ç\82P\82Â\91O\82Ì\89ü\8ds\82Å\82 \82é\8fê\8d\87\82Í\82¾\82ß //
+       if ( !str[pos] || (!str[pos+1] && ((tuchar)str[pos] < ' ')) )
+               return false; 
+
+       const tchar *orgp = str;
+       const tchar *p = orgp;
+rescan:
+       // \92P\8cê\82Ì\90æ\93ª\82ð\92T\82· //
+       const tchar *wordtop = NULL;
+       while ( *p ){
+               if ( alnum ){
+                       // \89p\90\94\8e\9a\82Ì\82Ý
+                       if ( isalphanum(*p) ){
+                               // \92P\8cê\82Ì\8en\82Ü\82è
+                               wordtop = p;
+                               break;
+                       }
+                       p = NEXT_CHAR(p);
+               } else {
+                       // \95\8e\9a\8eí\82ð\8bæ\95Ê\82µ\82È\82¢
+                       if ( IsWordChar( *p ) )
+                       {
+                               wordtop = p;
+                               break;
+                       }
+                       p++;
+               }
+       }
+       if ( !wordtop )
+               wordtop = p; 
+       const tchar *wordtail = NULL;
+       const tchar *wordprev = NULL;
+       BOOL fSpc = FALSE;
+       // pos\82É\82 \82é\92P\8cê\82Ìstart\82Æend\82ð\8b\81\82ß\82é
+       while ( *p ){
+               if ( !IsWordChar( *p ) || (alnum && !isalphanum(*p)) ){
+                       // \94ñ\92P\8cê\95\8e\9a
+                       if ( orgp + pos < p ){
+                               // \92P\8cê\82Ì\8fI\82í\82è
+                               wordtail = p;
+                               break;
+                       } else {
+                               if ( alnum ){
+                                       if ( _ismbblead(*p) ){
+                                               // \93ú\96{\8cê\82Ì\8fê\8d\87\82Í\81A\92P\8f\83\82È\94ñ\92P\8cê\95\8e\9a\82Æ\82Í\82Ý\82È\82³\82¸\81A
+                                               // \8dÅ\8f\89\82©\82çscan\82ð\82â\82è\92¼\82·
+                                               goto rescan;
+                                       }
+                               }
+                       }
+                       fSpc = TRUE;
+               } else {
+                       // \92P\8cê\95\8e\9a
+                       if ( fSpc ){
+                               wordprev = wordtop;
+                               wordtop = p;
+                               fSpc = FALSE;
+                       }
+               }
+               if ( alnum ){
+                       p = NEXT_CHAR( p );
+               } else {
+                       p++;
+               }
+       }
+
+       // wordtop\82ªpos\82æ\82è\8cã\82ë
+       if ( (unsigned)wordtop - (about ? 3 : 0) > (unsigned)(orgp + pos) ){
+               // \92P\8cê\82Ì\8bæ\90Ø\82è\82¾\82Á\82½\81A\92P\8cê\82Ì\8dÅ\8f\89\82ªpos\82æ\82è\8cã\82ë\82É\82 \82Á\82½
+               // about = true\82Ì\8fê\8d\87\82Í\81A\82R\95\8e\9a\95ª\82Ù\82Ç\82¢\82¢\82©\82°\82ñ\8d·\82ð\91«\82µ\82Ä\82¨\82­
+               return FALSE;
+       }
+
+       if ( fLongest ){
+//             int wordcount = 10;     // 10\8cê\82Ü\82Å
+               while ( *p && *p != '.' ){
+                       if ( !IsWordChar( *p ) || (alnum && !isalphanum(*p)) ){
+                               if ( !fSpc ){
+                                       if ( --wordcount == 0 )
+                                               break;
+                                       fSpc = TRUE;
+                               }
+                       } else {
+                               fSpc = FALSE;
+                       }
+                       if ( alnum ){
+                               p = NEXT_CHAR( p );
+                       } else {
+                               p++;
+                       }
+               }
+               wordtail = p;
+       }
+
+       if ( !wordtail )
+               wordtail = p;
+       start = STR_DIFF( wordtop, orgp );
+       end = STR_DIFF( wordtail, orgp );
+       if ( start == end )
+               return false;
+       if ( wordprev ){
+               prevstart = STR_DIFF( wordprev, orgp );
+       } else {
+               prevstart = start;
+       }
+       return TRUE;
+}
+#if 0
+bool mbGetWord( const tchar *str, int pos, int &start, int &end, bool fLongest, int wordcount )
+{
+       ushort c;
+       const tchar *sp = str + pos;
+       LD_CHAR( c, sp );
+       if ( !mbIsWordChar( c ) )
+               return false;
+
+       const tchar *orgp = str;
+       const tchar *p = orgp;
+       const tchar *wordtop = p;
+       const tchar *wordtail = NULL;
+       BOOL fSpc = FALSE;
+       while ( 1 ){
+               sp = p;
+               LD_CHAR( c, p );
+               if ( (tuchar)c == 0x00 )
+                       break;
+               if ( !mbIsWordChar( c ) ){
+                       if ( orgp + pos < sp ){
+                               wordtail = sp;
+                               break;
+                       }
+                       fSpc = TRUE;
+               } else {
+                       if ( fSpc ){
+                               wordtop = sp;
+                               fSpc = FALSE;
+                       }
+               }
+       }
+       p = sp;
+       if ( wordtop > orgp + pos ){
+               // \92P\8cê\82Ì\8bæ\90Ø\82è\82¾\82Á\82½
+               return false;
+       }
+
+       if ( fLongest ){
+//             int wordcount = 10;     // 10\8cê\82Ü\82Å
+               while ( 1 ){
+                       sp = p;
+                       LD_CHAR( c, p );
+                       if ( (tuchar)c == 0x00 )
+                               break;
+                       if ( c == '.' )
+                               break;
+                       if ( !mbIsWordChar( c ) ){
+                               if ( !fSpc ){
+                                       if ( --wordcount == 0 )
+                                               break;
+                                       fSpc = TRUE;
+                               }
+                       } else {
+                               fSpc = FALSE;
+                       }
+               }
+               wordtail = sp;
+       }
+
+       if ( !wordtail )
+               wordtail = sp;
+       start = STR_DIFF( wordtop, orgp );
+       end = STR_DIFF( wordtail, orgp );
+       return TRUE;
+}
+bool mbIsWordChar( unsigned short c )
+{
+       if ( c < 0x100 ){
+               // \94¼\8ap\95\8e\9a
+               if ( isalphanum( c ) || c == '-' || c == '\'' ||
+                        (c >= 0x86 && c <= 0xBF ) )
+                       return true;
+               else
+                       return false;
+       }
+       // \91S\8ap\95\8e\9a
+       if (
+               // \89p\90\94\8e\9a\81A\83J\83^\83J\83i\81A\82Ð\82ç\82ª\82È\81A\83M\83\8a\83V\83\83\81A\83\8d\83V\83A
+               (c >= 0x824f && c <= 0x8491) ||
+               // \8a¿\8e\9a
+               (c >= 0x889F) ||
+               // \83A\83|\83X\83g\83\8d\83t\83B
+               (c == CODE_APOSTROPHE)
+               )
+               return true;
+       else
+               return false;
+}
+#endif
+//\89p\90\94\8e\9a\82Ì\94»\95Ê
+int isalphanum( tuchar c )
+{
+       if ( c >= _t('A') && c <= _t('Z') ){
+               return 1;
+       }
+       if ( c >= _t('a') && c <= _t('z') ){
+               return 1;
+       }
+       if ( c >= _t('0') && c <= _t('9') ){
+               return 1;
+       }
+       return 0;
+}
+
diff --git a/DCHookTest/StringLib.h b/DCHookTest/StringLib.h
new file mode 100644 (file)
index 0000000..4c3c371
--- /dev/null
@@ -0,0 +1,74 @@
+//---------------------------------------------------------------------------
+#ifndef StringLibH
+#define StringLibH
+//---------------------------------------------------------------------------
+
+#include <mbctype.h>
+
+// Constants //
+#define        CODE_APOSTROPHE 0x9188  // \81f
+
+// typedefs and macros //
+#ifdef USE_UNICODE
+typedef wchar_t tuchar;
+typedef wchar_t tchar;
+#define        LD_CHAR(c,p)    c = *p++;
+#define        ST_CHAR(c,p)    *p++ = c;
+#define        MOV_CHAR(p,q)   *p++ = *q++;
+#define        IS_ENDCHAR(c)   (!(c))
+#define        NEXT_CHAR(p)    CharNextW(p)
+#undef _tcslen
+#define        _tcslen                 wcslen
+#define        _t(x)                   L##x
+#define        mustr                           __mustr
+#include "mustr.h"
+#else
+typedef unsigned char tuchar;
+typedef char tchar;
+#define        LD_CHAR(c, p)   {c = (unsigned char)*(*(unsigned char**)&p)++; if(_ismbblead(c)) c = (unsigned short)(((unsigned short)c << 8) + (unsigned char)*(*(unsigned char**)&p)++);}
+#define        ST_CHAR(c, p)   {if ((unsigned short)c > 0x100) *(*(unsigned char**)&p)++ = (unsigned char)(c >> 8); *(*(unsigned char**)&p)++ = (unsigned char)c;}
+#define        MOV_CHAR(p, q)  { unsigned char c = *(*(unsigned char**)&q)++ = *(*(unsigned char**)&p)++; if ( _ismbblead( c ) ) *(*(unsigned char**)&q)++ = *(*(unsigned char**)&p)++; }
+#define        IS_ENDCHAR(c)   (!((unsigned char)(c)))
+#define        NEXT_CHAR(p)    CharNextA(p)
+#define        _tcslen                 strlen
+#define        _t(x)                   x
+#define        mustr(s)                        (s)
+#endif
+
+typedef unsigned int uint;
+typedef unsigned short ushort;
+
+#define        STR_DIFF( p1, p2 )      ( (uint)( (tchar*)(p1) - (tchar*)(p2) ) )
+
+// prototypes //
+int isalphanum( tuchar c );
+bool mbIsWordChar( unsigned short c );
+BOOL GetWord( const tchar *str, int pos, int &start, int &end, int &prevstart, bool fLongest, int wordcount, bool about, bool alnum );
+bool mbGetWord( const tchar *str, int pos, int &start, int &end, bool fLongest, int wordcount );
+
+// inlines //
+inline bool IsWordChar( tuchar c )
+{
+#ifdef _UNICODE
+       WORD ct;
+       GetStringTypeW(CT_CTYPE1,&c,1,&ct);
+       return (ct & (C1_ALPHA|C1_DIGIT)) || c=='-' || c==CODE_JPROLONG || c=='\'' || c=='_';
+#else
+       return isalphanum( c ) || c == '-' || c == '\'' || c >= 0xc0;
+#endif
+}
+#if 0
+inline bool IsNotWordChar( tuchar c )
+{
+#ifdef USE_UNICODE
+       WORD ct;
+       GetStringTypeW(CT_CTYPE1,&c,1,&ct);
+       return (ct & (C1_SPACE|C1_PUNCT|C1_CNTRL|C1_BLANK)) ? true : false;
+#else
+       return !IsWordChar(c);
+#endif
+}
+#endif
+
+#endif
\ No newline at end of file
diff --git a/DCHookTest/Util.cpp b/DCHookTest/Util.cpp
new file mode 100644 (file)
index 0000000..b482951
--- /dev/null
@@ -0,0 +1,690 @@
+//---------------------------------------------------------------------------
+#include <vcl.h>
+#pragma hdrstop
+#include "prgconfig.h"
+#include "Util.h"
+#include "prgprof.h"
+
+//---------------------------------------------------------------------------
+const char *AppName = "DokoPop";
+const char *StrVersion = "Ver.2.0.23";
+int VersionValue = 0x020017;   // xxyyzz -> xx.yy.zz x=major y=minor(0-255) z=release(0-255)
+
+#pragma package(smart_init)
+
+#ifdef USE_UNICODE
+const char APPNAME[] = {"DokoPop/Unicode"};
+#else
+const char APPNAME[] = {"DokoPop"};
+#endif
+
+const char *AMODI_EXE_PATH = "amodi.exe";
+//const char *AMODI_EXE_PATH = "\\src\\amodi\\amodi\\bin\\Debug\\amodi.exe";
+
+const char *EXMODIST_EXE_PATH = "ExMODIst.exe";
+
+bool WindowsNT = false;
+bool fWow64 = false;
+
+HWND hwndMain = NULL;
+
+HKEY OpenKey( HKEY hkey, const char *keyname )
+{
+       HKEY newkey;
+       if ( RegOpenKeyEx( hkey, keyname, 0, KEY_ALL_ACCESS, &newkey ) == ERROR_SUCCESS ){
+               return newkey;
+       }
+       return NULL;
+}
+
+HKEY CreateKey( HKEY hkey, const char *keyname )
+{
+       HKEY newkey;
+       DWORD result;
+       if ( RegCreateKeyEx( hkey, keyname, 0, (LPTSTR)keyname, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &newkey, &result ) == ERROR_SUCCESS ){
+               return newkey;
+       }
+       return NULL;
+}
+DWORD GetValueLength( HKEY hkey, const char *name )
+{
+       DWORD len = 0;
+       if ( RegQueryValueEx( hkey, (LPTSTR)name, 0, NULL, NULL, &len ) == ERROR_SUCCESS ){
+               return len;
+       }
+       return 0L;
+}
+#if 0
+DWORD ReadInteger( HKEY hkey, const char *name, DWORD val )
+{
+       DWORD len = sizeof(DWORD);
+       DWORD v;
+       if ( RegQueryValueEx( hkey, (LPTSTR)name, 0, NULL, (LPBYTE)&v, &len ) == ERROR_SUCCESS ){
+               return v;
+       }
+       return val;
+}
+AnsiString ReadString( HKEY hkey, const char *name, const char *def )
+{
+       DWORD len = GetValueLength( hkey, name );
+       if ( len ){
+               char *buf = new char[ len ];
+               if ( RegQueryValueEx( hkey, (LPTSTR)name, 0, NULL, (LPBYTE)buf, &len ) == ERROR_SUCCESS ){
+                       AnsiString s = buf;
+                       delete buf;
+                       return s;
+               }
+       }
+       return def;
+}
+#endif
+TMyIni::TMyIni( HKEY root, const char *soft, bool can_create )
+{
+       hroot = can_create ? CreateKey( root, soft ) : OpenKey( root, soft );
+}
+TMyIni::~TMyIni()
+{
+       if ( hroot ){
+               RegCloseKey( hroot );
+       }
+}
+void TMyIni::WriteInteger( const char *section, const char *key, int val )
+{
+       HKEY hkey = CreateKey( hroot, section );
+       if ( hkey ){
+               RegSetValueEx( hkey, (LPCTSTR)key, 0, REG_DWORD, (LPBYTE)&val, sizeof(DWORD) );
+               RegCloseKey( hkey );
+       }
+}
+int TMyIni::ReadInteger( const char *section, const char *key, int val )
+{
+       HKEY hkey = OpenKey( hroot, section );
+       if ( hkey ){
+               DWORD len = sizeof(DWORD);
+               DWORD v;
+               if ( RegQueryValueEx( hkey, (LPTSTR)key, 0, NULL, (LPBYTE)&v, &len ) == ERROR_SUCCESS ){
+                       return v;
+               }
+       }
+       return val;
+}
+void TMyIni::WriteString( const char *section, const char *key, const char *str )
+{
+       HKEY hkey = NULL;
+       if ( section )
+               hkey = CreateKey( hroot, section );
+       if ( !section || hkey ){
+               RegSetValueEx( hkey, (LPCTSTR)key, 0, REG_SZ, (LPBYTE)str, lstrlen(str)+1 );
+               RegCloseKey( hkey );
+       }
+}
+AnsiString TMyIni::ReadString( const char *section, const char *key, const char *str )
+{
+       HKEY hkey = NULL;
+       if ( section )
+               hkey = OpenKey( hroot, section );
+       if ( !section || hkey ){
+               DWORD len = GetValueLength( hkey, key );
+               if ( len ){
+                       char *buf = new char[ len ];
+                       if ( RegQueryValueEx( hkey, (LPTSTR)key, 0, NULL, (LPBYTE)buf, &len ) == ERROR_SUCCESS ){
+                               AnsiString s = buf;
+                               delete[] buf;
+                               return s;
+                       }
+                       delete[] buf;
+               }
+       }
+       return str;
+}
+
+#define        NAMEBUFFSIZE    512
+BOOL QueryInfoKey( HKEY hkey, DWORD *maxvalue, DWORD *maxdata );
+BOOL EnumValue( HKEY hkey, DWORD index, AnsiString &name, void *pbuffer=NULL, DWORD *maxlen=NULL, DWORD *type=NULL );
+
+void TMyIni::ReadValues( const char *section, TStrings *strs )
+{
+       strs->Clear();
+
+       HKEY hkey = OpenKey( hroot, section );
+       if ( hkey ){
+               DWORD maxvaluename;
+               DWORD maxvaluedata;
+               if ( !QueryInfoKey( hkey, &maxvaluename, &maxvaluedata ) ){
+                       // \93®\82©\82È\82¢\81I\81I\81I
+                       maxvaluename = 128;
+                       maxvaluedata = 4096;    // \93K\93\96\81I\81I
+               }
+
+               AnsiString _entry;
+               char *buf = new char[ maxvaluedata + 1 ];
+               for ( int i=0;;i++ ){
+                       DWORD maxlen = maxvaluedata + 1;
+                       if ( !EnumValue( hkey, i, _entry, buf, &maxlen ) )
+                               break;
+                       strs->Add( _entry );
+               }
+               delete[] buf;
+       }
+}
+
+//
+// TAppIni class
+//
+TAppIni::TAppIni()
+       :super(HKEY_CURRENT_USER, REG_PDICEXE, false)
+{
+#ifdef USE_UNICODE
+       if (!hroot){
+               super::super(HKEY_CURRENT_USER, REG_PDICEXE, false);
+       }
+#endif
+}
+
+const char *sLeft = "Left";
+const char *sTop = "Top";
+const char *sWidth  = "Width";
+const char *sHeight = "Height";
+
+void LoadForm( const char *section, TForm *form, HWND hwnd )
+{
+       RECT rc;
+       if ( hwnd ){
+               GetWindowRect( hwnd, &rc );
+       } else {
+               rc.left = rc.top = 0;
+       }
+       form->Left = Ini->ReadInteger(section, sLeft, form->Left) + rc.left;
+       form->Top = Ini->ReadInteger(section, sTop, form->Top ) + rc.top;
+       RECT rcScr;
+       GetScreenSize(form->Handle?form->Handle:hwnd, &rcScr);
+       int sx = rcScr.right - rcScr.left;
+       int sy = rcScr.bottom - rcScr.top;
+
+       switch ( form->BorderStyle ){
+       case bsSizeable:
+       case bsToolWindow:
+       case bsSizeToolWin:
+               form->Width = Ini->ReadInteger( section, sWidth, form->Width );
+               form->Height = Ini->ReadInteger( section, sHeight, form->Height );
+               break;
+       }
+       // \89æ\96Ê\82Ì\8aO\82©\82Ç\82¤\82©\81H
+       if (form->Left+form->Width >= sx){
+               // \89E\92[
+               form->Left = sx - form->Width;
+       }
+       if (form->Left < rcScr.left){
+               // \8d\92[
+               form->Left = rcScr.left;
+       }
+       if (form->Top+form->Height >= sy){
+               // \89º\92[
+               form->Top = sy - form->Height;
+       }
+       if (form->Top < rcScr.top){
+               // \8fã\92[
+               form->Top = rcScr.top;
+       }
+}
+void SaveForm( const char *section, TForm *form, HWND hwnd )
+{
+       RECT rc;
+       if ( hwnd ){
+               GetWindowRect( hwnd, &rc );
+       } else {
+               rc.left = rc.top = 0;
+       }
+       Ini->WriteInteger( section, sLeft, form->Left - rc.left );
+       Ini->WriteInteger( section, sTop, form->Top - rc.top );
+       switch ( form->BorderStyle ){
+       case bsSizeable:
+       case bsToolWindow:
+       case bsSizeToolWin:
+               Ini->WriteInteger( section, sWidth, form->Width );
+               Ini->WriteInteger( section, sHeight, form->Height );
+               break;
+       }
+}
+
+BOOL QueryInfoKey( HKEY hkey, DWORD *maxvalue, DWORD *maxdata )
+{
+       char *classname = new char[ 512 ];      // \82±\82ñ\82È\82à\82ñ\82Å\82¢\82¢\82©\82È\82\9f\81H
+       DWORD classnamesize = 512;
+       DWORD SubKeys;
+       DWORD MaxSubKey;
+       DWORD MaxClass;
+       DWORD Values;
+       DWORD MaxValueName;
+       DWORD MaxValueData;
+       DWORD SecurityDescriptor;
+       FILETIME LastWriteTime;
+       if ( ::RegQueryInfoKey( hkey, classname, &classnamesize,
+               NULL,
+               &SubKeys,
+               &MaxSubKey,
+               &MaxClass,
+               &Values,
+               &MaxValueName,
+               &MaxValueData,
+               &SecurityDescriptor,
+               &LastWriteTime
+               ) != ERROR_SUCCESS ){
+               delete[] classname;
+               return FALSE;
+       }
+       if ( maxvalue )
+               *maxvalue = MaxValueName;
+       if ( maxdata )
+               *maxdata = MaxValueData;
+       delete[] classname;
+       return TRUE;
+}
+BOOL EnumValue( HKEY hkey, DWORD index, AnsiString &name, void *pbuffer, DWORD *maxlen, DWORD *type )
+{
+       char *buffer = new char[ NAMEBUFFSIZE ];
+       DWORD buflen = NAMEBUFFSIZE;
+       if ( RegEnumValue( hkey, index, buffer, &buflen, 0, type, (LPBYTE)pbuffer, maxlen ) == ERROR_SUCCESS ){
+               name = buffer;
+               delete[] buffer;
+               return TRUE;
+       }
+       delete[] buffer;
+       return FALSE;
+}
+bool CheckPassword( const char *str )
+{
+       AnsiString s;
+       if ( str ){
+               s = str;
+       } else {
+               s = Ini->ReadString( "Main", "PW", "" );
+       }
+       return s == "123";
+}
+void CheckWOW64()
+{
+       typedef BOOL WINAPI (*FNIsWow64Process)(HANDLE hProcess, PBOOL Wow64Process);
+
+       FNIsWow64Process _IsWow64Process = (FNIsWow64Process)GetProcAddress(GetModuleHandle("kernel32"),"IsWow64Process");
+       if (_IsWow64Process){
+               BOOL flag = FALSE;
+               if (_IsWow64Process(GetCurrentProcess(), &flag)){
+                       fWow64 = flag;
+               }
+       }
+}
+void MoveToTop( HWND hwnd )
+{
+       if ( IsIconic( hwnd ) )
+               ShowWindow( hwnd, SW_RESTORE );
+
+       // Undocumented way
+
+       HMODULE hUser32 = GetModuleHandle("user32");
+       if ( hUser32 ){
+               typedef void (WINAPI *PROCSWITCHTOTHISWINDOW) (HWND, BOOL);
+               PROCSWITCHTOTHISWINDOW SwitchToThisWindow = (PROCSWITCHTOTHISWINDOW)GetProcAddress(hUser32, TEXT("SwitchToThisWindow"));
+               if ( SwitchToThisWindow ){
+                       SwitchToThisWindow( hwnd, true );
+                       FreeLibrary( hUser32 );
+                       return;
+               }
+       }
+
+       FreeLibrary( hUser32 );
+
+       DWORD locktimeout;
+       /*BOOL changed = */ SystemParametersInfo( SPI_GETFOREGROUNDLOCKTIMEOUT, 0, &locktimeout, SPIF_SENDWININICHANGE | SPIF_UPDATEINIFILE );
+       SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, NULL, SPIF_UPDATEINIFILE);
+       SetForegroundWindow(hwnd);
+       SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, locktimeout, NULL, SPIF_UPDATEINIFILE);
+}
+// window(hwnd)\82ðhwndParent\82Ìcenter\82Ö\88Ú\93®
+// screen\82Ì\8aO\82Ö\8fo\82é\8fê\8d\87\82Í\92²\90®\82·\82é
+void MoveCenter( HWND hwnd, HWND hwndParent )
+{
+       RECT rc;
+       RECT rd;
+       if (!hwndParent){
+               hwndParent = hwndMain;  // parent\82ª\82È\82¯\82ê\82Îmain window
+       }
+       if (hwndParent){
+#ifndef WINCE
+               if ( IsIconic(hwndParent) ){
+                       GetScreenSize(hwndParent, &rc);
+               } else
+#endif
+               {
+                       ::GetWindowRect( hwndParent, &rc );
+               }
+       } else {
+               GetScreenSize(hwnd, &rc);
+       }
+       RECT rcScr;
+       GetScreenSize(hwnd, &rcScr);
+       ::GetWindowRect( hwnd, &rd );
+       int width = rd.right - rd.left;
+       int height = rd.bottom - rd.top;
+       int left = rc.left + ( ( rc.right - rc.left ) - width )/2;
+       int top = rc.top + ( ( rc.bottom - rc.top ) - height )/2;
+       if ( left < rcScr.left ){
+               left = rcScr.left;
+       }
+       if ( top < rcScr.top ){
+               top = rcScr.top;
+       }
+       if ( left + width > rcScr.right ){
+               left = rcScr.right - (rd.right - rd.left);
+       }
+       if ( top + height > rcScr.bottom ){
+               top = rcScr.bottom - (rd.bottom - rd.top);
+       }
+       ::SetWindowPos( hwnd, (HWND)NULL, left & ~7, top, 0, 0, SWP_NOSIZE | SWP_NOZORDER );
+}
+void GetScreenSize(HWND hwndBase, RECT *rcWork, RECT *rcScreen)
+{
+#if 0
+       if (!PdicMain){
+               __assert(false);
+               MLFXPC_CMN_ASSERT(false);
+               if (rcScreen){
+                       SetRect(rcScreen, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN));
+               }
+               if (rcWork){
+                       SystemParametersInfo(SPI_GETWORKAREA, 0, rcWork, 0);
+               }
+               return;
+       }
+#endif
+       //__assert(hwndMain!=NULL);
+       HMONITOR hMonitor = MonitorFromWindow(hwndBase ? hwndBase : (hwndMain ? hwndMain : GetActiveWindow()), MONITOR_DEFAULTTONEAREST);
+       //__assert(hMonitor!=NULL);
+       MONITORINFO mi;
+       memset(&mi, 0, sizeof(mi));
+       mi.cbSize = sizeof(mi);
+       GetMonitorInfo(hMonitor, &mi);
+       if (rcScreen){
+               *rcScreen = mi.rcMonitor;
+       }
+       if (rcWork){
+               *rcWork = mi.rcWork;
+       }
+}
+bool _WinExec( const char *cmd, int show, int waittime, const char *dir)
+{
+       STARTUPINFO sui;
+       memset( &sui, 0, sizeof(STARTUPINFO) );
+       sui.cb = sizeof(STARTUPINFO);
+       sui.dwFlags = STARTF_USESHOWWINDOW;
+       sui.wShowWindow = (WORD)show;
+       sui.lpTitle = (LPTSTR)"";
+       PROCESS_INFORMATION pi;
+       if ( !CreateProcess( NULL, (LPTSTR)cmd, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, dir, &sui, &pi ) )
+               return false;
+       bool ret = true;
+       if ( waittime ){
+               int r = WaitForInputIdle( pi.hProcess, waittime );
+               ret = r==0;
+       }
+       CloseHandle( pi.hProcess );
+       return ret;
+}
+static const char *MyWinTitle = "<Processing...>";
+HANDLE WinExecEx( const char *cmd, int show, const char *dir, const char *title )
+{
+       STARTUPINFO sui;
+       memset( &sui, 0, sizeof(STARTUPINFO) );
+       sui.cb = sizeof(STARTUPINFO);
+       sui.dwFlags = STARTF_USESHOWWINDOW;
+       sui.wShowWindow = (WORD)show;
+       sui.lpTitle = (LPTSTR)(title ? title : MyWinTitle);
+       PROCESS_INFORMATION pi;
+       if ( !CreateProcess( NULL, (LPTSTR)cmd, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, dir, &sui, &pi ) )
+               return NULL;
+       return pi.hProcess;
+}
+bool LaunchPdic()
+{
+       TAppIni *ini = new TAppIni;
+       if ( !ini->hroot ){
+               delete ini;
+               return false;
+       }
+
+       AnsiString s = ini->ReadString( PFS_COMMON, PFS_PATH, "" );
+       delete ini;
+       if ( s.Length() == 0 )
+               return false;
+       s += "\\";
+       s += NAME_PDICEXE;
+
+       return _WinExec( s.c_str(), SW_SHOWNOACTIVATE|SW_MINIMIZE, 500 );
+}
+bool MODIInstalled()
+{
+       HANDLE h = WinExecEx(EXMODIST_EXE_PATH, SW_HIDE);
+       if (!h){
+               dbw("ExMODist exec error: %d", GetLastError());
+               return false;
+       }
+       WaitForSingleObject(h, INFINITE);
+       DWORD exitCode = 0;
+       BOOL r = GetExitCodeProcess(h, &exitCode);
+       CloseHandle(h);
+       if (r){
+               return exitCode ? true : false;
+       }
+       return false;
+}
+bool AMODIRunable()
+{
+       return MODIInstalled() && GetDNFVersion()>=451;
+}
+bool LaunchAMODI()
+{
+       if (!AMODIRunable()) return false;
+
+       int show = 
+#ifdef _DEBUG
+               SW_SHOWNOACTIVATE|SW_MINIMIZE;
+#else
+               SW_HIDE;
+#endif
+       if (!_WinExec( AMODI_EXE_PATH, show, 500))
+               return false;
+
+       HWND hwnd = NULL;
+       for (int i=0;i<30;i++){
+               hwnd = FindAMODI();
+               if (hwnd)
+                       break;
+               Sleep(10);
+       }
+       return hwnd!=NULL;
+}
+void TerminateAMODI()
+{
+       HWND hwnd = FindAMODI();
+       if (hwnd){
+               PostMessage(hwnd, WM_CLOSE, 0, 0);
+       }
+}
+void ShowAMODI()
+{
+       HWND hwnd = FindAMODI();
+       if (hwnd){
+               ShowWindow(hwnd, SW_SHOW);
+               ShowWindow(hwnd, SW_RESTORE);
+       }
+}
+static HWND hwndFind;
+static const char *findClass = NULL;
+static const char *findWindow = NULL;
+static const char *findAppName = NULL;
+static BOOL CALLBACK EnumWindowsProc( HWND hwnd, LPARAM lParam )
+{
+       char buf[80];
+       
+       if (findClass){
+               if ( !GetClassName( hwnd, buf, sizeof(buf)-1 ) ) return TRUE;
+               //DBW("class: %s", buf);
+               if (strcmp( buf, findClass )) return TRUE;
+       }
+       if (findWindow){
+               if (GetWindowText(hwnd, buf, sizeof(buf))<0){
+                       return TRUE;
+               }
+               //DBW("wnd: %s", buf);
+               if (strcmp(buf, findWindow)){ return TRUE; }
+       }
+
+       if (findAppName){
+               COPYDATASTRUCT cd;
+               cd.dwData = WMCD_EXISTCHECK;
+               cd.lpData = (void*)findAppName;
+               cd.cbData = strlen(findAppName)+1;
+               if ( SendMessage( hwnd, WM_COPYDATA, 0, (LPARAM)&cd ) ){
+                       goto jfound;
+               }
+       } else {
+jfound:
+               hwndFind = hwnd;
+               return FALSE;
+       }
+       return TRUE;
+}
+
+HWND FindApp(const char *clsname, const char *wndname, const char *appname)
+{
+       hwndFind = NULL;
+       findClass = clsname;
+       findWindow = wndname;
+       findAppName = appname;
+       EnumWindows( (FARPROC)EnumWindowsProc, 0 );
+       return hwndFind;
+}
+HWND FindPrev()
+{
+       return FindApp("TDCHookMainForm", NULL, APPNAME);
+}
+int CheckVersion(HWND hwnd)
+{
+       int ver = SendMessage(hwnd, WM_GET_VERSION, 0, 0);
+       if (ver==0){ return -1; }       // older than ver.2.0
+       return ver - VersionValue;
+}
+HWND FindAMODI()
+{
+       static const char APPNAME_AMODI[] =  "Auto MODI";
+       return FindApp(NULL, APPNAME_AMODI, APPNAME_AMODI);
+}
+static HWND hwndFound;
+static BOOL CALLBACK EnumWindowsProcPS( HWND hwnd, LPARAM lParam )
+{
+       char clsname[80];
+       if ( !GetClassName( hwnd, clsname, sizeof(clsname)-1 ) ) return TRUE;
+       if ( strcmp( clsname, "PSPOPUPWIN" )
+               && strcmp( clsname, "PSMENU" ) ) return TRUE;
+
+       hwndFound = hwnd;
+       
+       return FALSE;
+}
+// PDIC\82Ìpopup window\82ð\92T\82·
+HWND FindPopupWindow( )
+{
+       hwndFound = NULL;
+       EnumWindows( (WNDENUMPROC)EnumWindowsProcPS, 0 );
+       return hwndFound;
+}
+
+void ShowManual(HWND hwnd)
+{
+       AnsiString dir = ExtractFileDir( Application->ExeName );
+       ShellExecute( hwnd, "open", NAME_DKPPTXT, NULL, dir.c_str(), SW_SHOW ); 
+}
+
+void ShowLatestVersion()
+{
+#if __PROTO
+       const char *url = "http://pdic.la.coocan.jp/unicode/dev.html";
+#else
+       const char *url = "http://dokopop.osdn.jp/";
+#endif
+       ShellExecute( NULL, _T("open"), url, NULL, NULL, SW_SHOW );
+}
+
+// \8eQ\8dl
+// https://msdn.microsoft.com/ja-jp/library/hh925568(v=vs.110).aspx#net_d
+// http://www.atmarkit.co.jp/ait/articles/1210/26/news086.html
+unsigned GetDNFVersion()
+{
+       HKEY dnfKey;
+       if ( RegOpenKeyEx( HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\NET Framework Setup\\NDP", 0, KEY_READ, &dnfKey ) == ERROR_SUCCESS ){
+               int version = 0;
+               HKEY verKey;
+               if ( RegOpenKeyEx( dnfKey, "v4.0", 0, KEY_READ, &verKey ) == ERROR_SUCCESS ){
+                       version = 400;
+                       RegCloseKey(verKey);
+                       if ( RegOpenKeyEx( dnfKey, "v4", 0, KEY_READ, &verKey ) == ERROR_SUCCESS ){
+                               HKEY fullKey;
+                               if ( RegOpenKeyEx( verKey, "Full", 0, KEY_READ, &fullKey ) == ERROR_SUCCESS ){
+                                       DWORD dwType = REG_DWORD;
+                                       DWORD dwByte = 4;
+                                       DWORD dwValue = 0;
+                                       if ( RegQueryValueEx( fullKey, "Release", NULL, &dwType, (BYTE*)&dwValue, &dwByte) == ERROR_SUCCESS){
+#if 0
+                                               if (dwValue >= 394254){
+                                                       version = 461;
+                                               } else
+                                               if (dwValue >= 393295){
+                                                       version = 460;
+                                               } else
+                                               if (dwValue >= 379893){
+                                                       version = 452;
+                                               } else
+#endif
+                                               if (dwValue >= 378675){
+                                                       version = 451;
+                                               } else
+                                               if (dwValue >= 378389){
+                                                       version = 450;
+                                               }
+                                       }
+                                       RegCloseKey( fullKey );
+                               }
+                               RegCloseKey( verKey );
+                       }
+               } else
+               if ( RegOpenKeyEx( dnfKey, "v3.5", 0, KEY_READ, &verKey ) == ERROR_SUCCESS ){
+                       version = 350;
+                       RegCloseKey(verKey);
+               }
+               RegCloseKey(dnfKey);
+               return version;
+       }
+       return 0;
+}
+
+static HWND hWin = NULL;
+static const char *clsname = "TDbgMsgForm";
+static const char *winname = "Debug Messenger";
+void dbw( const char *format, ... )
+{
+       if ( !hWin ){
+               hWin = FindWindowA( clsname, winname );
+               if ( !hWin ) return;
+       }
+       va_list ap;
+       va_start( ap, format );
+       char buf[ 2048 ];
+       wvsprintf( buf, format, ap );
+       COPYDATASTRUCT cds;
+       cds.dwData = 1; // Indicate String
+       cds.cbData = strlen(buf);
+       cds.lpData = buf;
+       SendMessage( hWin, WM_COPYDATA, NULL, (LPARAM)&cds );
+       va_end( ap );
+}
+
diff --git a/DCHookTest/Util.h b/DCHookTest/Util.h
new file mode 100644 (file)
index 0000000..c2e2a27
--- /dev/null
@@ -0,0 +1,118 @@
+//---------------------------------------------------------------------------
+#ifndef UtilH
+#define UtilH
+//---------------------------------------------------------------------------
+
+/*------------------------------------------*/
+/*             Configuration                                           */
+/*------------------------------------------*/
+#define        USE_DDE         1       // Popup Search\82Í\81ADDE\82Å\8ds\82¤,
+                                               // otherwise uses WM_COPYDATA message. 
+
+#ifdef USE_UNICODE
+#define        DDE_SERVICE_NAME        "PDICU"
+//#define      REG_PDICEXE_OLD         "Software\\ReliefOffice\\PDICU"
+#define        REG_PDICEXE                     "Software\\ReliefOffice\\PDIC2"
+#define        APPREGNAME                      "DokoPopU"
+#define        NAME_PDICEXE            "PDICU.EXE"
+#define        NAME_DKPPTXT            "DKPU.TXT"
+#define        NAME_DKPPHKDLL          "DKPUHK.DLL"
+#define        NAME_BMPFILE            "DKPU.BMP"
+#define        FMTS                            "%ws"
+#else
+#define        DDE_SERVICE_NAME        "PDICW"
+#define        REG_PDICEXE                     "Software\\ReliefOffice\\PDICW32"
+#define        APPREGNAME                      "DokoPop"
+#define        NAME_PDICEXE            "PDICW32.EXE"
+#define        NAME_DKPPTXT            "DKPP.TXT"
+#define        NAME_DKPPHKDLL          "DKPPHK.DLL"
+#define        NAME_BMPFILE            "DKPP.BMP"
+#define        FMTS                            "%s"
+#endif
+extern const char APPNAME[];
+
+/*------------------------------------------*/
+/*             Type Definitions                                        */
+/*------------------------------------------*/
+
+#define        WMCD_EXISTCHECK         0x4000
+
+#define        WM_GET_VERSION          (WM_APP+0x300)
+
+#define        foreach(obj, it, type) \
+       for (type::iterator it=(obj).begin();it!=(obj).end();it++)
+
+#ifdef __VCL0_H__
+
+#define        VCL_SIZEABLE()  do {BorderStyle = bsSizeable;} while(0) //TODO: VCL Bug
+
+class TMyIni {
+public:
+       HKEY hroot;
+public:
+       TMyIni( HKEY root, const char *soft, bool can_create );
+       ~TMyIni();
+       void WriteInteger( const char *section, const char *key, int val );
+       int ReadInteger( const char *section, const char *key, int val );
+       void WriteString( const char *section, const char *key, const char *str );
+       AnsiString ReadString( const char *section, const char *key, const char *str );
+       void ReadValues( const char *section, TStrings *strs );
+};
+
+class TAppIni : public TMyIni {
+typedef TMyIni super;
+public:
+       TAppIni();
+};
+
+void LoadForm( const char *section, TForm *form, HWND hwnd );
+void SaveForm( const char *section, TForm *form, HWND hwnd );
+#endif
+
+/*------------------------------------------*/
+/*             Prototypes                                                      */
+/*------------------------------------------*/
+bool LaunchPdic();
+bool MODIInstalled();
+bool AMODIRunable();
+bool LaunchAMODI();
+void TerminateAMODI();
+void ShowAMODI();
+
+bool CheckPassword( const char *str );
+void CheckWOW64();
+void MoveToTop( HWND hwnd );
+void MoveCenter( HWND hwnd, HWND hwndParent );
+void GetScreenSize(HWND hwndBase, RECT *rcWork, RECT *rcScreen=NULL);
+bool _WinExec( const char *cmd, int show, int waittime, const char *dir=NULL);
+HANDLE WinExecEx( const char *cmd, int show, const char *dir=NULL, const char *title=NULL );
+HWND FindApp(const char *clsname, const char *wndname, const char *appname);
+HWND FindPrev();
+int CheckVersion(HWND hwnd);
+HWND FindAMODI();
+HWND FindPopupWindow( );
+
+void ShowManual( HWND hwnd );
+void ShowLatestVersion();
+
+unsigned GetDNFVersion();      // get .NET Framework version
+
+void dbw( const char *format, ... );
+
+#ifdef _DEBUG
+#define        DBW     dbw
+#else
+#define        DBW     (void)
+#endif
+
+/*------------------------------------------*/
+/*             Global Variables                                        */
+/*------------------------------------------*/
+extern const char *AppName;
+extern const char *StrVersion;
+extern int VersionValue;
+extern bool WindowsNT;
+extern bool fWow64;
+
+#endif
+
diff --git a/DCHookTest/cpd.bat b/DCHookTest/cpd.bat
new file mode 100644 (file)
index 0000000..d396239
--- /dev/null
@@ -0,0 +1,3 @@
+copy \src\DCHook\DCHook\Win32\Release\DCHook.dll DKPUHK.DLL
+copy \src\DCHook\DCHook\x64\Release\DCHook.dll DKPUHK64.DLL
+copy ..\DCHook64\dchk64\x64\Release\dchk64.exe DKPUHK64.exe
diff --git a/DCHookTest/dkpp.bmp b/DCHookTest/dkpp.bmp
new file mode 100644 (file)
index 0000000..c0684f5
Binary files /dev/null and b/DCHookTest/dkpp.bmp differ
diff --git a/DCHookTest/dkpp.ico b/DCHookTest/dkpp.ico
new file mode 100644 (file)
index 0000000..caa0a9b
Binary files /dev/null and b/DCHookTest/dkpp.ico differ
diff --git a/DCHookTest/dkpp0.ico b/DCHookTest/dkpp0.ico
new file mode 100644 (file)
index 0000000..8e04880
Binary files /dev/null and b/DCHookTest/dkpp0.ico differ
diff --git a/DCHookTest/dkpp2.bmp b/DCHookTest/dkpp2.bmp
new file mode 100644 (file)
index 0000000..d11f0b1
Binary files /dev/null and b/DCHookTest/dkpp2.bmp differ
diff --git a/DCHookTest/dkpp3.bmp b/DCHookTest/dkpp3.bmp
new file mode 100644 (file)
index 0000000..f1a433a
Binary files /dev/null and b/DCHookTest/dkpp3.bmp differ
diff --git a/DCHookTest/dkpp4.bmp b/DCHookTest/dkpp4.bmp
new file mode 100644 (file)
index 0000000..5ce2ff5
Binary files /dev/null and b/DCHookTest/dkpp4.bmp differ
diff --git a/DCHookTest/dkpps.ico b/DCHookTest/dkpps.ico
new file mode 100644 (file)
index 0000000..22c59fc
Binary files /dev/null and b/DCHookTest/dkpps.ico differ
diff --git a/DCHookTest/dkpps0.ico b/DCHookTest/dkpps0.ico
new file mode 100644 (file)
index 0000000..a6ae6b3
Binary files /dev/null and b/DCHookTest/dkpps0.ico differ
diff --git a/DCHookTest/icon.rc b/DCHookTest/icon.rc
new file mode 100644 (file)
index 0000000..f691b60
--- /dev/null
@@ -0,0 +1,2 @@
+2 ICON "dkpps.ico"
+
diff --git a/DCHookTest/icon.res b/DCHookTest/icon.res
new file mode 100644 (file)
index 0000000..f96a11d
Binary files /dev/null and b/DCHookTest/icon.res differ
diff --git a/DCHookTest/mustr.cpp b/DCHookTest/mustr.cpp
new file mode 100644 (file)
index 0000000..a0479bf
--- /dev/null
@@ -0,0 +1,54 @@
+#include <windows.h>
+#pragma hdrstop
+#include "mustr.h"
+
+__mustr::__mustr( const char *str )
+{
+       constructor(str, str ? strlen(str) : 0);
+}
+__mustr::__mustr( const wchar_t *str )
+{
+       constructor(str, str ? wcslen(str) : 0);
+}
+void __mustr::constructor(const char *str, int len)
+{
+       buffer = (void*)str;
+       length = len;
+       type = 1;
+       newbuffer = NULL;
+}
+void __mustr::constructor(const wchar_t *str, int len)
+{
+       buffer = (void*)str;
+       length = len;
+       type = 2;
+       newbuffer = NULL;
+}
+__mustr::~__mustr()
+{
+       if ( newbuffer ) delete[] newbuffer;
+}
+__mustr::operator char *()
+{
+       if ( type == 1 ) return (char*)buffer;
+       if ( newbuffer ) return (char*)newbuffer;
+
+       // Unicode to Ansi
+
+       newbuffer = new char[ length*2 + 1 ];
+       int size = WideCharToMultiByte( CP_ACP, 0, (wchar_t*)buffer, length, newbuffer, length*2, NULL, NULL );
+       newbuffer[size] = '\0';
+       return (char*)newbuffer;
+}
+__mustr::operator wchar_t *()
+{
+       if ( type == 2 ) return (wchar_t*)buffer;
+       if ( newbuffer ) return (wchar_t*)newbuffer;
+
+       // Ansi to Unicode
+
+       *(wchar_t**)&newbuffer = new wchar_t[ length*2 + 1 ];
+       int size = MultiByteToWideChar( CP_ACP, 0, (char*)buffer, length, (wchar_t*)newbuffer, length*2 );
+       ((wchar_t*)newbuffer)[size] = '\0';
+       return (wchar_t*)newbuffer;
+}
diff --git a/DCHookTest/mustr.h b/DCHookTest/mustr.h
new file mode 100644 (file)
index 0000000..a305601
--- /dev/null
@@ -0,0 +1,32 @@
+#ifndef __MUSTR_H
+#define        __MUSTR_H
+
+// \94Ä\97p UNICODE <-> ANSI conversion class
+
+class __mustr {
+protected:
+       void *buffer;
+       char *newbuffer;
+       int length;
+       int type;
+public:
+       __mustr( const char *str );
+       __mustr( const char *str, int len )
+               { constructor(str, len); }
+       __mustr( const wchar_t *str );
+protected:
+       void constructor(const char *str, int len);
+       void constructor(const wchar_t *str, int len);
+public:
+       ~__mustr();
+       operator char *();
+       operator unsigned char *()
+               { return (unsigned char*)(char*)(*this); }
+       operator wchar_t *();
+       char *str()
+               { return (char*)(*this); }
+       wchar_t *wstr()
+               { return (wchar_t*)(*this); }
+};
+
+#endif // __MUSTR_H
diff --git a/DCHookTest/obj/icon.res b/DCHookTest/obj/icon.res
new file mode 100644 (file)
index 0000000..f96a11d
Binary files /dev/null and b/DCHookTest/obj/icon.res differ
diff --git a/DCHookTest/popdisable.bmp b/DCHookTest/popdisable.bmp
new file mode 100644 (file)
index 0000000..a1cf52f
Binary files /dev/null and b/DCHookTest/popdisable.bmp differ
diff --git a/DCHookTest/popdisable.h b/DCHookTest/popdisable.h
new file mode 100644 (file)
index 0000000..e24f02f
--- /dev/null
@@ -0,0 +1,40 @@
+/* This file was Generated by bmp2rgn */
+char bmp2rgn_rgnBytes[240] = 
+{
+    0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 
+    0x0d, 0x00, 0x00, 0x00, 0xd0, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0xf0, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 
+    0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0xea, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 
+    0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 
+    0xec, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 
+    0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 
+    0xed, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 
+    0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 
+    0xee, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 
+    0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 
+    0xef, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 
+    0xf0, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 
+    0xef, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 
+    0x01, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 
+    0xef, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 
+    0x01, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 
+    0xee, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 
+    0x02, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 
+    0xee, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 
+    0x03, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 
+    0xed, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
+    0x04, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
+    0xeb, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 
+    0x06, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 
+    0xe9, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00
+    
+};
+
+#if defined (__cplusplus)
+RGNDATA& bmp2rgn_rgnData = *reinterpret_cast<RGNDATA*>(bmp2rgn_rgnBytes);
+#endif
+RGNDATA* bmp2rgn_rgnDataPtr = reinterpret_cast<RGNDATA*>(bmp2rgn_rgnBytes);
diff --git a/DCHookTest/popenable.bmp b/DCHookTest/popenable.bmp
new file mode 100644 (file)
index 0000000..8e82490
Binary files /dev/null and b/DCHookTest/popenable.bmp differ
diff --git a/DCHookTest/popenable.h b/DCHookTest/popenable.h
new file mode 100644 (file)
index 0000000..5d20ccb
--- /dev/null
@@ -0,0 +1,28 @@
+/* This file was Generated by bmp2rgn */
+char bmp2rgn_rgnBytes[144] = 
+{
+    0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 
+    0x07, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0xf0, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 
+    0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+    0xed, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 
+    0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 
+    0xee, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 
+    0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 
+    0xef, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 
+    0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 
+    0xf0, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 
+    0x01, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 
+    0xef, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
+    0x02, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 
+    0xee, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 
+    0x03, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 
+    0xed, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00
+    
+};
+
+#if defined (__cplusplus)
+RGNDATA& bmp2rgn_rgnData = *reinterpret_cast<RGNDATA*>(bmp2rgn_rgnBytes);
+#endif
+RGNDATA* bmp2rgn_rgnDataPtr = reinterpret_cast<RGNDATA*>(bmp2rgn_rgnBytes);
diff --git a/DCHookTest/prgconfig.cpp b/DCHookTest/prgconfig.cpp
new file mode 100644 (file)
index 0000000..c9096b1
--- /dev/null
@@ -0,0 +1,9 @@
+//---------------------------------------------------------------------------
+
+#pragma hdrstop
+
+#include "prgconfig.h"
+
+//---------------------------------------------------------------------------
+
+#pragma package(smart_init)
diff --git a/DCHookTest/prgconfig.h b/DCHookTest/prgconfig.h
new file mode 100644 (file)
index 0000000..3184021
--- /dev/null
@@ -0,0 +1,9 @@
+//---------------------------------------------------------------------------
+
+#ifndef prgconfigH
+#define prgconfigH
+//---------------------------------------------------------------------------
+
+#define        __PROTO                         1               // \8e\8e\8dì\94Å
+
+#endif
diff --git a/DCHookTest/prgprof.cpp b/DCHookTest/prgprof.cpp
new file mode 100644 (file)
index 0000000..388d2a5
--- /dev/null
@@ -0,0 +1,10 @@
+#pragma hdrstop
+#define        DEFINE_PFS
+#include "prgprof.h"
+
+#pragma package(smart_init)
+
+TMyIni *Ini;
+
+
+
diff --git a/DCHookTest/prgprof.h b/DCHookTest/prgprof.h
new file mode 100644 (file)
index 0000000..cbe052b
--- /dev/null
@@ -0,0 +1,37 @@
+//---------------------------------------------------------------------------
+
+#ifndef prgprofH
+#define prgprofH
+//---------------------------------------------------------------------------
+
+#ifdef DEFINE_PFS
+#define        DEF_PFS(name, str)      extern const char PFS_##name[]; const char PFS_##name[] = str
+#else
+#define        DEF_PFS(name, str)      extern const char PFS_##name[]
+#endif
+
+DEF_PFS(MAIN, "Main");
+DEF_PFS(CONFIG, "Config");
+DEF_PFS(PDIC, "PDIC");
+DEF_PFS(COMMON, "Common");
+DEF_PFS(GRPSEL, "grpsel");
+DEF_PFS(GROUP, "Group");
+DEF_PFS(GROUPOPEN, "GroupOpen");
+DEF_PFS(GROUPNAME, "GroupName");
+DEF_PFS(POPUPKEY, "PopupKey");
+DEF_PFS(TOGGLEKEY, "ToggleKey");
+DEF_PFS(CTRLCLOSE, "CtrlClose");
+DEF_PFS(IGNOREJ, "IgnoreJ");
+DEF_PFS(PATH, "Path");
+DEF_PFS(BANNER, "Banner");
+DEF_PFS(INCSRCH, "IncSrch");
+DEF_PFS(CAPTURE_MODE, "CaptureMode2");
+DEF_PFS(AMODIPATH, "AMODIPath");
+DEF_PFS(DPI_DETECT, "DPIDetect");
+DEF_PFS(SCALE, "Scale");
+DEF_PFS(USE64, "Use64");
+
+extern class TMyIni *Ini;
+
+#endif
+
diff --git a/DCHookTest/stdafx.h b/DCHookTest/stdafx.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/DKPP.TXT b/DKPP.TXT
new file mode 100644 (file)
index 0000000..0c7714f
--- /dev/null
+++ b/DKPP.TXT
@@ -0,0 +1,213 @@
+==========================================================================
+                          \82Ç\82±\83|\83b\83v\81I    Ver.1.11
+==========================================================================
+\8fÐ\89î ---------------------------------------------------------------------
+
+\81@\81u\82Ç\82±\83|\83b\83v\81I\81v\82Í\81ATaN\8dì\82ÌPersonal Dictionary for Win32(\88È\89ºPDIC)\82Æ
+\81@\98A\8cg\82µ\82Ä\81A\83}\83E\83X\82Ì\83N\83\8a\83b\83N\82É\82æ\82Á\82Ä\83}\83E\83X\88Ê\92u\82Ì\92P\8cê\82ð\8c\9f\8dõ\81A\93ú\96{\8cê\96ó\82È
+\81@\82Ç\82ð\83|\83b\83v\83A\83b\83v\83E\83B\83\93\83h\83E\82É\82æ\82Á\82Ä\95\\8e¦\82·\82é\83\\83t\83g\83E\83F\83A\82Å\82·\81B
+
+\93®\8dì\8am\94FOS --------------------------------------------------------------
+
+\81@Windows98/Me
+\81@WindowsNT4.0/2000/XP
+
+\96â\91è\93_ --------------------------------------------------------------------
+
+\81EAcrobat Reader\8fã\82Å\82Í\93®\8dì\82µ\82È\82¢
+\81EOpera\8fã\82Å\82Í\93®\8dì\82µ\82È\82¢
+\81EDOS\91\8b\8fã\82Å\82Í\93®\8dì\82µ\82È\82¢
+\81E16bit\83A\83v\83\8a\8fã\82Å\82Í\93®\8dì\82µ\82È\82¢
+\81E\95¡\90\94\8ds\82É\82Ü\82½\82ª\82é\8fn\8cê\82Í\83q\83b\83g\82µ\82È\82¢
+
+\8f\80\94õ --------------------------------------------------------------------
+
+\81@DKPP111.EXE\82ð\82»\82Ì\82Ü\82Ü\8eÀ\8ds\82µ\82Ä\89º\82³\82¢\81B
+\81@\8e©\93®\93I\82É\83C\83\93\83X\83g\81[\83\8b\82³\82ê\82Ü\82·\81B
+\81@\83X\83^\81[\83g\83A\83b\83v\82É\93o\98^\82µ\82½\95û\82ª\95Ö\97\98\82Å\82·\81B(Windows\8bN\93®\8e\9e\82ÉDokoPop!\82à\8bN\93®)
+
+\81@\82Ç\82±\83|\83b\83v\81I\82É\82ÍPDIC for Win32(\82Å\82«\82ê\82ÎVer.4.50\88È\8d~)\82ª\95K\97v\82Å\82·\81B
+\81@http://homepage3.nifty.com/TaN/pdic-download.html
+  \82©\82ç\83_\83E\83\93\83\8d\81[\83h\82µ\82Ä\89º\82³\82¢\81B
+
+  NT4.0\82Å\82Í\81APSAPI.DLL \82ª\95K\97v\82Å\82·\81B
+  http://homepage3.nifty.com/TaN/psapi.exe
+  \82©\82ç\83_\83E\83\93\83\8d\81[\83h\8cã\81A\89ð\93\80\81A\83V\83X\83e\83\80\83f\83B\83\8c\83N\83g\83\8a(C:\WINNT\System32\82È\82Ç)
+  \82Ö\83R\83s\81[\82µ\82Ä\82­\82¾\82³\82¢\81B
+
+\8eg\97p\95û\96@ -----------------------------------------------------------------
+
+\81@DKPP.EXE\82ð\8bN\93®\82·\82é\82Æ\83^\83X\83N\83g\83\8c\83C\82É\8fí\92\93\82µ\82Ü\82·\81B(DP\82Æ\8f\91\82¢\82Ä\82 \82é\83A\83C\83R\83\93)
+\81@Ctrl\83L\81[\82ð\89\9f\82µ\82È\82ª\82ç\83}\83E\83X\82Ì\89E\83{\83^\83\93\82ð\83N\83\8a\83b\83N\82·\82é\82Æ\81A\83N\83\8a\83b\83N\82µ\82½\88Ê\92u\82Ì
+\81@\92P\8cê\82Ü\82½\82Í\8fn\8cê\82Ì\88Ó\96¡\82ð\95\\8e¦\82µ\82Ü\82·\81B
+
+  \81y\92\8d\88Ó\81zPDIC\96{\91Ì\82Í\95K\82¸\8e«\8f\91\83O\83\8b\81[\83v\82ð\83I\81[\83v\83\93\82µ\82½\8fó\91Ô\82É\82µ\82Ä\82¨\82¢\82Ä\82­\82¾\82³\82¢\81B
+          \82Â\82Ü\82è\81A\92Ê\8fí\82Ì\8c\9f\8dõ(WORD\97\93\93ü\97Í\81j\82ª\82Å\82«\82é\8fó\91Ô\82É\82µ\82Ä\82¨\82¢\82Ä\82­\82¾\82³\82¢\81B
+          (\83\81\83j\83\85\81[\82Ì File | \8e«\8f\91\83O\83\8b\81[\83v\83I\81[\83v\83\93)
+          \8e«\8f\91\95Ï\8a·\92\86\82È\82Ç\81A\92Ê\8fí\82Ì\8c\9f\8dõ\82ª\82Å\82«\82È\82¢\8fó\91Ô\82Å\82Í\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82Í
+          \82Å\82«\82Ü\82¹\82ñ\81B
+
+  \81y\92\8d\88Ó\81zMS-Word\82Å\82Í Ctrl+\89E\83N\83\8a\83b\83\82ª\83J\83b\83g\81\95\83y\81[\83X\83g\82É\8a\84\82è\93\96\82Ä\82ç\82ê\82Ä\82¢\82é
+          \82½\82ß\81A\82¤\82Ü\82­\93®\8dì\82µ\82È\82¢\82Æ\82«\82ª\82 \82è\82Ü\82·\81B
+          \81i\81u\82Í\82\82ß\82É\91I\91ð\82µ\82Ä\82­\82¾\82³\82¢\81v\82È\82Ç\82Æ\8fo\82Ä\82­\82é\81j
+          \82à\82µ\82±\82Ì\96â\91è\82ð\89ñ\94ð\82µ\82½\82¢\8fê\8d\87\82Í\81A\8e\9f\82Ì\81u\82¿\82å\82Á\82Æ\95Ö\97\98\82È\8eg\97p\95û\96@\81v
+          \82É\82 \82é\82æ\82¤\82É\81A\81u\89E\83N\83\8a\83b\83N\82¾\82¯\82Å\83|\83b\83v\83A\83b\83v\81v\82É\82·\82é\82©\81A
+          \8e\9f\82Ì\82æ\82¤\82É\90Ý\92è\82ð\8ds\82Á\82Ä\82­\82¾\82³\82¢\81B
+          DokoPop!\82Ì\83^\83X\83N\83g\83\8c\83C\82Ì\83\81\83j\83\85\81[\82©\82ç\81A[\90Ý\92è...]\82ð\91I\82Ñ\81A
+          \81u\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\81v\82©\82ç\81A\83|\83b\83v\83A\83b\83v\82ð\82³\82¹\82é\82Æ\82«\82Ì\91g\82Ý\8d\87\82í\82¹\82ð
+          \91I\82ñ\82Å\82­\82¾\82³\82¢\81B
+          Alt + \89E\83N\83\8a\83b\83\82Å\82 \82ê\82Î\96â\91è\82È\82¢\82æ\82¤\82Å\82·\81B
+
+\82¿\82å\82Á\82Æ\95Ö\97\98\82È\8eg\97p\95û\96@ ---------------------------------------------------
+
+\81@\81uCtrl + \89E\83N\83\8a\83b\83N\81v\82Í\82í\82¸\82ç\82í\82µ\82¢\81I\81I
+\81@\82Æ\82¢\82¤\90l\82É\82Í\81A
+
+\81@\81u\89E\83N\83\8a\83b\83N\82¾\82¯\82Å\83|\83b\83v\83A\83b\83v\81v
+
+\81@\82Æ\82¢\82¤\95û\96@\82à\82 \82è\82Ü\82·\81B
+\81@Ctrl + Alt + \89E\83N\83\8a\83b\83\82ÅON/OFF\82Ì\90Ø\82è\91Ö\82¦\82ª\82Å\82«\82Ü\82·\81B
+\81@\81i\90Ø\82è\91Ö\82¦\8e\9e\82É\83\81\83b\83Z\81[\83W\82ª\8fo\82Ü\82·)
+
+\81@\83q\83\93\83g\81F\81u\89E\83N\83\8a\83b\83N\82¾\82¯\81v\82É\82µ\82½\8fê\8d\87\81A\81uCtrl + \89E\83N\83\8a\83b\83N\81v\82ð\82·\82é\82Æ\81A
+\81@\81@\81@\81@\81@\92Ê\8fí\82Ì\89E\83N\83\8a\83b\83N\83\81\83j\83\85\81[\82ª\8fo\82Ä\82«\82Ü\82·\81B
+\81@\81@\81@\81@\81@\82¿\82å\82¤\82Ç\81uCtrl\81v\82ª\8bt\93]\82·\82é\8a´\82\82É\82È\82è\82Ü\82·\81B
+
+\83\81\83j\83\85\81[ -----------------------------------------------------------------
+
+\81@\83^\83X\83N\83g\83\8c\83C\82ÌDokoPop!\83A\83C\83R\83\93\82ð\89E\83N\83\8a\83b\83N\82·\82é\82Æ\83\81\83j\83\85\81[\82ª\8c»\82ê\82Ü\82·\81B
+
+\81@\8e«\8f\91\83O\83\8b\81[\83v         - PDIC\82Ì\8e«\8f\91\83O\83\8b\81[\83v\82Ì\95Ï\8dX\82ð\8ds\82¢\82Ü\82·
+\81@\89E\83N\83\8a\83b\83N\8c\9f\8dõ       - \83}\83E\83X\82Ì\89E\83N\83\8a\83b\83N\82¾\82¯\82Å\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82ð\8ds\82¢\82Ü\82·
+\81@\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\97L\8cø - \8c\9f\8dõ\82ð\97L\8cø\81^\96³\8cø\82É\82µ\82Ü\82·
+\81@\90Ý\92è                 - \8ae\8eí\90Ý\92è\82ð\8ds\82¢\82Ü\82·
+\81@\90à\96¾\8f\91\82ð\95\\8e¦         - \82±\82Ì\83t\83@\83C\83\8b\82ð\95\\8e¦\82µ\82Ü\82·
+\81@\83o\81[\83W\83\87\83\93           - version\95\\8e¦
+\81@\8fI\97¹                 - \82Ç\82±\83|\83b\83v\81I\82Ì\8fI\97¹
+
+\90Ý\92è ----------------------------------------------------------------------
+
+  \83^\83X\83N\83g\83\8c\83C\82Ì\89E\83N\83\8a\83b\83N\82Å\8fo\82Ä\82«\82½\83\81\83j\83\85\81[\82Ì\81u\90Ý\92è\81v\82Å\82·\81B
+
+  \81¡\8bN\93®\8e\9e\82É\83X\83v\83\89\83b\83V\83\85\82ð\95\\8e¦\82·\82é
+    \8bN\93®\8e\9e\82Ì\89æ\96Ê\92\86\89\9b\82É\8fo\82Ä\82­\82é\83E\83B\83\93\83h\83E\82Ì
+    \95\\8e¦\82ð\97L\8cø\81^\96³\8cø\82É\82µ\82Ü\82·\81B
+
+    \81\9a\8bN\93®\8e\9e\82Ì\83X\83v\83\89\83b\83V\83\85\83r\83b\83g\83}\83b\83v\82ð\83J\83X\83^\83}\83C\83Y\81\9a
+    DKPP.EXE\82ª\82 \82é\83t\83H\83\8b\83_\81[\82É DKPP.BMP \82Æ\82¢\82¤\83t\83@\83C\83\8b\82ª\82 \82é\82Æ\81A
+    \82»\82Ì\83r\83b\83g\83}\83b\83v\82ð\8bN\93®\8e\9e\82Æ\83o\81[\83W\83\87\83\93...\82Ì\82Æ\82«\82É\95\\8e¦\82µ\82Ü\82·\81B
+
+  \81¡\8e«\8f\91\83O\83\8b\81[\83v\82ð\8ew\92è\82·\82é
+    \82±\82±\82ð\83`\83F\83b\83N\82·\82é\82Æ\81A\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82ð\8ds\82¤\82Æ\82«\82É
+    \82±\82±\82Å\8ew\92è\82µ\82½\8e«\8f\91\83O\83\8b\81[\83v\82ð\8eg\97p\82µ\82Ü\82·\81B
+    PDIC\96{\91Ì\82Å\82Ì\8e«\8f\91\83O\83\8b\81[\83v\82Ì\91I\91ð\82ª\95Ï\8dX\82³\82ê\82Ü\82·\81B
+    \81y\92\8d\88Ó\81z\82±\82Ì\8b@\94\\82ÍPDIC for Win32 Ver.4.40\82©\82ç\82Ì\91Î\89\9e\82É\82È\82è\82Ü\82·
+
+  \81¡\83|\83b\83v\83A\83b\83v\8c\9f\8dõ - \83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82ð\8ds\82¤\83}\83E\83X\82Æ\83L\81[\82Ì\91g\82Ý\8d\87\82í\82¹\82ð\8ew\92è
+    \82µ\82Ü\82·\81B
+
+  \81¡\89E\83N\83\8a\83b\83N\8c\9f\8dõON/OFF
+    \89E\83N\83\8a\83b\83N\8c\9f\8dõ\82Ì\97L\8cø\81E\96³\8cø\82ð\90Ø\82è\91Ö\82¦\82é\83}\83E\83X\82Æ\83L\81[\82Ì\91g\82Ý\8d\87\82í\82¹\82Å\82·\81B
+
+  \81¡Ctrl\83L\81[\82ð\97£\82µ\82½\82ç\83|\83b\83v\83A\83b\83v\82ð\95Â\82\82é
+    Ctrl+\83}\83E\83X\83N\83\8a\83b\83N\82Å\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82ð\8ds\82¤\82æ\82¤\82É\82µ\82½\8fê\8d\87\81A
+    \83|\83b\83v\83A\83b\83v\95\\8e¦\82³\82ê\82½\8cã\81ACtrl\83L\81[\82ð\97£\82µ\82½\82ç\83|\83b\83v\83A\83b\83v\82µ\82½
+    \83E\83B\83\93\83h\83E\82ð\95Â\82\82Ü\82·\81B
+    \81i\8f«\97\88\93I\82É\82±\82Ì\83I\83v\83V\83\87\83\93\82Í\96³\82­\82µ\82Ü\82· - \8d¢\82é\81I\82Æ\82¢\82¤\95û\82Í\82¨\92m\82ç\82¹\82­\82¾\82³\82¢\81j
+
+  \81¡\89p\90\94\8e\9a\82Ì\82Ý\8c\9f\8dõ\82·\82é
+    \93ú\96{\8cê\81E\89p\90\94\8e\9a\8d¬\8dÝ\82Ì\95\8fÍ\82ª\82 \82Á\82½\8fê\8d\87\81A\93ú\96{\8cê\82ð\96³\8e\8b\82µ\82Ä\8c\9f\8dõ\82ð\8ds\82¢\82Ü\82·\81B
+    \8d¬\8dÝ\95\8fÍ\82Å\82Í ON \82É\82µ\82½\82Ù\82¤\82ª\83q\83b\83g\82µ\82â\82·\82­\82È\82è\82Ü\82·\81B
+    \82Ü\82½\81A\83t\83\89\83\93\83X\8cê\81A\83h\83C\83c\8cê\82Ì\82æ\82¤\82È\83E\83\80\83\89\83E\83g\81E\83A\83N\83T\83\93\82È\82Ç\82ð
+    \8aÜ\82Þ\95\8fÍ\82Å\82Í\82±\82±\82ð OFF \82É\82µ\82È\82¢\82Æ\82¤\82Ü\82­\93®\8dì\82µ\82È\82¢\8fê\8d\87\82ª\82 \82è\82Ü\82·\81B
+
+\82»\82Ì\91¼ --------------------------------------------------------------------
+
+\81@\8dÄ\97\98\97p\81E\8dÄ\94z\95z\81E\89ü\95Ï\82È\82Ç\82Í\8e©\97R\82Å\82·\81B
+\81@\82±\82Ì\83\\83t\83g\83E\83F\83A\82É\82æ\82é\91¹\8aQ\82Í\88ê\90Ø\82»\82Ì\90Ó\94C\82ð\95\89\82¢\82Ü\82¹\82ñ\81B
+
+\81@\82±\82Ìprogram\82Í\81Aopen source\82Å\82 \82éDCHook\82Ìsample program\82Å\82·\81B
+\81@\83\\81[\83X\83t\83@\83C\83\8b\82Í\81A
+\81@http://homepage3.nifty.com/TaN/prog-tips.html
+\81@\82É\82 \82è\82Ü\82·\81B(dchook-x.xx.lzh)
+
+\81@\82±\82Ì\83\\83t\83g\83E\83F\83A\82Ì\83T\83|\81[\83g\82Í\8ds\82Á\82Ä\82¢\82Ü\82¹\82ñ\81B\82½\82¾\82µ\81A
+\81@http://www4.plala.or.jp/cgi-bin/wforum/wforum.cgi/grape/dkpp
+\81@\82É\82Ä\81A\8fî\95ñ\8cð\8a·\82ð\8ds\82Á\82Ä\82¢\82Ü\82·\81B
+
+\81@PDIC for Win32\82Í
+\81@http://homepage3.nifty.com/TaN/pdic-download.html
+
+\81@\83C\83\93\83X\83g\81[\83\89\82É\82¿\82­\82í\82³\82ñ(RXQ01346@nifty.ne.jp)\82ÌMakeSet\82ð\8eg\97p\82µ\82Ä\82¢\82Ü\82·\81B
+
+\97\9a\97ð ----------------------------------------------------------------------
+
+>> Ver.1.12 <<
+* \8e«\8f\91\82ª\91å\82«\82¢\8fê\8d\87\82É\81APDIC\8bN\93®\8cã\82Ì\8dÅ\8f\89\82Ì\83|\83b\83v\83A\83b\83v\82ª\82Å\82«\82È\82¢\82Æ\82«\82ª\82 \82Á\82½
+
+>> Ver.1.11 <<
+\81EUnicode\94Å\91Î\89\9e\82Ì\82½\82ß\82É\93à\95\94\8f\88\97\9d\82ð\95Ï\8dX
+
+>> Ver.1.10 <<
+\81\9bDokoPop\82Å\83|\83b\83v\83A\83b\83v\82µ\82½\83E\83B\83\93\83h\83E\8fã\82Å\82³\82ç\82É\83|\83b\83v\83A\83b\83v\82·\82é
+  \82±\82Æ\82ª\89Â\94\\82É\81i\98A\91±\83|\83b\83v\83A\83b\83v\81j\81iPDIC for Win32\82ÍVer.4.50\88È\8fã\82ª\95K\97v\81j
+\81\9b\93ú\96{\8cê\8d¬\8dÝ\82Ì\95\8fÍ\82Å\82à\90³\82µ\82­\93®\8dì\82·\82é\82æ\82¤\82É\82µ\82½\81B
+\81@\81i\90Ý\92è\83_\83C\83A\83\8d\83O\82Ì\81h\93ú\96{\8cê\82ð\96³\8e\8b\82·\82é\81h\82Å\90Ø\82è\91Ö\82¦\89Â\94\\81j
+
+>> Ver.1.02 <<
+* DKPP.EXE\82Ì\83o\81[\83W\83\87\83\93\90Ý\92è\82ð\8aÔ\88á\82Á\82Ä\82¢\82½
+
+>> Ver.1.01 <<
+* Windows9x\82Å\83|\83b\83v\83A\83b\83v\82µ\82È\82¢\8fê\8d\87\82ª\82 \82Á\82½(IE\82È\82Ç)
+\81E\82»\82ê\82É\91Î\8f\88\82µ\82½\82½\82ß\81AWindows95\82Í\93®\8dì\91Î\8fÛ\8aO\82É
+* \89E\83N\83\8a\83b\83N\8c\9f\8dõ\90Ø\82è\91Ö\82¦\82Å\83\8a\83\\81[\83X\83\8a\81[\83N\82ª\94­\90\82µ\82Ä\82¢\82½
+* \83q\83b\83g\82µ\82È\82¢\92P\8cê\82ª\82 \82é\82Æ\83\81\83\82\83\8a\83\8a\81[\83N\82ª\94­\90\82µ\82Ä\82¢\82½
+
+>> Ver.1.00 <<
+* Windows9x/Me\8cn\82ÌOS\82Å\82Ì\93®\8dì\82ð\88À\92è\89»\82µ\82½
+* \8e«\8f\91\83O\83\8b\81[\83v\8ew\92è\82ð\90³\8fí\82É\93®\8dì\82·\82é\82æ\82¤\82É\82µ\82½
+  \81y\92\8d\88Ó\81z\82±\82Ì\8b@\94\\82ÍPDIC for Win32 Ver.4.40\82©\82ç\82Ì\91Î\89\9e\82É\82È\82è\82Ü\82·
+\81E\8c\9f\8dõ\82Ì\83L\81[\82Ì\91g\82Ý\8d\87\82í\82¹\82ð\83J\83X\83^\83}\83C\83Y\82Å\82«\82é\82æ\82¤\82É\82µ\82½
+\81E\83t\83@\83C\83\8b\8d\\90¬\82ð\95Ï\8dX
+\81E\98A\91±\82µ\82Ä\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82ª\82Å\82«\82é\82æ\82¤\82É\82µ\82½
+\81E\82Ù\82©\95\\8e¦\82Ì\95Ï\8dX\82È\82Ç
+
+>> Ver.0.98 <<
+\81\9b\83}\83E\83X\89E\83N\83\8a\83b\83N\82Ì\82Ý\82Å\83|\83b\83v\83A\83b\83v\82ð\89Â\94\\82É
+\81@\81iCtrl+Alt+\89E\83N\83\8a\83b\83N\82ÅON/OFF\82Å\82«\82Ü\82·\81j
+* \81h\8e«\8f\91\83O\83\8b\81[\83v\82ª\8aJ\82¯\82Ü\82¹\82ñ\81h\82Æ\8fo\82é\82±\82Æ\82ª\82 \82Á\82½
+* \8dÅ\8f¬\89»\82Å\8bN\93®\82µ\82½\8fê\8d\87\81A\83^\83X\83N\83o\81[\82É\83A\83C\83R\83\93\82ª\8ec\82Á\82Ä\82¢\82½
+
+>> Ver.0.97 <<
+* \8e«\8f\91\83O\83\8b\81[\83v\82Ì\95Ï\8dX\82ª\82Å\82«\82È\82­\82È\82Á\82Ä\82¢\82½
+* IE\82Å\83q\83b\83g\82µ\82È\82¢\82±\82Æ\82ª\82 \82Á\82½
+
+>> Ver.0.96 <<
+* PDIC\82ð\8e©\93®\8bN\93®\82Å\82«\82È\82©\82Á\82½(\93Ç\82Ý\8d\9e\82Þregistry\82ð\8aÔ\88á\82Á\82Ä\82¢\82½)
+* \82Ç\82±\83|\83b\83v\82ð\8dÅ\8f¬\89»\82Å\8bN\93®\82µ\82½\8fê\8d\87\81A\83X\83v\83\89\83b\83V\83\85\83E\83B\83\93\83h\83E\82ª\8fÁ\82¦\82È\82©\82Á\82½
+
+>> Ver.0.95 <<
+??
+
+>> Ver.0.94 <<
+* \83X\83v\83\89\83b\83V\83\85\82ð\94ñ\95\\8e¦\82É\82µ\82½\8fê\8d\87\82Ì\95s\8bï\8d\87\8fC\90³
+
+>> Ver.0.94 <<
+* \8bN\93®\8e\9eDLL\8f\89\8aú\89»\8e¸\94s(Win98)
+* \93ú\96{\8cê\8d¬\82\82è\82Ì\95\82Å\83e\83L\83X\83g\92\8a\8fo\88Ê\92u\82ª\82¸\82ê\82Ä\82¢\82½(Win98)
+
+>> Ver.0.93 <<
+\81E\8bN\93®\83X\83v\83\89\83b\83V\83\85\95Ï\8dX
+\81E\83X\83v\83\89\83b\83V\83\85\95\\8e¦\81E\94ñ\95\\8e¦
+\81E\83X\83v\83\89\83b\83V\83\85\83r\83b\83g\83}\83b\83v\82Ì\83J\83X\83^\83}\83C\83Y
+\81E\83C\83\93\83X\83g\81[\83\89\92Ç\89Á
+* \83\81\83\82\92 \82Å\88Ù\8fí\8fI\97¹(NT)
+* \93ú\96{\8cê\8d¬\82\82è\82Ì\95\82Å\83e\83L\83X\83g\92\8a\8fo\88Ê\92u\82ª\82¸\82ê\82Ä\82¢\82½
+
+>> Ver.0.92 <<
+\81E\88À\92è\90«\8cü\8fã
+
+>> Ver.0.90 <<
+\81E\8dÅ\8f\89\82Ì\8cö\8aJ
+
+---------------------------------------------------------------------------
diff --git a/DKPPu.TXT b/DKPPu.TXT
new file mode 100644 (file)
index 0000000..e049f86
--- /dev/null
+++ b/DKPPu.TXT
@@ -0,0 +1,41 @@
+========================================================================
+\81y\83\83\83g\96¼\81z  \82Ç\82±\83|\83b\83v\81I Ver.1.11
+\81y\93o  \98^  \96¼\81z\81@DKPP111.EXE
+\81y\83o\83C\83g  \90\94\81z  <FILESIZE:DKPP111.EXE> Bytes
+\81y\8c\9f\8dõ  \83L\81[\81z\81@1:DOKOPOP 2:PDIC 3:$WIN32 4:#APP 5:#EDU
+\81y\92\98\8dì\8c   \8eÒ\81z\81@\82È\82µ
+\81y\8cf  \8dÚ  \8eÒ\81z\81@TaN(SGM00353)
+\81y\91Î\89\9e  \8b@\8eí\81z\81@MS-Windows 98/Me/NT4.0/2000/XP
+\81y\93®\8dì  \8am\94F\81z\81@IBM PC/AT\8cÝ\8a·\8b@,NT4,0,Win98,2000
+\81y\8cf  \8dÚ  \93ú\81z\81@2002.12.09
+\81y\8dì\90¬  \95û\96@\81z\81@DKPP111.EXE \82ð\8eÀ\8ds\82·\82é
+\81y¿Ìijª±\8eí\95Ê\81z\81@\83t\83\8a\81[\83E\83F\83A
+\81y\93]\8dÚ  \8fð\8c\8f\81z  \93]\8dÚ\8e©\97R
+========================================================================
+\81y\83\\83t\83g\8fÐ\89î\81z
+
+\81@DokoPop! - \82Ç\82±\83|\83b\83v\81\82Í\81ACtrl+\83}\83E\83X\89E\83N\83\8a\83b\83N\82Å\81A
+\81@\83}\83E\83X\83J\81[\83\\83\8b\88Ê\92u\82Ì\89p\92P\8cê\81E\89p\8fn\8cê\82ð\8c\9f\8dõ\82µ\81A\83|\83b\83v\83A\83b\83v\95\\8e¦\82µ\82Ü\82·\81B
+
+\81@\82Ç\82±\83|\83b\83v\81\82Í PDIC for Win32\82ÌDDE\8b@\94\\82ð\97\98\97p\82µ\82Ä\82¢\82Ü\82·\81B
+\81@\95Ê\93rPDIC for Win32\82ð\93ü\8eè\82µ\82Ä\89º\82³\82¢\81B
+
+\81@PDIC for Win32\82Ì\93ü\8eè\90æ(\95K\90{)\81F
+  http://homepage3.nifty.com/TaN/pdic-download.html
+
+\81@\83\\81[\83X\83t\83@\83C\83\8b\81F
+  http://homepage3.nifty.com/TaN/prog-tips.html  dchook-1.11.lzh
+
+>> Ver.1.12 <<
+* \8e«\8f\91\82ª\91å\82«\82¢\8fê\8d\87\82É\81APDIC\8bN\93®\8cã\82Ì\8dÅ\8f\89\82Ì\83|\83b\83v\83A\83b\83v\82ª\82Å\82«\82È\82¢\82Æ\82«\82ª\82 \82Á\82½
+
+\8c»\8dÝ\82Ì\96â\91è\93_
+
+\81EAcrobat Reader\8fã\82Å\82Í\93®\8dì\82µ\82È\82¢
+\81EOpera\8fã\82Å\82Í\93®\8dì\82µ\82È\82¢
+\81EDOS\91\8b\8fã\82Å\82Í\93®\8dì\82µ\82È\82¢
+\81E16bit\83A\83v\83\8a\8fã\82Å\82Í\93®\8dì\82µ\82È\82¢
+\81E\95¡\90\94\8ds\82É\82Ü\82½\82ª\82é\8fn\8cê\82Í\83q\83b\83g\82µ\82È\82¢
+
+========================================================================
+\83_\83E\83\93\83\8d\81[\83h\83t\83@\83C\83\8b\96¼\82Í\81yDKPP111.EXE\81z\82Å\82·\81B
diff --git a/DKPU.TXT b/DKPU.TXT
new file mode 100644 (file)
index 0000000..ca2c1bf
--- /dev/null
+++ b/DKPU.TXT
@@ -0,0 +1,190 @@
+=============================================
+      \82Ç\82±\83|\83b\83v\81I/Unicode    Ver.2.023
+=============================================
+\8fÐ\89î ---------------------------------------------------------
+
+\81@\81u\82Ç\82±\83|\83b\83v\81I/Unicode\81v\82Í\81APersonal Dictionary/Unicode\94Å(\88È\89ºPDIC)
+\81@\82Æ\98A\8cg\82µ\82Ä\81A\83}\83E\83X\83N\83\8a\83b\83N\82É\82æ\82Á\82Ä\83}\83E\83X\88Ê\92u\82Ì\92P\8cê\82ð\8c\9f\8dõ\81A\93ú\96{\8cê\96ó\82È
+\81@\82Ç\82ð\83|\83b\83v\83A\83b\83v\83E\83B\83\93\83h\83E\82É\82æ\82Á\82Ä\95\\8e¦\82·\82é\83\\83t\83g\83E\83F\83A\82Å\82·\81B
+\81@Unicode\82É\91Î\89\9e\82µ\82Ä\82¢\82Ü\82·\81B
+
+\93®\8dì\8am\94FOS ---------------------------------------------------
+
+\81@Windows7/8/8.1/10
+
\81¦Windows2000/XP\82Å\8eg\97p\82·\82é\82±\82Æ\82à\89Â\94\\82Å\82·\82ª\81A\95\8e\9a\94F\8e¯\82ð\97\98\97p\82µ\82½\82¢\8fê\8d\87\81A\90Ý\92è\82ª\95K\97v\82Å\82·\81B\81i\81¨\95\8e\9a\94F\8e¯\82Ì\8fê\8f\8a)
+
+\8f\80\94õ ---------------------------------------------------------
+
+\81@DKPU2023.exe\82ð\82»\82Ì\82Ü\82Ü\8eÀ\8ds\82µ\82Ä\89º\82³\82¢\81B
+\81@\8e©\93®\93I\82É\83C\83\93\83X\83g\81[\83\8b\82³\82ê\82Ü\82·\81B
+\81@\83X\83^\81[\83g\83A\83b\83v\82É\93o\98^\82µ\82½\95û\82ª\95Ö\97\98\82Å\82·\81B(Windows\8bN\93®\8e\9e\82ÉDokoPop!\82à\8bN\93®)
+
+\81@\82Ç\82±\83|\83b\83v\81I\82É\82ÍPDIC/Unicode Ver.5.7.21\88È\8d\82ª\95K\97v\82Å\82·\81B
+  http://pdic.la.coocan.jp/
+  \82©\82ç\83_\83E\83\93\83\8d\81[\83h\82µ\82Ä\89º\82³\82¢\81B
+
+\8eg\97p\95û\96@ -----------------------------------------------------
+
+\81@DKPU.EXE\82ð\8bN\93®\82·\82é\82Æ\83^\83X\83N\83g\83\8c\83C\82É\8fí\92\93\82µ\82Ü\82·\81B(DP\82Æ\8f\91\82¢\82Ä\82 \82é\83A\83C\83R\83\93)
+\81@Ctrl\83L\81[\82ð\89\9f\82µ\82È\82ª\82ç\83}\83E\83X\82Ì\89E\83{\83^\83\93\82ð\83N\83\8a\83b\83N\82·\82é\82Æ\81A\83N\83\8a\83b\83N\82µ\82½\88Ê\92u\82Ì
+\81@\92P\8cê\82Ü\82½\82Í\8fn\8cê\82Ì\88Ó\96¡\82ð\95\\8e¦\82µ\82Ü\82·\81B
+
+  \81y\92\8d\88Ó\81zPDIC\96{\91Ì\82Í\95K\82¸\8e«\8f\91\83O\83\8b\81[\83v\82ð\83I\81[\83v\83\93\82µ\82½\8fó\91Ô\82É\82µ\82Ä\82¨\82¢\82Ä\82­\82¾\82³\82¢\81B
+          \82Â\82Ü\82è\81A\92Ê\8fí\82Ì\8c\9f\8dõ(WORD\97\93\93ü\97Í\81j\82ª\82Å\82«\82é\8fó\91Ô\82É\82µ\82Ä\82¨\82¢\82Ä\82­\82¾\82³\82¢\81B
+          (\83\81\83j\83\85\81[\82Ì File | \8e«\8f\91\83O\83\8b\81[\83v\83I\81[\83v\83\93)
+          \8e«\8f\91\95Ï\8a·\92\86\82È\82Ç\81A\92Ê\8fí\82Ì\8c\9f\8dõ\82ª\82Å\82«\82È\82¢\8fó\91Ô\82Å\82Í\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82Í
+          \82Å\82«\82Ü\82¹\82ñ\81B
+
+  \81y\92\8d\88Ó\81zMS-Word\82Å\82Í Ctrl+\89E\83N\83\8a\83b\83\82ª\83J\83b\83g\81\95\83y\81[\83X\83g\82É\8a\84\82è\93\96\82Ä\82ç\82ê\82Ä\82¢\82é
+          \82½\82ß\81A\82¤\82Ü\82­\93®\8dì\82µ\82È\82¢\82Æ\82«\82ª\82 \82è\82Ü\82·\81B
+          \81i\81u\82Í\82\82ß\82É\91I\91ð\82µ\82Ä\82­\82¾\82³\82¢\81v\82È\82Ç\82Æ\8fo\82Ä\82­\82é\81j
+          \82à\82µ\82±\82Ì\96â\91è\82ð\89ñ\94ð\82µ\82½\82¢\8fê\8d\87\82Í\81A\8e\9f\82Ì\81u\82¿\82å\82Á\82Æ\95Ö\97\98\82È\8eg\97p\95û\96@\81v
+          \82É\82 \82é\82æ\82¤\82É\81A\81u\89E\83N\83\8a\83b\83N\82¾\82¯\82Å\83|\83b\83v\83A\83b\83v\81v\82É\82·\82é\82©\81A
+          \8e\9f\82Ì\82æ\82¤\82É\90Ý\92è\82ð\8ds\82Á\82Ä\82­\82¾\82³\82¢\81B
+          DokoPop!\82Ì\83^\83X\83N\83g\83\8c\83C\82Ì\83\81\83j\83\85\81[\82©\82ç\81A[\90Ý\92è...]\82ð\91I\82Ñ\81A
+          \81u\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\81v\82©\82ç\81A\83|\83b\83v\83A\83b\83v\82ð\82³\82¹\82é\82Æ\82«\82Ì\91g\82Ý\8d\87\82í\82¹\82ð
+          \91I\82ñ\82Å\82­\82¾\82³\82¢\81B
+          Alt + \89E\83N\83\8a\83b\83\82Å\82 \82ê\82Î\96â\91è\82È\82¢\82æ\82¤\82Å\82·\81B
+
+\82¿\82å\82Á\82Æ\95Ö\97\98\82È\8eg\97p\95û\96@ ---------------------------------------
+
+\81@\81uCtrl + \89E\83N\83\8a\83b\83N\81v\82Í\82í\82¸\82ç\82í\82µ\82¢\81I\81I
+\81@\82Æ\82¢\82¤\90l\82É\82Í\81A
+
+\81@\81u\89E\83N\83\8a\83b\83N\82¾\82¯\82Å\83|\83b\83v\83A\83b\83v\81v
+
+\81@\82Æ\82¢\82¤\95û\96@\82à\82 \82è\82Ü\82·\81B
+\81@Ctrl + Alt + \89E\83N\83\8a\83b\83\82ÅON/OFF\82Ì\90Ø\82è\91Ö\82¦\82ª\82Å\82«\82Ü\82·\81B
+\81@\81i\90Ø\82è\91Ö\82¦\8e\9e\82É\83\81\83b\83Z\81[\83W\82ª\8fo\82Ü\82·)
+
+\81@\83q\83\93\83g\81F\81u\89E\83N\83\8a\83b\83N\82¾\82¯\81v\82É\82µ\82½\8fê\8d\87\81A\81uCtrl + \89E\83N\83\8a\83b\83N\81v\82ð\82·\82é\82Æ\81A
+\81@\81@\81@\81@\81@\92Ê\8fí\82Ì\89E\83N\83\8a\83b\83N\83\81\83j\83\85\81[\82ª\8fo\82Ä\82«\82Ü\82·\81B
+\81@\81@\81@\81@\81@\82¿\82å\82¤\82Ç\81uCtrl\81v\82ª\8bt\93]\82·\82é\8a´\82\82É\82È\82è\82Ü\82·\81B
+
+\83\81\83j\83\85\81[ -----------------------------------------------------
+
+\81@\83^\83X\83N\83g\83\8c\83C\82ÌDokoPop!\83A\83C\83R\83\93\82ð\89E\83N\83\8a\83b\83N\82·\82é\82Æ\83\81\83j\83\85\81[\82ª\8c»\82ê\82Ü\82·\81B
+
+\81@\8e«\8f\91\83O\83\8b\81[\83v         - PDIC\82Ì\8e«\8f\91\83O\83\8b\81[\83v\82Ì\95Ï\8dX\82ð\8ds\82¢\82Ü\82·
+\81@\89E\83N\83\8a\83b\83N\8c\9f\8dõ       - \83}\83E\83X\82Ì\89E\83N\83\8a\83b\83N\82¾\82¯\82Å\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82ð\8ds\82¢\82Ü\82·
+\81@\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\97L\8cø - \8c\9f\8dõ\82ð\97L\8cø\81^\96³\8cø\82É\82µ\82Ü\82·
+\81@\90Ý\92è                 - \8ae\8eí\90Ý\92è\82ð\8ds\82¢\82Ü\82·
+\81@\90à\96¾\8f\91\82ð\95\\8e¦         - \82±\82Ì\83t\83@\83C\83\8b\82ð\95\\8e¦\82µ\82Ü\82·
+\81@\83o\81[\83W\83\87\83\93           - version\95\\8e¦
+\81@\8fI\97¹                 - \82Ç\82±\83|\83b\83v\81I\82Ì\8fI\97¹
+
+\90Ý\92è ---------------------------------------------------------
+
+  \83^\83X\83N\83g\83\8c\83C\82Ì\89E\83N\83\8a\83b\83N\82Å\8fo\82Ä\82«\82½\83\81\83j\83\85\81[\82Ì\81u\90Ý\92è\81v\82Å\82·\81B
+
+  \81¡\8bN\93®\8e\9e\82É\83X\83v\83\89\83b\83V\83\85\82ð\95\\8e¦\82·\82é
+    \8bN\93®\8e\9e\82Ì\89æ\96Ê\92\86\89\9b\82É\8fo\82Ä\82­\82é\83E\83B\83\93\83h\83E\82Ì
+    \95\\8e¦\82ð\97L\8cø\81^\96³\8cø\82É\82µ\82Ü\82·\81B
+
+    \81\9a\8bN\93®\8e\9e\82Ì\83X\83v\83\89\83b\83V\83\85\83r\83b\83g\83}\83b\83v\82ð\83J\83X\83^\83}\83C\83Y\81\9a
+    DKPU.EXE\82ª\82 \82é\83t\83H\83\8b\83_\81[\82É DKPU.BMP \82Æ\82¢\82¤\83t\83@\83C\83\8b\82ª\82 \82é\82Æ\81A
+    \82»\82Ì\83r\83b\83g\83}\83b\83v\82ð\8bN\93®\8e\9e\82Æ\83o\81[\83W\83\87\83\93...\82Ì\82Æ\82«\82É\95\\8e¦\82µ\82Ü\82·\81B
+
+  \81¡\8e«\8f\91\83O\83\8b\81[\83v\82ð\8ew\92è\82·\82é
+    \82±\82±\82ð\83`\83F\83b\83N\82·\82é\82Æ\81A\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82ð\8ds\82¤\82Æ\82«\82É
+    \82±\82±\82Å\8ew\92è\82µ\82½\8e«\8f\91\83O\83\8b\81[\83v\82ð\8eg\97p\82µ\82Ü\82·\81B
+    PDIC\96{\91Ì\82Å\82Ì\8e«\8f\91\83O\83\8b\81[\83v\82Ì\91I\91ð\82ª\95Ï\8dX\82³\82ê\82Ü\82·\81B
+
+  \81¡\83|\83b\83v\83A\83b\83v\8c\9f\8dõ - \83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82ð\8ds\82¤\83}\83E\83X\82Æ\83L\81[\82Ì\91g\82Ý\8d\87\82í\82¹\82ð\8ew\92è\82µ\82Ü\82·\81B
+
+  \81¡\89E\83N\83\8a\83b\83N\8c\9f\8dõON/OFF
+    \89E\83N\83\8a\83b\83N\8c\9f\8dõ\82Ì\97L\8cø\81E\96³\8cø\82ð\90Ø\82è\91Ö\82¦\82é\83}\83E\83X\82Æ\83L\81[\82Ì\91g\82Ý\8d\87\82í\82¹\82Å\82·\81B
+
+  \81¡\89p\90\94\8e\9a\82Ì\82Ý\8c\9f\8dõ\82·\82é
+    \93ú\96{\8cê\81E\89p\90\94\8e\9a\8d¬\8dÝ\82Ì\95\8fÍ\82ª\82 \82Á\82½\8fê\8d\87\81A\93ú\96{\8cê\82ð\96³\8e\8b\82µ\82Ä\8c\9f\8dõ\82ð\8ds\82¢\82Ü\82·\81B
+    \8d¬\8dÝ\95\8fÍ\82Å\82Í ON \82É\82µ\82½\82Ù\82¤\82ª\83q\83b\83g\82µ\82â\82·\82­\82È\82è\82Ü\82·\81B
+    \82Ü\82½\81A\83t\83\89\83\93\83X\8cê\81A\83h\83C\83c\8cê\82Ì\82æ\82¤\82È\83E\83\80\83\89\83E\83g\81E\83A\83N\83T\83\93\82È\82Ç\82ð
+    \8aÜ\82Þ\95\8fÍ\82Å\82Í\82±\82±\82ð OFF \82É\82µ\82È\82¢\82Æ\82¤\82Ü\82­\93®\8dì\82µ\82È\82¢\8fê\8d\87\82ª\82 \82è\82Ü\82·\81B
+
+  \81¡\94F\8e¯\83\82\81[\83h\82Ì\90Ý\92è
+    \81E\95\8e\9a\94F\8e¯\81{\95\8e\9a\92\8a\8fo
+    \81E\95\8e\9a\94F\8e¯\82Ì\82Ý
+    \81E\95\8e\9a\92\8a\8fo\82Ì\82Ý
+    \92Ê\8fí\88ê\94Ô\8fã\82Ì\90Ý\92è\82ª\82¢\82¢\82Æ\8ev\82¢\82Ü\82·\82ª\81A\83|\83b\83v\83A\83b\83v\82µ\82È\82¢\81A\83A\83v\83\8a\82ª\97\8e\82¿\82é\81A\82È\82Ç\82Ì\8fê\8d\87\82Í
+    \90Ý\92è\82ð\95Ï\8dX\82·\82é\82Æ\82¤\82Ü\82­\82¢\82­\82æ\82¤\82É\82È\82é\82©\82à\82µ\82ê\82Ü\82¹\82ñ\81B
+    \81¦DokoPop! Ver.1\82Í\81u\95\8e\9a\92\8a\8fo\82Ì\82Ý\81v\82Æ\93¯\82\93®\8dì\82ð\82µ\82Ü\82·
+
+  \81¡\95\8e\9a\94F\8e¯\82Ì\8fê\8f\8a - \8fã\8b\89\8eÒ\8cü\82¯
+    MODI\82ð\83C\83\93\83X\83g\81[\83\8b\82Å\82«\82È\82¢\8fê\8d\87\82É\81A\91¼\82ÌPC\82É\82 \82éAMODI\82ð\97\98\97p\82·\82é\82±\82Æ\82ÅMODI\82ð\97\98\97p\89Â\94\\82É\82µ\82Ü\82·\81B
+    \8fê\8f\8a\82Æ\82µ\82Ä\81A
+    \amodi
+    \82ð\8ew\92è\82µ\82Ü\82·\81B
+    \97á\81F
+    \\server\temp\amodi
+    \81¦\83t\83@\83C\83\8b\8b¤\97L\8co\97R\82Å\97\98\97p\82µ\82Ü\82·\81B
+
+  \81¡64\83r\83b\83g\83t\83b\83N\82ð\8eg\97p\82·\82é
+    64bitWindows\82Å\82¤\82Ü\82­\83q\83b\83g\82µ\82È\82¢\8fê\8d\87\82É\82±\82±\82ð\83`\83F\83b\83N\82·\82é\82Æ\93®\8dì\82·\82é\82©\82à\82µ\82ê\82Ü\82¹\82ñ\81B
+
+\8c¾\8cê\94»\92èDLL --------------------------------------------------
+
+\81@DokoPop!/Unicode\82Å\82Í\81A\8c\9f\8dõ\91Î\8fÛ\82Ì\92P\8cê\82ð\90Ø\82è\8fo\82·\8dÛ\82É\81A\91Î\8fÛ\8c¾\8cê\82ª
+\81@\89¢\95Ä\8cn\82Ì\8c¾\8cê - \82±\82±\82Å\82Í\92P\8cê\82Ì\8bæ\90Ø\82è\82É\94¼\8ap\83X\83y\81[\83X\82ð\8eg\82¤\8c¾\8cê\82Æ\82¢\82¤\88Ó\96¡\82Å
+\81@\92è\8b` - \82ð\91O\92ñ\82Æ\82µ\82Ä\88µ\82Á\82Ä\82¢\82Ü\82·\81B
+\81@\82µ\82©\82µ\81A\89¢\95Ä\8cn\88È\8aO\82Ì\8c¾\8cê\81A\97á\82¦\82Î\93ú\96{\8cê\82Ì\82æ\82¤\82É\92P\8cê\82Ì\8bæ\90Ø\82è\82Í\93ú\96{\8cê\82ð
+\81@\97\9d\89ð\82Å\82«\82é\90l\82É\82µ\82©\82í\82©\82è\82Ü\82¹\82ñ\81B\93\96\91R\81A\83R\83\93\83s\83\85\81[\83^\81[\82É\82à\92P\8cê\82Ì\8bæ\90Ø\82è\82ð
+\81@\8aÈ\92P\82É\97\9d\89ð\82³\82¹\82é\82±\82Æ\82Í\82Å\82«\82Ü\82¹\82ñ\81B
+\81@\81i\93ú\96{\8cê\93ü\97Í\82Å\95\90ß\82Ì\8bæ\90Ø\82è\82ð\82Æ\82«\82Ç\82«\8aÔ\88á\82¦\82é\82æ\82¤\82É\81j
+\81@\82³\82ç\82É\81AUnicode\82Å\88µ\82¦\82é\8c¾\8cê\82É\82Í\93ú\96{\8cê\82Ì\82æ\82¤\82È\8c¾\8cê\82ª\90\94\91½\82­\82 \82è\81A
+\81@\8ae\8c¾\8cê\82Ì\95\96@\82ð\95×\8b­\82µ\81A\91g\82Ý\8d\9e\82Þ\95K\97v\82ª\82 \82è\82Ü\82·\81B
+
+\81@\82±\82Ì\82½\82ß\82Ì\8aJ\94­\8fî\95ñ\82ð\82±\82¿\82ç\82Å\8cö\8aJ\82µ\82Ä\82¢\82Ü\82·\81B
+\81@http://pdic.la.coocan.jp/unicode/langproc.html
+
+\82»\82Ì\91¼ -------------------------------------------------------
+
+\81@\8dÄ\97\98\97p\81E\8dÄ\94z\95z\81E\89ü\95Ï\82È\82Ç\82Í\8e©\97R\82Å\82·\81B
+\81@\82±\82Ì\83\\83t\83g\83E\83F\83A\82É\82æ\82é\91¹\8aQ\82Í\88ê\90Ø\82»\82Ì\90Ó\94C\82ð\95\89\82¢\82Ü\82¹\82ñ\81B
+
+\81@\82±\82Ìprogram\82Í\81Aopen source\82Å\82 \82éDCHook\82Ìsample program\82Å\82·\81B
+\81@\83\\81[\83X\83t\83@\83C\83\8b\82Í\81A
+\81@http://dokopop.sourceforge.jp/
+\81@\82É\82 \82è\82Ü\82·\81B
+
+\81@PDIC/Unicode\82Í
+\81@http://pdic.la.coocan.jp/unicode/
+
+\97\9a\97ð ---------------------------------------------------------
+
+
+>> Ver.2.00 <<
+  \81E\95\8e\9a\94F\8e¯\82É\82æ\82è\81A\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82ª\82Å\82«\82é\82Æ\82±\82ë\82ª\91\9d\82¦\82½
+  \81E\83}\83E\83X\82Ì\92\86\89\9b\83{\83^\83\93\82Ö\82Ì\91Î\89\9e
+
+>> Ver.1.23 <<
+  \81EDDE\82Å\91\97\90M\82·\82é\83f\81[\83^\82Ì\8c`\8e®\82ª\90³\82µ\82­\8ew\92è\82³\82ê\82Ä\82¢\82È\82©\82Á\82½(CF_TEXT->CF_UNICODETEXT)
+
+>> Ver.1.22 <<
+  \81E\83N\83\8a\83b\83N\82·\82é\91Î\8fÛ\82Ì\83E\83B\83\93\83h\83E\82ª\94ñUnicode\82Å\82 \82é\8fê\8d\87\93®\8dì\82µ\82È\82©\82Á\82½
+
+>> Ver.1.21 <<
+  \81E\8e«\8f\91\83O\83\8b\81[\83v\82Ì\91I\91ð\82ª\90³\82µ\82­\93®\8dì\82µ\82È\82¢\96â\91è\82ð\8fC\90³
+
+>> Ver.1.20 <<
+  \81EPDIC/Unicode Ver.5.0.x\82É\91Î\89\9e
+
+>> Ver.1.15 <<
+  \81EPDIC/Unicode Ver.0.83\82É\91Î\89\9e
+  \81Edialog\82Ì\8fo\82é\8fê\8f\8a\82ðDesktopCenter\81¨ScreenCenter (\83}\83\8b\83`\83\82\83j\83^\91Î\89\9e)
+
+>> Ver.1.14 <<
+  \81EDokoPop!\82É\8aÖ\82µ\82Ä\82Í\92Ê\8fí\82Ì\83o\81[\83W\83\87\83\93\94Ô\8d\86\82ð\95t\82¯\82é\82±\82Æ\82É\82µ\82½
+    - DokoPop!\82Í\83À\94Å\82Æ\90³\8e®\94Å\82Ì\8eÀ\8dÛ\93I\82È\88á\82¢\82ª\96³\82¢\82½\82ß
+    - DokoPop!\82Í\83I\81[\83v\83\93\83\\81[\83X\82Å\82 \82è\81APDIC\96{\91Ì\82Æ\82Í\95Ê\94z\95z\82Å\82 \82é\82½\82ß\81A
+      PDIC\96{\91Ì\82Æ\93¯\8aú\82·\82é\83À\94Å\82Æ\8c¾\82¤\93K\93\96\82È\8bæ\90Ø\82è\82ª\96³\82¢\82½\82ß
+  \81E\83o\81[\83W\83\87\83\93\94Ô\8d\86\82Ífor Win32\94Å\82Æ\8b¤\92Ê\89»\81i\83\\81[\83X\83R\81[\83h\82ª\93¯\82\82½\82ß\81j
+  * \95\82Ì\8dÅ\8cã\82Ì\92P\8cê\82ª\83q\83b\83g\82µ\82È\82©\82Á\82½\81iDokoPop!\82Ì\8dÅ\90V\94Å\82ª\95K\97v\81j
+    \81y\8c´\88ö\81z
+  \81@\8eæ\93¾\82µ\82½\95\8e\9a\97ñ\82Ì\8dÅ\8cã\82É\83S\83~\82ª\95t\91®\82µ\82½\82±\82Æ\82É\82æ\82è\81A\82»\82ê\82ðPDIC\82ª\92Ê\8fí\82Ì\83e\83L\83X\83g
+  \81@\82Æ\94F\8e¯\82µ\82Ä\82µ\82Ü\82¢\81A\95\82Ì\8dÅ\8cã\82Ì\83s\83\8a\83I\83h\82ª\92P\8cê\92\86\82Ì\95\8e\9a\97ñ\82Æ\82µ\82Ä\8f\88\97\9d\82³\82ê\82½\82½\82ß\81B
+
+>> Ver.0.10 <<
+\81E\8dÅ\8f\89\82Ì\8cö\8aJ
+
+--------------------------------------------------------------
diff --git a/DKPUu.TXT b/DKPUu.TXT
new file mode 100644 (file)
index 0000000..e73d9a0
--- /dev/null
+++ b/DKPUu.TXT
@@ -0,0 +1,34 @@
+========================================================================
+\81y\83\83\83g\96¼\81z  \82Ç\82±\83|\83b\83v\81I Ver.2.023
+\81y\93o  \98^  \96¼\81z\81@DKPU2023.exe
+\81y\83o\83C\83g  \90\94\81z  <FILESIZE:DKPU2023.exe> Bytes
+\81y\8c\9f\8dõ  \83L\81[\81z\81@1:DOKOPOP 2:PDIC 3:$WIN32 4:#APP 5:#EDU
+\81y\92\98\8dì\8c   \8eÒ\81z\81@\82È\82µ
+\81y\8cf  \8dÚ  \8eÒ\81z\81@DokoPop Project
+\81y\91Î\89\9e  \8b@\8eí\81z\81@MS-Windows Vista/7/8/8.1/10
+\81y\93®\8dì  \8am\94F\81z\81@IBM PC/AT\8cÝ\8a·\8b@,7/8/8.1/10
+\81y\8cf  \8dÚ  \93ú\81z\81@2016.10.06
+\81y\8dì\90¬  \95û\96@\81z\81@DKPU2023.exe \82ð\8eÀ\8ds\82·\82é
+\81y¿Ìijª±\8eí\95Ê\81z\81@\83t\83\8a\81[\83E\83F\83A
+\81y\93]\8dÚ  \8fð\8c\8f\81z  \93]\8dÚ\8e©\97R
+========================================================================
+\81y\83\\83t\83g\8fÐ\89î\81z
+
+\81@DokoPop! - \82Ç\82±\83|\83b\83v\81\82Í\81ACtrl+\83}\83E\83X\89E\83N\83\8a\83b\83N\82Å\81A
+\81@\83}\83E\83X\83J\81[\83\\83\8b\88Ê\92u\82Ì\89p\92P\8cê\81E\89p\8fn\8cê\82ð\8c\9f\8dõ\82µ\81A\83|\83b\83v\83A\83b\83v\95\\8e¦\82µ\82Ü\82·\81B
+
+\81@\82Ç\82±\83|\83b\83v\81\82Í PDIC/Unicode\82ÌDDE\8b@\94\\82ð\97\98\97p\82µ\82Ä\82¢\82Ü\82·\81B
+\81@\95Ê\93rPDIC/Unicode\82ð\93ü\8eè\82µ\82Ä\89º\82³\82¢\81B
+
+\81@PDIC/Unicode \82Ì\93ü\8eè\90æ(\95K\90{)\81F
+  http://pdic.la.coocan.jp/
+
+\81@\83\\81[\83X\83t\83@\83C\83\8b\81F
+  http://dokopop.sourceforge.jp/
+
+
+\8c»\8dÝ\82Ì\96â\91è\93_
+
+
+========================================================================
+\83_\83E\83\93\83\8d\81[\83h\83t\83@\83C\83\8b\96¼\82Í\81yDKPU2023.exe\81z\82Å\82·\81B
diff --git a/Diary.txt b/Diary.txt
new file mode 100644 (file)
index 0000000..ab974c3
--- /dev/null
+++ b/Diary.txt
@@ -0,0 +1,280 @@
+ http://grabacr.net/archives/1132
+\81¡BUG
+\81Eamodi\82Ì.NET Framework version\82Í\81H
+\81ESetWindowsHookEx\96â\91è
+  - 32bit/64bit\97¼\95ûload\81¨32bit\82ÍOK\81A64bit\82Írun on load context
+  - 32bit\82Ì\82Ýload\81¨32bit\82ÍOK\81A64bit\82Í\96³\94½\89\9e
+  - 64bit\82Ì\82Ýload\81¨64bit\82ÍOK\81A32bit\82Írun on load context
+  - 64bit\82ð\90æ\82Élaunch\81A32bit\82ð\82 \82Æ\82©\82çload\81¨32bit\82ÍOK\81A64bit\82Írun on load context
+  - 64bit/32bit\82ðload\81A\82»\82Ì\8cã64bit\82Ì\82Ýinit/config\81A\82»\82Ì\82 \82Æ32bit\82Ì\82ÝInit\82Ì\82Ý\81¨32bit Init\82ð\8eÀ\8ds\82·\82é\82Ü\82Å\82Í64bit\82ÍOK\81A32bit\82ÌInit\82ð\8ds\82¤\82Æ64bit\82Írun on load context
+  - 64bit\82ð\88Ù\82È\82é\83f\83B\83\8c\83N\83g\83\8a\82Å\8eÀ\8ds\81¨\95Ï\82í\82ç\82¸
+[\88ê\94Ê\93®\8dì]
+\81E[B] Edge@Win10@VMware@PWS300\82Å\95\8e\9a\94F\8e¯\82Å\82«\82Ä\82¢\82é\82Ì\82É\83|\83b\83v\83A\83b\83v\82µ\82È\82¢\8e\9e\82ª\82 \82é\81¨FAQ
+  \81¨\88Ê\92u\82ð\8cÅ\92è\81A\83t\83H\81[\83J\83X\88Ú\93®
+\81E[B] \83\8d\83O\83C\83\93\82Ìstartup\82Åamodi\82ª\97á\8aO\82Å\97\8e\82¿\82é\81BFileNotFound\82Å\8aÄ\8e\8b\97p\83t\83H\83\8b\83_\81[\82ª\8c©\82Â\82©\82ç\82È\82¢\81H
+\81E[C] Windows shutdown\82ÅExMODI\82ª\97á\8aO\81H
+\81E[B] .NET\82ð4.0\82©\82ç3.5\82É\82Å\82«\82È\82¢\82©\81H
+\81E[B?] main prg\82Ìmain thread\82ªblocking\8fó\91Ô\82É\82È\82é\82Æ\82È\82ºUI\91S\91Ì\82ª\8e~\82Ü\82é\81H
+  \81¨\8e~\82Ü\82Á\82Ä\82¢\82é\82Æ\82±\82ë\82Í\8f­\82È\82­\82Æ\82àHook\8aÖ\90\94\93à\82Å\82Í\82È\82¢\82ç\82µ\82¢(return\82Ü\82Å\82Ì\8e\9e\8aÔ\82ª\82P\95b\88È\93à\82¾\82Á\82½\81j
+\81E[B] \82Ü\82¾\94{\97¦\8f\88\97\9d\82ª\82¤\82Ü\82­\93­\82©\82È\82¢
+  - Firefox\81¨\8ag\91å\82È\82µ\82ÅOK
+  - IE\81¨\8ag\91å\8f\88\97\9d\95K\97v
+\81E[C] click\82É\82æ\82éCaptureImage\82Ímain\82©\82ç\82Ì\8cÄ\82Ñ\8fo\82µ\82É\82µ\82½\82Ù\82¤\82ª\82¢\82¢\82Ì\82Å\82Í\81H
+  \81¨\82Ç\82Ì\82Ý\82¿wait\82·\82é\82Ì\82¾\82©\82ç\81A\96â\91è\82È\82¯\82ê\82Î\82±\82Ì\82Ü\82Ü\82Å\82¢\82¢\82©\82à\81H
+\81E[C] Capture API\82ª64/32bit\97¼\95û\82Å\8cÄ\82Î\82ê\82Ä\82µ\82Ü\82¤\82Ì\82Í\82Ü\82¸\82¢\82Ì\82Å\82Í\81H\92P\82È\82é\96³\91Ê\81H
+  \81¨\82¹\82ß\82Äbit\90\94\82ð\94»\92f\82µ\82Ä\82©\82ç\82Å\82 \82ê\82Î\81E\81E\81E
+\81E[B?] MODI\82ª\83C\83\93\83X\83g\81[\83\8b\82³\82ê\82Ä\82¢\82È\82¢\8fó\8bµ\82ÅDokoPop!\82ð\8bN\93®\81A\82»\82Ì\8cãMODI\82ð\83C\83\93\83X\83g\81[\83\8b\82·\82é\82ªamodi\82ª\95¡\90\94\8bN\93®\82µ\82ÄOCR\82ª\93®\8dì\82µ\82È\82¢\8fó\91Ô\82ª\82 \82Á\82½
+         \81¨amodi.exe\82ª\8fI\97¹\82µ\82È\82¢\8fð\8c\8f\82ª\82 \82é\81H
+         \81¨MODI uninstall/install\82ð\82â\82Á\82Ä\82Ý\82½\82ª\8dÄ\8c»\82¹\82¸\81BOS install\8cã\8f\89\89ñ\82¾\82¯\81H
+\81E[C][Win10] SharePoint Designer\82ðWindows10\82É\83C\83\93\83X\83g\81[\83\8b\82·\82é\82Æ\82«\81A.NET\82Ì\83C\83\93\83X\83g\81[\83\8b\82ð\91£\82·\82ª\81A\83G\83\89\81[\82Æ\82È\82è\82Å\82«\82È\82¢\81B\81¨\82»\82à\82»\82à.NET\82Í\93ü\82Á\82Ä\82¢\82é\82Ì\82Å\83C\83\93\83X\83g\81[\83\8b\95s\97v\81Binstaller\82Ì\83o\83O\81H
+\81E[B] \8f]\97\88\95û\8e®\82Ì\95\8e\9a\97ñ\92\8a\8fo\82ª\93®\8dì\82µ\82È\82­\82È\82Á\82½\81H
+  \81¨DKPUHK64.dll\82ðload\82µ\82½\82½\82ß\81BDKPUHK64\82ðhook\82³\82¹\82é\82Æ32bit\83A\83v\83\8a\8fã\82Åhook\82ª\90³\82µ\82­\93®\8dì\82µ\82È\82¢\81i\8fÚ\8d×\82Ì\93®\8dì\82Í\95s\96¾\81j
+  \81¨\82È\82º32bit\83A\83v\83\8a\82Å64bit DLL\82ªhook\82³\82ê\82é\82Ì\82©\81H
+  \82Ü\82Æ\82ß\82é\82Æ\81A
+   - 64bitDLL\82ð\8eg\97p\82·\82é\82Æ\81E\81E\81E32bit\83A\83v\83\8a\8fã\82Å\93®\8dì\82µ\82È\82­\82È\82é\81i64bit\83A\83v\83\8a\82ÍOK)
+   - 64bitDLL\82ð\8aO\82·\82Æ\81E\81E\81E\81E\81E32bit\83A\83v\83\8a\82Í\93®\8dì\81A64bit\83A\83v\83\8a\82ÍNG
+\81@ - 64bit DLL\82ðload\82·\82é\82Æ\81A32bit\83A\83v\83\8a\8fã\82É\83}\83E\83X\82ð\88Ú\93®\82µ\82Ä\82àDLL attach\82³\82ê\82È\82¢\81B(32/64bit\97¼\95û)
+   - 64bit DLL\82ðload\82µ\81A32bit\83A\83v\83\8a\8fã\82Åmouse\91\80\8dì\82·\82é\82Æ\81A64bit/32bit\97¼\95û\82ÌDLL\82Ì\8f\88\97\9d\82ª\91\96\82é\81B\82 \82è\82¦\82È\82¢\82¾\82ë\82¤\81H\81H
+        \81ªattach\82³\82ê\82Ä\82¢\82È\82¢\82Ì\82É\82È\82º\94½\89\9e\82Å\82«\82é\81H\81H
+        \81¨64bit DLL\82ÍDKPUHK64.exe\82Å\91\96\82è\81A32bit DLL\82ÍDCHookTest.exe\82Å\91\96\82Á\82Ä\82¢\82é\81I\81I\82È\82º\81H
+        \81¨DKPUHK64.exe\82ð\95Ê\83v\83\8d\83Z\83X\82©\82ç\8bN\93®\82µ\82Ä\82à\8dÄ\8c»\82·\82é\81BDLL\82ÌInit()\8cÄ\82Ñ\8fo\82µ\82ð\82µ\82È\82¯\82ê\82Î\8dÄ\8c»\82µ\82È\82¢\81B
+          SetWindowsHookEx()\82Ì\8eg\97p\82É\96â\91è\82ª\82 \82é\82ç\82µ\82¢\81B
+        \81¨\95Ê\83A\83v\83\8a\82È\82Ì\82É\82È\82º\89e\8b¿\82·\82é\82Ì\82©\81HDLL\82Ì\89½\82©\82ª\82Ô\82Â\82©\82Á\82Ä\82¢\82é\81H
+        http://resources.infosecinstitute.com/using-setwindowshookex-for-dll-injection-on-windows/
+        \82ð\8fn\93Ç\82·\82é\82Æ\89½\82©\83q\83\93\83g\82ª\82 \82é\81H
+        \81¨64bit\82Ì\82ÝInit\82ð\8ds\82¤\82Æ64bit\83A\83v\83\8a\8fã\82Å\90³\8fí\93®\8dì\82µ\81A32bit\83A\83v\83\8a\8fã\82Å\82ÍDKPUHK64.exe\82Ì\83v\83\8d\83Z\83X\8fã\82Å\93®\82­
+   - ProcessExplorer\82Å\8am\94F\82·\82é\82Æ\81A64bit\83A\83v\83\8a(\83\81\83\82\92 )\82Ìload\82³\82ê\82Ä\82¢\82éDLL\82ÉDKPUHK64.DLL\82ª\82¢\82È\82¢
+        \81¨dchk64.exe\82Ì\82Ý\82ð\92¼\90Ú\8eÀ\8ds\82µ\82½\8fê\8d\87\82Í\96â\91è\82È\82¢\81H\81H(DKPUHK64.DLL\82ª\83\81\83\82\92 \82Éhook\82µ\82Ä\82¢\82½)
+        \81¨32bit\91¤\82ÌInit()\82ð\82µ\82È\82¢\82Æ\82Ç\82¤\82È\82é\81H
+          \81¨bingo!! DKPUHK64.DLL\82ªload\82³\82ê\82½
+   - [\8dÏ] 64bit DLL\82ÌUninit()\82ª\8cÄ\82Î\82ê\82È\82¢
+        \81¨32bit DLL\82ªUninit()\82³\82ê\82½\82Æ\82«\82ÉDKPUHK64.exe\82ª\8fI\97¹\82µ\82Ä\82¢\82é\81H\81H
+        \81¨Unload\82Ì\82 \82Æ\82ÉUninit\82ª\8cÄ\82Î\82ê\82Ä\82¢\82½\81¨Uninit->Unload\82É\82µ\82½
+\81E[B] \83\81\83\82\92 \82Å\95\8e\9a\89»\82¯
+  \81¨meta file\82Ì\8dÄ\90\82Å EMR_EXTTEXTOUTW\82Ì\83e\83L\83X\83g\82ª\89»\82¯\89»\82¯
+  \81¨64bit DLL\82ð\96³\8cø\82É\82µ\82½\82ç\82»\82Ì\96â\91è\82Í\94­\90\82µ\82È\82­\82È\82Á\82½\82ª\81A\95Ê\96â\91è\82ª\94­\90
+\81E[C] \83C\83\93\83N\83\8a\83\81\83\93\83^\83\8b\83T\81[\83`\82ð\97L\8cø\82É\82µ\82½\92¼\8cã\81AOCR Error\82ª\94­\90\82·\82é
+  \81¨Reboot()\82µ\82È\82¢\82æ\82¤\82É\82·\82é\82Æ\81A\82»\82Ì\8cã\82Í\90³\8fí\82É\93®\8dì\82·\82é\81B
+  \81¨\82Æ\82è\82 \82¦\82¸Reboot()\82ð\82Í\82¸\82µ\82½\81i\95K\97v\90«\82ª\8d¡\82Ì\82Æ\82±\82ë\96³\82­\82È\82Á\82½\82Ì\82Å\81j
+\81E[C] Chrome\82Å\8dÀ\95W\82ª\82¸\82ê\82é@VAIO Pro11
+  \81¨\90Ø\82è\94²\82«\82Í\91Î\8fÛwindow\82Ì\82Ý\82É\8cÀ\92è\82µ\81Aclick point\82à100,100\8cÅ\92è\82É\82¹\82¸\81A\91Î\8fÛwindow\82Åclip\82µ\82½\82Ù\82¤\82ª\82¢\82¢\82Ì\82Å\82Í\81H
+  \81¨\82»\82ê\82Í\91Î\89\9e\8dÏ\82Ý\81B\82µ\82©\82µ\96â\91è\82Íwindow8\82Ì\8ag\91å\8b@\94\\82¾\82Á\82½\81B
+  http://grabacr.net/archives/1132
+  GetDpiForMonitor, CDPI class\82 \82½\82è\82ª\8aÌ\82©\81H
+  \81¨GetDeviceCaps(LOGPIXELSx)\82ð\8eg\97p\82·\82ê\82Î\82¢\82¢\82¾\82¯\81H
+  \81¨\8eæ\93¾\95û\96@\82ª\8c©\82Â\82©\82ç\82¸\81B\83\86\81[\83U\81[\93ü\97Í\82Å\82Æ\82è\82 \82¦\82¸\91Î\8f\88
+  \81¨ResolutionScale\82¾\82Á\82½\82ª\82¤\82Ü\82­\93®\82©\82È\82¢\81H
+\81E[C] AMODI\82Ìtemporary folder\82ðlock\82µ\82Ä\82¢\82é\82ÆAMODI\82ª\8bN\93®\82Å\82«\82È\82¢\81i\8bN\93®\82µ\82Ä\82à\89½\82à\8c¾\82í\82¸\82É\8fI\97¹\81j
+\81E[?] XP\82Ìdpi scaling\82Í\96â\91è\82È\82©\82Á\82½\81H
+[\88À\92è\90«]
+\81E[B] inc.srch\82ð\97L\8cø\82É\82µ\82Ä\82¢\82é\82ÆDKPUHK64.exe\82Å\97\8e\82¿\82½\81B\81¨MouseMove\82Ì\82Æ\82±\82ë\82ðcomment out
+\81E[B] inc.srch\81{Ctrl+\89E\83N\83\8a\83b\83N\82Å\8c\83\82µ\82­\82â\82Á\82Ä\82¢\82é\82ÆAMODI\82Å\97\8e\82¿\82é
+  - inc.srch\82ð\97L\8cø\82É\82µ\82Ä\81A\83^\83X\83N\83g\83\8c\83C\82Ìdp\82Å\89E\83N\83\8a\83b\83N\83\81\83j\83\85\81[\82ð\8fo\82µ\81A\90à\96¾\8f\91\82ð\95\\8e¦\82É\83J\81[\83\\83\8b\82ð\8d\87\82í\82¹\82é\82ÆAMODI\82Å\97\8e\82¿\82é@win7
+\81E[B] FileSync\82Å\8c\9f\8dõ\82·\82é\82ÆFileSync\82ªassertion failure\82ð\8bN\82±\82µ\81APDHKU64.exe\82ª\97\8e\82¿\82é
+  - SyncExecFrm.cpp TSyncExecFrame::lbLogDrawItem 627
+  - XP(xw8400)\82Å\82Í\96â\91è\82È\82µ
+\81E[A?] \8c\9f\8dõ\93®\8dì\82µ\82È\82­\82È\82é\82Æ\82«\82ª\82 \82é\81H@win7
+  \81¨OS\8dÄ\8bN\93®\82È\82Ç\82Å\8dÄ\8c»\82µ\82È\82­\82È\82Á\82½\81H
+\81E[B?] amodi\82ð\8eg\97p\82·\82é\82Æoffice\82Ìinstall\82ª\8en\82Ü\82é\81H@win7
+  \81¨OS\8dÄ\8bN\93®\82È\82Ç\82Å\8dÄ\8c»\82µ\82È\82­\82È\82Á\82½\81H
+\81E[Q] DokoPop!\82ªPDIC\82ð\8bN\93®\82·\82é\82Æ\91O\89ñ\82Æ\88Ù\82È\82épath\82É\82 \82éPDIC\82ª\8bN\93®\82µ\82Ä\82µ\82Ü\82¤@vaio\81¨portable\94Å\82¾\82©\82ç\81BFAQ\82É\82 \82Á\82½\82Ù\82¤\82ª\82¢\82¢
+\81E[C] \83]\83\93\83rDKPUHK64.exe\82Ì\8f\88\97\9d
+\81E[C] pdhk64.exe\82ª\8e\80\82ñ\82¾\8e\9e\82Ì\91Î\8dô
+\81E[?] win8\82Ålog off\8e\9e\82Épdhk64.exe\82ª\97\8e\82¿\82é\81H
+\81E[?] stand-by\95\9c\8bA\8cãAMODI\82ª\97\8e\82¿\82é\81H@XP
+\81y\8dÏ\81z
+\81E[B][amodi] \83t\83@\83C\83\8b\8dí\8f\9c\8e\9e\82Ì\97á\8aO\8f\88\97\9d\92Ç\89Á
+\81E[B] WinXP\82Åinc.srch\82ª\82Ü\82Á\82½\82­\93®\82©\82È\82¢\81H
+  \81¨WinXP\82Å\82Í\81Aevent/thread\82ÍDLL\92P\88Ê\82Å\82Í\82È\82­\81ADLL instance\92P\88Ê\82Å\90\90¬\82·\82é\95K\97v\82ª\82 \82Á\82½
+\81E[B] \83C\83\93\83N\83\8a\83\81\83\93\83^\83\8b\83T\81[\83`\82ª\95p\94É\82É\94­\90\82·\82é\82½\82ß\8fd\82­\82È\82é\81¨\8c\9f\8dõ\82Ì\95p\93x\82ð\89º\82°\82é\95K\97v\82ª\82 \82é
+  \81¨\83J\81[\83\\83\8b\82ª\92â\8e~\82µ\82Ä\82©\82ç0.3\95b\8cã\81A\82È\82Ç
+  \81¨0.1\95b\8cã\82É\82È\82é\82æ\82¤\82É\82µ\82Ä\82 \82é\82Ì\82É\8fd\82¢\81B64bit\83A\83v\83\8a(IE\82È\82Ç)\8fã\82Å\8fd\82­\82È\82é\82æ\82¤\82¾\81B
+  \81¨OCR Error\82ª\94­\90\82·\82é\82Æ\83t\83@\83C\83\8b\8f\91\82«\8d\9e\82Ý\91Ò\82¿\82Ì\82R\95b\82Åwait\82³\82ê\82Ä\82¢\82½\81B
+  \81¨\96{\97\88\82»\82±\82Åwait\82µ\82Ä\82à\83X\83g\83b\83v\82·\82é\82Ì\82Í\82¨\82©\82µ\82¢\81Bwait\82Í\95Êthread\82Å\8ds\82¤\82æ\82¤\82É\82·\82é
+  \81¨\95Êthread\82Å\8eÀ\8ds\82·\82é\82æ\82¤\82É\82µ\82½\81¨OK
+\81E[B] \83\81\83\82\92 \82ÅOCR\82ª\93®\8dì\82µ\82È\82¢
+  \81¨GetDIBits()\82Å\83\81\83\82\83\8a\95s\91«\83G\83\89\81[\82ª\94­\90\82µ\82Ä\82¢\82é
+  \81¨MODI\82Ìinstall\82ª\81u\83}\83C\83R\83\93\83s\83\85\81[\83^\82©\82ç\8eÀ\8ds\81v\82É\82È\82Á\82Ä\82¢\82½\81i\96{\93\96\82Í\81u\83}\83C\83R\83\93\83s\83\85\81[\83^\82©\82ç\82·\82×\82Ä\8eÀ\8ds\81v\81j
+
+\81¡DPI awareness
+http://ascii.jp/elem/000/000/905/905248/ - \82í\82©\82è\82â\82·\82¢\90à\96¾(\93ú\96{\8cê)
+http://www.telerik.com/blogs/winforms-scaling-at-large-dpi-settings-is-it-even-possible- - \8aÈ\92P\82È\8aT\97v\90à\96¾
+http://kynosarges.org/WindowsDpi.html - \82±\82¿\82ç\82Ì\82Ù\82¤\82ª\82¢\82¢\90à\96¾\81H
+https://msdn.microsoft.com/ja-jp/library/windows/desktop/dn469266%28v=vs.85%29.aspx - HighDPI \91Î\89\9e\88ê\97\97\82È\82Ç\97l\81X\82È\8fî\95ñ
+https://msdn.microsoft.com/ja-jp/library/windows/desktop/dd464659%28v=vs.85%29.aspx - High DPI\91Î\89\9e\83v\83\8d\83O\83\89\83~\83\93\83O(8.1\97p\82µ\82©\8f\91\82¢\82Ä\82¢\82È\82¢\81H)
+Windows8.1\82Å\82Í 96dpi(100%), 120dpi(125%), 144dpi(150%), 192dpi(200%)\82Ì\8el\82Â\82 \82é
+\81E\8am\94F\8e\96\8d\80
+ - WinXP\82Å\82àDPI\82ð\95Ï\8dX\82·\82é\82ÆDokoPop!\82Í\90³\82µ\82­\93®\8dì\82µ\82È\82©\82Á\82½\82Ì\82Å\82Í\81H
+\81E\8e\8e\82µ\82É\82â\82Á\82Ä\82Ý\82é\82±\82Æ - manifest\82ðDPI aware\82É\95Ï\82¦\82Ä\82Ý\82é
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" >
+  <asmv3:application>
+    <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
+      <dpiAware>true</dpiAware>
+    </asmv3:windowsSettings>
+  </asmv3:application>
+</assembly>
+\81E\82â\82é\82±\82Æ
+ - manifest\82ÅDPI awareness\82ð\8ew\92è(or SetProcessDpiAwareness API) - DokoPop!\82Ímonitor\82²\82Æ\82É\82·\82é\95K\97v\82ª\82 \82é(\82½\82¾\82µ8.1\88È\8d~)
+ - GetDpiForMonitor() \82ÅDPI\8eæ\93¾ (8.1\88È\8d~\82Ì\82Ý)
+ - WM_DPICHANGED\82ðhandling\82·\82é
\81ª\82±\82Ì\95û\96@\82¾\82Æ8.1\88È\8d~\82µ\82©\91Î\89\9e\82Å\82«\82È\82¢\82Ì\82Å\82Í\81H
+\81E\82â\82é\82±\82Æ\81E\82»\82Ì\82Q
+https://msdn.microsoft.com/ja-jp/library/windows/desktop/dn469266%28v=vs.85%29.aspx#appendix_a_setting_high_DPI_in_windows
+\82±\82ê\82æ\82è\81A
+ScaleFactor = (LogicalMonitorWidth/LogicalDesktopWidth) / (PhysicalMonitorWidth/PhysicalDesktopWidth)
+
+MONITORINFOEX LogicalMonitorInfo;
+LogicalMonitorInfo.cbSize = sizeof(MONITORINFOEX);       
+GetMonitorInfo(hMonitor, &LogicalMonitorInfo);
+LogicalMonitorWidth = LogicalMonitorInfo.rcMonitor.right - LogicalMonitorInfo.rcMonitor.left;
+
+LogicalDesktopWidth = GetSystemMetrics(SM_CXVIRTUALSCREEN);
+
+(PhysicalDesktopWidth, PhisicalMonitorWidth) = QueryDisplayConfig()\82ÌDISPLAYCONFIG_MODE_INFO\82ÌpModeInfoArray[i].sourceMode.width
+
+(\8eQ\8dl)Windows8\82É\82Í\81A
+PhysicalToLogicalPoint/LogicalToPhysicalPoint\82Æ\82¢\82¤\82à\82Ì\82ª\82 \82é\82»\82¤\82È\81B
+https://msdn.microsoft.com/ja-jp/library/windows/desktop/dn384112%28v=vs.85%29.aspx
+
+PhysicalToLogicalPointForPerMonitorDPI function/LogicalToPhysicalPointForPerMonitorDPI - \82±\82ê\82ÍDPI-awareness levelo\82Ì\89e\8b¿\82ð\8eó\82¯\82È\82¢ (Win8.1\88È\8d~)
+GetDpiForMonitor - (Win8.1\88È\8d~)
+
+\81HPhysical Desktop Width/Physical Monitor Width
+> To get the physical desktop width and physical monitor width, call QueryDisplayConfig. For each DISPLAYCONFIG_MODE_INFO in the returned pModeInfoArray, check the pModeInfoArray[i].sourceMode.width (and height and position) to reconstruct the bounding rect of all the monitors.
+\82Æ\82 \82é\82ª\81A\82Ç\82Ì\82æ\82¤\82É\8eæ\93¾\82·\82ê\82Î\82¢\82¢\82Ì\82¾\81H
+source\82ªdesktop\82Åtarget\82ªmonittor\81H
+
+\88È\8fã\82ª\90³\82µ\82¢\82Æ\82·\82é\82Æ\81AScaleFactor\82Í\81A
+ScaleFactor = (1280/1280) / (1920/1920) = 1 \82Æ\82È\82Á\82Ä\82µ\82Ü\82¤\81H\81H\81\97VAIO
+
+\81¡TODO
+\81E[B] x64\82Í\95Ê\83f\83B\83\8c\83N\83g\83\8a\82É\82·\82é\82Æ\8f]\97\88\83t\83b\83N\82ª\93®\82­\82æ\82¤\82É\82È\82é\82Ì\82Å\82Í\81H
+  \81¨\82È\82³\82»\82¤
+\81E[B-] MODI\83C\83\93\83X\83g\81[\83\8b\82Í\90ê\97p\89æ\96Ê\82É\82·\82é(URL\83W\83\83\83\93\83v)
+  - \8dÅ\8f\89\82Ì\89æ\96Ê\82Í\90ê\97pDLG\82É\82·\82é
+  \81¨\88ê\92U\8e©\95ª\82ÌHP(source forge?)\82É\94ò\82ñ\82Å\82©\82çredirect?
+\81E[B] \8fí\82É\94F\8e¯\82ð\8ds\82¤AMODI\82ð\82à\82¤\88ê\82Â\97p\88Ó\82µ\82Ä\81A\83|\83b\83v\83A\83b\83v\82·\82é\82Ü\82Å\82Ì\8e\9e\8aÔ\82ð\92Z\8fk\82µ\82Ä\82Ý\82Ä\82Í\82Ç\82¤\82©\81H
+  - \8f­\82µ\82µ\82©\88Ú\93®\82µ\82Ä\82¢\82È\82¢\8fê\8d\87\81A\94F\8e¯\82µ\82½\8dÀ\95W\82Ì\83I\83t\83Z\83b\83g\82ð\8cv\8eZ\82·\82é\82Æ\82©\81H
+\81E[B] MODI\83C\83\93\83X\83g\81[\83\8b\8cã\81ADokoPop!\8dÄ\8bN\93®\96³\82µ\82É\82Å\82«\82È\82¢\82©\81H
+  \81¨AMODI.exe\82ð\8eÀ\8ds\82·\82é\95K\97v\82ª\82 \82é\82½\82ß\81A\8f\88\97\9d\82Æ\82µ\82Ä\82Í\8c\8b\8d\\8fd\82¢
+  \81¨Wizard\8c`\8e®\82É\82·\82é\95K\97v\82ª\82 \82é\82Ì\82Å\82Í\81H
+\81EWizard\8c`\8e®\82Ì\8c\9f\93¢
+  - AMODI.exe\8eÀ\8ds\83G\83\89\81[\81¨MODI\82ª\83C\83\93\83X\83g\81[\83\8b\82³\82ê\82Ä\82¢\82È\82¢\82Æ\89¼\92è\82·\82é
+  - \83C\83\93\83X\83g\81[\83\8b\89Â\94Û\82Ì\96â\82¢\8d\87\82í\82¹
+  - Web\83y\81[\83W\82ð\95\\8e¦\82µ\82Ä\83C\83\93\83X\83g\81[\83\8b\82ð\8ds\82¤\81©\8e©\91O\82ÌHP\82ð\97p\88Ó\82·\82é
+       - \83C\83\93\83X\83g\81[\83\8b\82Ì\88ê\94Ô\8dÅ\8cã\82ÉDokoPop!\82Ì\91\80\8dì(\8dÄ\8bN\93®\81H\81j\82ð\91£\82·
+\81E[B] Ctrl\83L\81[\82ð\97£\82µ\82½\82ç\95Â\82\82é\82ð\8aO\82·\82ª\93®\82©\82È\82¢
+\81E[B] aero/metro\97L\8cø\8e\9e\82Ì\93®\8dì\83e\83X\83g
+\81E[B] PDIC\96{\91Ì\82Ì\8bN\93®\8am\94F\82Í\82Ç\82¤\82·\82é\81H
+\81E[B] VUP\8b@\94\
+\81E[B] Q&A\82Ì\97p\88Ó
+\81E[C] VUP\92Ê\92m\8b@\94\
+\81E[C] amodi OCR\93®\8dì\92\86\82ð\82Ç\82±\82©\82Å\8fo\82µ\82½\82Ù\82¤\82ª\82¢\82¢\82Ì\82Å\82Í\81H
+\81E[C] \82à\82¤\8f­\82µclickable area\82ð\8dL\82­\82Å\82«\82È\82¢\82©\81Hpdf\82Å\82Í\83q\83b\83g\82³\82¹\82é\82Ì\82ª\93ï\82µ\82¢\81¨MARGIN_UNDER_CLICK\82Å\92²\90®
+\81E[C] metro\8fã\81AWin8/PDF Viewer\8fã\82È\82Çwin8\93Æ\8e©\83A\83v\83\8a\82Å\82Ì\93®\8dì\83e\83X\83g
+\81E[B] biggest\82ª\83q\83b\83g\82µ\82È\82¢
+\81E[C] \93ñ\8fd\8bN\93®\93®\8dì\83e\83X\83g
+\81E[C] installer
+  - version\8e©\93®\95t\82¯\91Ö\82¦\8b@\94\
+\81E[B?] popup\8c\9f\8dõ\8e\9e\82àmulti thread\82É\82·\82é
+  - \82»\82ê\82æ\82è\81A\97D\90æ\8f\87\88Ê\82Ì\8d\82\82¢\82à\82Ì\82©\82ç\97D\90æ\93I\82É\95\\8e¦\82µ\82½\82Ù\82¤\82ª\82¢\82¢\82©\82à\82µ\82ê\82È\82¢
+  - \82Ç\82±\82Å\8e\9e\8aÔ\82ª\82©\82©\82Á\82Ä\82¢\82é\82Ì\82©\82à\82¤\8f­\82µ\8fÚ\82µ\82­\92²\82×\82é
+\81E[C] AMODI\88Ù\8fí\8fI\97¹\91Î\8dô
+  - DLL\82à\88ê\8f\8f\82É\8e\80\96S\82·\82é\82½\82ß\81A\8dÄ\8bN\93®\82µ\82©\82È\82¢\81H\81¨\90Ý\92è\82ª\8c³\82É\96ß\82é\82à\82Ì\82ª\82 \82é\82½\82ß\82æ\82ë\82µ\82­\82È\82¢
+\81E[C?] PDIC\8fã\82Å\82Íinc.srch\82ª\93®\8dì\82µ\82È\82¢\82æ\82¤\82É\82·\82é\81¨\96â\91è\82È\82¢\81H
+\81E[C] button down\82ðtrigger\82É\82µ\82Ä\82¢\82é\82ª\81Abutton up\82ðtrigger\82É\82µ\82Äup cancel\82·\82é\82Ì\82ð\8e~\82ß\82Ä\82Ý\82Ä\82Í\81H
+  [\95\8c¾]
+   MODI\82ð\83C\83\93\83X\83g\81[\83\8b\82·\82é\82ÆDokoPop!\82Å\8c\9f\8dõ\82Å\82«\82é\83A\83v\83\8a\82ð\91\9d\82â\82·\82±\82Æ\82ª\82Å\82«\82Ü\82·\81B
+   (URL)\82ð\8eQ\8dl\82É\83C\83\93\83X\83g\81[\83\8b\82ð\8ds\82Á\82Ä\82­\82¾\82³\82¢\81B
+   \81¦\83\8a\83\93\83N\90æ\82Ì\83y\81[\83W\82ª\90³\82µ\82­\95\\8e¦\82³\82ê\82È\82¢\8fê\8d\87\82Í\81A"MODI OCR \83C\83\93\83X\83g\81[\83\8b"\82Å\83l\83b\83g\8c\9f\8dõ\82µ\82Ä\92²\82×\82Ä\82Ý\82Ä\82­\82¾\82³\82¢\81B
+   \81¦Win2K\82Å\82Í\82»\82Ì\82Ü\82Ü\82Å\82Í\8eg\97p\82Å\82«\82Ü\82¹\82ñ\81B
+\81E[C] AMODI\82Ì\8fI\97¹\91Î\8dô
+  - DokoPop!\8dÄ\8bN\93®\82Å\82¢\82¢\82©\81H
+  - \8dÅ\92á\82Å\82à\8cx\8d\90\82ð\8fo\82µ\82½\95û\82ª\81H
+\81E[C] \83l\83b\83g\83\8f\81[\83N\83\82\81[\83h - AMODI\82ðserver\8fã\82É\92u\82­
+  - Windows\8b¤\97L\82Å\82¢\82¢\81H - \82±\82Ì\8dÛ\81A\83t\83@\83C\83\8b\8ew\92è\82ª\95K\97v
+  - TCP/IP\82Í\8d\82\91¬\82¾\82¯\82Ç\81A\96Ê\93|\82¾\82µ\82È\81B\81B
+       reponse\82ª\88«\82¯\82ê\82ÎTCP/IP\82ð\8dl\82¦\82é
+
+\81¡BUG\8a®\97¹
+\81E[B] MODI install - \83^\83C\83~\83\93\83O\82ª\88«\82¢\82Æ\81A
+  MODI\83C\83\93\83X\83g\81[\83\8b\92\86\82ÉMODI\94F\8e¯\81¨\8dÄ\8bN\93®\81¨MODI\8cë\94F\81iinstall\82³\82ê\82Ä\82¢\82È\82¢\81j\81¨\8dÄ\82Ñ\83C\83\93\83X\83g\81[\83\8b\82µ\82ëDialog
+  \81¨interval\82ð\92u\82¢\82Ächeck\82·\82é\82æ\82¤\82É\82µ\82½
+\81E[B] MODI\83C\83\93\83X\83g\81[\83\8bDIALOG\82ð\95Â\82\82é\82Æ\83^\83X\83N\83o\81[\82É\83A\83C\83R\83\93\82ª\8ec\82é
+  \81¨FormCreate\92\86\82Édialog\82ð\95\\8e¦\82³\82¹\82½\82½\82ß\81¨IdleProc\82Ö
+\81E[A] \8f]\97\88\82Ìdokopop\82ª\93®\82©\82È\82­\82È\82Á\82½@vaio
+  \81¨USE_VXD\91Î\89\9e\82É\82æ\82èWindowsNT flag\82ªfalse\82É\82È\82Á\82Ä\82µ\82Ü\82Á\82½\82½\82ß\81AGetTextFromPoint()\82ª\8eÀ\8e¿\89½\82à\8eÀ\8ds\82¹\82¸-1\82ð\95Ô\82µ\82Ä\82¢\82½\82½\82ß\81B
+\81E[B?] \8f\89\8aú\89»\8e\9e\82É64\91¤\82ÌConfig2\82ª\8cÄ\82Î\82ê\82È\82¢\81H
+  \81¨pdhk64\82ª\8f\89\8aú\89»\8a®\97¹\82·\82é\91O\82ÉConfig\82µ\82Ä\82¢\82½
+\81EPDF\82Å\94÷\96­\82É\8fã\89º\88Ê\92u\82ª\82¸\82ê\82é\82Æ\82«\82ª\82 \82é\81¨\94F\8e¯\91Î\8fÛ\95\8e\9a\97ñ\82Ì\90æ\93ª\82É\97]\8cv\82È\8bó\8ds\82ª\93ü\82é\8fê\8d\87\82ª\82 \82Á\82½\82½\82ß
+\81E[C] \83C\83\93\83N\83\8a\83\81\83\93\83^\83\8b\83T\81[\83`ON\82Å\97\8e\82¿\82é
+  - Config2()\82ð\8cÄ\82Ñ\8fo\82µ\82Ä\82¢\82é\82¾\82¯\82Ì\82Í\82¸\82¾\82ª\81Ahook/unhook\82ª\8cÄ\82Î\82ê\82Ä\82¢\82é
+       \81¨Config2()\82©\82çTHookLoader::Capture\82Ü\82Å\82Ì\8aÔ\82É\8cÄ\82Î\82ê\82Ä\82¢\82é
+       \81¨config\92¼\8cã\82Émouse move message\82ªcallback\82³\82ê\81A\82·\82®\82Écapture\82·\82é\82©\82ç\82¢\82¯\82È\82¢\82Ì\82©\81H
+       \81¨\82¢\82â\81AhDll->Capture()\8e©\91Ì\82ª\95s\88À\92è\82¾\82Á\82½\81B\82Æ\82¢\82¤\82±\82Æ\82Í\90ö\8dÝ\93I\82É\82 \82Á\82½\96â\91è\81H(AMODI=OFF)
+       \81¨DBW\82ðOFF\82É\82µ\82½\82ç\89ð\8c\88\81i\82Å\82Í\89½\82ª\96{\93\96\82Ì\8c´\88ö\81H\81j
+\81E[B] VS2010\82Ì\83G\83f\83B\83^\81[\82Å\90³\8fí\82É\93®\82©\82È\82¢
+  \81¨click point\82ª100pixel\82­\82ç\82¢\89E\82É\82¸\82ê\82Ä\82¢\82é\81H\8fã\89º\95û\8cü\82à
+  \81¨amodi\91¤\82Í\96â\91è\82È\82µ\81Bcaptured image\82Æcursor\8dÀ\95W\82ª\82¸\82ê\82Ä\82¢\82é\81H
+   - capture page\82ð\82µ\82Ä\82à\82¸\82ê\82Ä\82¢\82é\81B
+  \81¨\82í\82©\82Á\82½\81Bmouse cursor\82ÍGetWindowRect()\82É\82æ\82éwindow\91S\91Ì\82È\82Ì\82É\91Î\82µ\81A
+       \89æ\91\9c\82ÍGetWindowDC()+BitBlt(hdc)\82Å\82â\82Á\82Ä\82¢\82é\82½\82ß\81Ahdc\82ª\91Î\8fÛ\82É\82È\82Á\82Ä\82µ\82Ü\82¤\81B
+  \81¨screen\8dÀ\95W\8cn\82Åpoint\82ð\88µ\82¢\81A\89æ\91\9c\82ÍGetWindowRect()\82Ì\97Ì\88æ\82ðBitBlt\82·\82é\82±\82Æ\82Å\91Î\89\9e
+\81E[B][inc.srch] \83}\83E\83X\89º\82Ì\83A\83v\83\8a\82ª\97\8e\82¿\82é(task manager@7 task manager,explorer@XP)
+  \81¨SendMessage( hwnd, WM_PAINT, (WPARAM)hdcMeta, 0 );
+       \82Å\97\8e\82¿\82Ä\82¢\82½\82Ì\82Å\81ARETRYMETA\82ð0\82É\82µ\82½\81¨\82Ü\82¾\97\8e\82¿\82é
+  \81¨MouseProc\82ÆDoCapture\82ð\95ª\97£\82·\82ê\82Î\88À\92è\82·\82é\82ñ\82\82á\82È\82©\82ë\82¤\82©\81H
+  \81¨\8c\8b\98_\81F\95ª\97£\82µ\82Ä\81ADBW\82Í\95s\88À\92è\82É\82µ\81ADCHookTest.exe\82Ìbreakpoint\82à\95s\88À\92è\97v\88ö
+\81E[A] Chrome\82ÅCtrl+\89E\83N\83\8a\83b\83N\82·\82é\82Æhit window\82ª\8fo\82é\92¼\91O\82ÉChrome\82ª\97\8e\82¿\82é
+  \81¨CaptureText\82ª\88«\82¢\82æ\82¤\82¾
+  \81¨ExtTextOutX()\82Ì\8f\91\82«\8a·\82¦(METAEXTTEXTOUT)\8e©\91Ì\82ª\8c´\88ö(\91ã\91Ö\8aÖ\90\94\82Ì\96â\91è\82Å\82Í\82È\82¢\81j
+  \81¨\8d¡\82Ü\82Å\82È\82º\93®\82¢\82Ä\82¢\82½\81H
+  - SetWriteProtect()\82Åprotect\89ð\8f\9c\82µ\82½\82Ì\82ª\88«\82¢\82æ\82¤\82¾
+  - \82»\82ê\82æ\82è\81AhProcess\82ªerror\82ð\8bN\82±\82µNULL\82¾\82Á\82½
+       \81¨\82±\82ê\82Å\97\8e\82¿\82é\82±\82Æ\82Í\89ð\8fÁ\82Å\82«\82½\82ª\81AhProcess\82ªNULL\82Ì\96â\91è\82ª\82 \82é
+\81E[CB] OpenProcess\82Åerror
+  \81¨EnablePrivilege()\82ð\92Ç\89Á\82·\82é\82±\82Æ\82ÅOK
+\81E[B] inc.srch\82Ì\93®\8dì\82ª\8fd\82¢
+  - ExecOCR-2\82Ì\8cã\82ª\82Ù\82Ú\92â\8e~\8fó\91Ô
+  \81¨MODI OCR Error\82ª\94­\90\82µ\82½\82Æ\82«\82É1.4sec\82Ù\82Ç\8e~\82Ü\82é
+  \81¨\94\92\82Ì\89æ\91\9c\82ª\82Å\82«\82Ä\82¢\82é
+  \81¨\8e\9e\81XGetDIBits()\82Å\8e¸\94s(error code\95s\96¾)\81B
+  \81¨\89æ\91\9c\83R\83s\81[\82Ì\83G\83\89\81[\83`\83F\83b\83N\82ð\82µ\82Á\82©\82è\82â\82Á\82½\82çMODI OCR Error\82Í\8bN\82«\82Ä\82¢\82È\82¢
+
+\81¡FAQ
+\81E\8aÇ\97\9d\8eÒ\8c \8cÀ\82Ì\83A\83v\83\8a\8fã\82Å\82Í\93®\8dì\82µ\82È\82¢
+\81@\81¨\8aÇ\97\9d\8eÒ\8c \8cÀ\82ÅDoioPop!\82ð\8bN\93®\82·\82ê\82Î\89Â\94\
+  \81¨MODI\82ð\8eg\97p\82·\82ê\82Î\89Â\94\\81H
+
+\81¡Note
+\81EDCHook.dll\82ðVisualC++ 2010\82Å\83r\83\8b\83h\82·\82é\82Æ\81AWindows2000\82Å\93®\8dì\82µ\82È\82­\82È\82Á\82Ä\82µ\82Ü\82¤\81I\81I
+  \81iLoadLibrary\82Å\83G\83\89\81[\81j
+  \81¨DCHook/DCHook.6.0.sln\82ðVisualStudio2008\82Å\8aJ\82«\81A\83r\83\8b\83h\82·\82é
+\81E64bit\83A\83v\83\8a\8fã\81¨32bitDLL\82Ì\82Ý\82ª\94½\89\9e
+  32bit\83A\83v\83\8a\8fã\81¨32bit/64bit\97¼\95û\82ÌDLL\82ª\94½\89\9e
+
+\81¡MODI
+WindowsXP\88È\8d~\91Î\89\9e(?)
+- MDI to TIFF File Converter
+  \81¨\83C\83\93\83X\83g\81[\83\8b\82µ\82Ä\82Ý\82½\82ªbuild\82Å\82«\82¸(C:\Program Files (x86)\modiconv\82Émdivwctl.dll\82Æ\82¢\82¤\83t\83@\83C\83\8b\82Í\8c©\82Â\82©\82ç\82È\82©\82Á\82½\81j
+- SharePoint Designer 2007\82ð\83C\83\93\83X\83g\81[\83\8b
+  http://www.microsoft.com/ja-jp/download/details.aspx?id=21581
+  "C:\Program Files (x86)\Common Files\Microsoft Shared\MODI\12.0"
+  \82É
+  MDIVWCTL.DLL
+  \82Æ\82¢\82¤\83t\83@\83C\83\8b\82ª\82Å\82«\82é\82Ì\82Å\81A\82±\82ê\82ðC#\82Ì\83v\83\8d\83W\83F\83N\83g\82Ì\8eQ\8fÆ\83p\83X\82É\8ew\92è\82·\82é
+  \81¦MODI/11.0\82Å\82Íamodi\82ªbuild\82Å\82«\82È\82¢(MODI\82ª\8c©\82Â\82©\82ç\82È\82¢error)@XP/VS2010
+- SharePoint Designer\82È\82ñ\82Ä\8eg\82í\82È\82¢\81A\82Ù\82©\82Ì\95û\96@\82Í\82È\82¢\82©\81H
+  http://support.microsoft.com/kb/982760/ja-jp
+  \82½\82¾\82µ\81A\93®\8dì\96¢\8am\94F\81¨\83\8a\83\93\83N\90Ø\82ê2014.11.11
+
+\81¡BUILD
+\81EDCHook64 - VisualC++ 2010\82Å\8dì\90¬
+\81E2016.9.22
+  DCHook.vcproj\82Éx64\97p\82ÌConfiguration\82ð\92Ç\89Á\81AVS3008\82Åx64\82ð\83r\83\8b\83h\82Å\82«\82é\82æ\82¤\82É\82µ\82½\81B
+  DCHook\VS2003, DCHook\VS2008, DCHook\VS2015\82Æ\82¢\82¤\83f\83B\83\8c\83N\83g\83\8a\82ð\8dì\90¬\82µ\82½\82ª\82¢\82¸\82ê\82à\90³\8fí\82É\82¢\82©\82È\82¢\81B
+  VS2008\82É\82Â\82¢\82Ä\82Í.vcproj\83t\83@\83C\83\8b\82ðDCHook\DCHook.vcproj\83t\83@\83C\83\8b\82Æ\94ä\8ar\82µ\82Ä\90Ý\92è\82·\82ê\82Î\82¤\82Ü\82­\93®\82­\82æ\82¤\82É\82È\82é\82Æ\8ev\82¤
+  \8c»\8e\9e\93_\82Ì\83v\83\8d\83W\83F\83N\83g
+  DCHook.6.0.sln, DCHook.vcproj\82ðVS2008\82Å\83r\83\8b\83h\82·\82é
+  \81¦DCHook.sln\82ÍVS2010\97p
+
diff --git a/ExMODIst/ExMODIst.bpf b/ExMODIst/ExMODIst.bpf
new file mode 100644 (file)
index 0000000..d2eea08
--- /dev/null
@@ -0,0 +1,5 @@
+USEUNIT("main.cpp");\r
+//---------------------------------------------------------------------------\r
+This file is used by the project manager only and should be treated like the project file\r
+
+\rmain
\ No newline at end of file
diff --git a/ExMODIst/ExMODIst.bpr b/ExMODIst/ExMODIst.bpr
new file mode 100644 (file)
index 0000000..8b81150
--- /dev/null
@@ -0,0 +1,114 @@
+<?xml version='1.0' encoding='utf-8' ?>
+<!-- C++Builder XML Project -->
+<PROJECT>
+  <MACROS>
+    <VERSION value="BCB.05.03"/>
+    <PROJECT value=".\obj\ExMODIst.exe"/>
+    <OBJFILES value="main.obj"/>
+    <RESFILES value=""/>
+    <DEFFILE value=""/>
+    <RESDEPEN value="$(RESFILES)"/>
+    <LIBFILES value=""/>
+    <LIBRARIES value=""/>
+    <SPARELIBS value=""/>
+    <PACKAGES value="Vcl50.bpi Vclx50.bpi bcbsmp50.bpi Qrpt50.bpi Vcldb50.bpi Vclbde50.bpi 
+      ibsmp50.bpi vcldbx50.bpi TeeUI50.bpi TeeDB50.bpi Tee50.bpi TeeQR50.bpi 
+      VCLIB50.bpi bcbie50.bpi vclie50.bpi Inetdb50.bpi Inet50.bpi NMFast50.bpi 
+      dclocx50.bpi bcb2kaxserver50.bpi TNTLIBR.bpi dclusr50.bpi"/>
+    <PATHCPP value=".;"/>
+    <PATHPAS value=".;"/>
+    <PATHRC value=".;"/>
+    <PATHASM value=".;"/>
+    <DEBUGLIBPATH value="$(BCB)\lib\debug"/>
+    <RELEASELIBPATH value="$(BCB)\lib\release"/>
+    <LINKER value="tlink32"/>
+    <USERDEFINES value=""/>
+    <SYSDEFINES value="NO_STRICT;_NO_VCL"/>
+    <MAINSOURCE value="ExMODIst.bpf"/>
+    <INCLUDEPATH value="$(BCB)\include;$(BCB)\include\vcl"/>
+    <LIBPATH value="$(BCB)\Projects\Lib;$(BCB)\lib\obj;$(BCB)\lib"/>
+    <WARNINGS value="-w-par"/>
+  </MACROS>
+  <OPTIONS>
+    <CFLAG1 value="-O2 -H=$(BCB)\lib\vcl50.csm -Hc -Vx -Ve -f- -X- -a8 -5 -b- -k- -vi -tWC 
+      -tWM -c"/>
+    <PFLAGS value="-$Y- -$L- -$D- -v -JPHNE -M"/>
+    <RFLAGS value=""/>
+    <AFLAGS value="/mx /w2 /zn"/>
+    <LFLAGS value="-D&quot;&quot; -ap -Tpe -x -Gn"/>
+  </OPTIONS>
+  <LINKER>
+    <ALLOBJ value="c0x32.obj $(OBJFILES)"/>
+    <ALLRES value="$(RESFILES)"/>
+    <ALLLIB value="$(LIBFILES) $(LIBRARIES) import32.lib cw32mt.lib"/>
+  </LINKER>
+  <IDEOPTIONS>
+[Version Info]
+IncludeVerInfo=0
+AutoIncBuild=0
+MajorVer=1
+MinorVer=0
+Release=0
+Build=0
+Debug=0
+PreRelease=0
+Special=0
+Private=0
+DLL=0
+Locale=1041
+CodePage=932
+
+[Version Info Keys]
+CompanyName=
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+Comments=
+
+[HistoryLists\hlIncludePath]
+Count=1
+Item0=$(BCB)\include;$(BCB)\include\vcl
+
+[HistoryLists\hlLibraryPath]
+Count=1
+Item0=$(BCB)\Projects\Lib;$(BCB)\lib\obj;$(BCB)\lib
+
+[HistoryLists\hlDebugSourcePath]
+Count=1
+Item0=$(BCB)\source\vcl
+
+[HistoryLists\hlConditionals]
+Count=1
+Item0=_DEBUG
+
+[HistoryLists\hlFinalOutputDir]
+Count=2
+Item0=.\obj\
+Item1=.\obj
+
+[Debugging]
+DebugSourceDirs=$(BCB)\source\vcl
+
+[Parameters]
+RunParams=
+HostApplication=
+RemoteHost=
+RemotePath=
+RemoteDebug=0
+
+[Compiler]
+ShowInfoMsgs=0
+LinkDebugVcl=0
+LinkCGLIB=0
+
+[Language]
+ActiveLang=
+ProjectLang=
+RootDir=
+  </IDEOPTIONS>
+</PROJECT>
\ No newline at end of file
diff --git a/ExMODIst/ExMODIst.cpp b/ExMODIst/ExMODIst.cpp
new file mode 100644 (file)
index 0000000..8de0dce
--- /dev/null
@@ -0,0 +1,46 @@
+// ExMODIst.cpp : \83R\83\93\83\\81[\83\8b \83A\83v\83\8a\83P\81[\83V\83\87\83\93\82Ì\83G\83\93\83g\83\8a \83|\83C\83\93\83g\82ð\92è\8b`\82µ\82Ü\82·\81B
+//
+
+#include "stdafx.h"
+#include "ExMODIst.h"
+#include "MDIVWCTL.tlh"
+
+using namespace modi;
+
+bool IsMODIAvailable();
+
+using namespace std;
+
+int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
+{
+       if (IsMODIAvailable()){
+               return 1;
+       }
+       return 0;
+}
+
+bool IsMODIAvailable()
+{
+       bool bRet= true;
+
+    HRESULT hr;
+    modi::IDocument  *IDobj   = NULL;
+
+       hr = CoInitialize(0);
+       if ( SUCCEEDED(hr))
+       {
+               hr = CoCreateInstance(CLSID_Document,NULL,CLSCTX_ALL,IID_IDocument,(void**) &IDobj);
+
+               if ( SUCCEEDED(hr) )
+               {
+                       IDobj->Release();
+               } else {
+                  bRet= false;
+               }
+
+       } else {
+               bRet= false;
+       }
+
+       return bRet;
+}
diff --git a/ExMODIst/ExMODIst.h b/ExMODIst/ExMODIst.h
new file mode 100644 (file)
index 0000000..d00d47e
--- /dev/null
@@ -0,0 +1,3 @@
+#pragma once
+
+#include "resource.h"
diff --git a/ExMODIst/ExMODIst.rc b/ExMODIst/ExMODIst.rc
new file mode 100644 (file)
index 0000000..d7f2b88
--- /dev/null
@@ -0,0 +1,69 @@
+//Microsoft Visual C++ \82Å\90\90¬\82³\82ê\82½\83\8a\83\\81[\83\83X\83N\83\8a\83v\83g\82Å\82·\81B
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE 2 \83\8a\83\\81[\83X\82©\82ç\90\90¬\82³\82ê\82Ü\82µ\82½\81B
+//
+#include "afxres.h"
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN)
+LANGUAGE 17, 1
+#pragma code_page(932)
+
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE
+BEGIN
+    "resource.h\0"
+END
+
+2 TEXTINCLUDE
+BEGIN
+    "#include ""afxres.h""\r\n"
+    "\0"
+END
+
+3 TEXTINCLUDE
+BEGIN
+    "\r\n"
+    "\0"
+END
+
+#endif    // APSTUDIO_INVOKED
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// \83X\83g\83\8a\83\93\83\83e\81[\83u\83\8b
+//
+
+STRINGTABLE
+BEGIN
+   IDS_APP_TITLE       "ExMODIst"
+END
+
+#endif
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE 3 \83\8a\83\\81[\83X\82©\82ç\90\90¬\82³\82ê\82Ü\82µ\82½\81B
+//
+#ifndef _AFXDLL
+#include "l.JPN\\afxres.rc"
+#endif
+
+/////////////////////////////////////////////////////////////////////////////
+#endif    // APSTUDIO_INVOKED \82Å\82È\82¢\8fê\8d\87
diff --git a/ExMODIst/ExMODIst.sln b/ExMODIst/ExMODIst.sln
new file mode 100644 (file)
index 0000000..843ca03
--- /dev/null
@@ -0,0 +1,20 @@
+
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ExMODIst", "ExMODIst.vcxproj", "{1061424B-BA88-4553-AFB9-5A89717E44D7}"
+EndProject
+Global
+       GlobalSection(SolutionConfigurationPlatforms) = preSolution
+               Debug|Win32 = Debug|Win32
+               Release|Win32 = Release|Win32
+       EndGlobalSection
+       GlobalSection(ProjectConfigurationPlatforms) = postSolution
+               {1061424B-BA88-4553-AFB9-5A89717E44D7}.Debug|Win32.ActiveCfg = Debug|Win32
+               {1061424B-BA88-4553-AFB9-5A89717E44D7}.Debug|Win32.Build.0 = Debug|Win32
+               {1061424B-BA88-4553-AFB9-5A89717E44D7}.Release|Win32.ActiveCfg = Release|Win32
+               {1061424B-BA88-4553-AFB9-5A89717E44D7}.Release|Win32.Build.0 = Release|Win32
+       EndGlobalSection
+       GlobalSection(SolutionProperties) = preSolution
+               HideSolutionNode = FALSE
+       EndGlobalSection
+EndGlobal
diff --git a/ExMODIst/ExMODIst.vcproj b/ExMODIst/ExMODIst.vcproj
new file mode 100644 (file)
index 0000000..e7d6118
--- /dev/null
@@ -0,0 +1,239 @@
+<?xml version="1.0" encoding="shift_jis"?>
+<VisualStudioProject
+       ProjectType="Visual C++"
+       Version="9.00"
+       Name="ExMODIst"
+       ProjectGUID="{1061424B-BA88-4553-AFB9-5A89717E44D7}"
+       RootNamespace="ExMODIst"
+       Keyword="Win32Proj"
+       TargetFrameworkVersion="196613"
+       >
+       <Platforms>
+               <Platform
+                       Name="Win32"
+               />
+       </Platforms>
+       <ToolFiles>
+       </ToolFiles>
+       <Configurations>
+               <Configuration
+                       Name="Debug|Win32"
+                       OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+                       IntermediateDirectory="$(ConfigurationName)"
+                       ConfigurationType="1"
+                       UseOfMFC="2"
+                       CharacterSet="1"
+                       >
+                       <Tool
+                               Name="VCPreBuildEventTool"
+                       />
+                       <Tool
+                               Name="VCCustomBuildTool"
+                       />
+                       <Tool
+                               Name="VCXMLDataGeneratorTool"
+                       />
+                       <Tool
+                               Name="VCWebServiceProxyGeneratorTool"
+                       />
+                       <Tool
+                               Name="VCMIDLTool"
+                       />
+                       <Tool
+                               Name="VCCLCompilerTool"
+                               Optimization="0"
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
+                               MinimalRebuild="true"
+                               BasicRuntimeChecks="3"
+                               RuntimeLibrary="3"
+                               UsePrecompiledHeader="2"
+                               WarningLevel="3"
+                               DebugInformationFormat="4"
+                       />
+                       <Tool
+                               Name="VCManagedResourceCompilerTool"
+                       />
+                       <Tool
+                               Name="VCResourceCompilerTool"
+                       />
+                       <Tool
+                               Name="VCPreLinkEventTool"
+                       />
+                       <Tool
+                               Name="VCLinkerTool"
+                               LinkIncremental="2"
+                               GenerateDebugInformation="true"
+                               SubSystem="1"
+                               TargetMachine="1"
+                       />
+                       <Tool
+                               Name="VCALinkTool"
+                       />
+                       <Tool
+                               Name="VCManifestTool"
+                       />
+                       <Tool
+                               Name="VCXDCMakeTool"
+                       />
+                       <Tool
+                               Name="VCBscMakeTool"
+                       />
+                       <Tool
+                               Name="VCFxCopTool"
+                       />
+                       <Tool
+                               Name="VCAppVerifierTool"
+                       />
+                       <Tool
+                               Name="VCPostBuildEventTool"
+                       />
+               </Configuration>
+               <Configuration
+                       Name="Release|Win32"
+                       OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+                       IntermediateDirectory="$(ConfigurationName)"
+                       ConfigurationType="1"
+                       UseOfMFC="2"
+                       CharacterSet="1"
+                       WholeProgramOptimization="1"
+                       >
+                       <Tool
+                               Name="VCPreBuildEventTool"
+                       />
+                       <Tool
+                               Name="VCCustomBuildTool"
+                       />
+                       <Tool
+                               Name="VCXMLDataGeneratorTool"
+                       />
+                       <Tool
+                               Name="VCWebServiceProxyGeneratorTool"
+                       />
+                       <Tool
+                               Name="VCMIDLTool"
+                       />
+                       <Tool
+                               Name="VCCLCompilerTool"
+                               Optimization="2"
+                               EnableIntrinsicFunctions="true"
+                               PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
+                               RuntimeLibrary="2"
+                               EnableFunctionLevelLinking="true"
+                               UsePrecompiledHeader="2"
+                               WarningLevel="3"
+                               DebugInformationFormat="3"
+                       />
+                       <Tool
+                               Name="VCManagedResourceCompilerTool"
+                       />
+                       <Tool
+                               Name="VCResourceCompilerTool"
+                       />
+                       <Tool
+                               Name="VCPreLinkEventTool"
+                       />
+                       <Tool
+                               Name="VCLinkerTool"
+                               LinkIncremental="1"
+                               GenerateDebugInformation="true"
+                               SubSystem="1"
+                               OptimizeReferences="2"
+                               EnableCOMDATFolding="2"
+                               TargetMachine="1"
+                       />
+                       <Tool
+                               Name="VCALinkTool"
+                       />
+                       <Tool
+                               Name="VCManifestTool"
+                       />
+                       <Tool
+                               Name="VCXDCMakeTool"
+                       />
+                       <Tool
+                               Name="VCBscMakeTool"
+                       />
+                       <Tool
+                               Name="VCFxCopTool"
+                       />
+                       <Tool
+                               Name="VCAppVerifierTool"
+                       />
+                       <Tool
+                               Name="VCPostBuildEventTool"
+                       />
+               </Configuration>
+       </Configurations>
+       <References>
+       </References>
+       <Files>
+               <Filter
+                       Name="\83\\81[\83\83t\83@\83C\83\8b"
+                       Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+                       UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+                       >
+                       <File
+                               RelativePath=".\ExMODIst.cpp"
+                               >
+                       </File>
+                       <File
+                               RelativePath=".\stdafx.cpp"
+                               >
+                               <FileConfiguration
+                                       Name="Debug|Win32"
+                                       >
+                                       <Tool
+                                               Name="VCCLCompilerTool"
+                                               UsePrecompiledHeader="1"
+                                       />
+                               </FileConfiguration>
+                               <FileConfiguration
+                                       Name="Release|Win32"
+                                       >
+                                       <Tool
+                                               Name="VCCLCompilerTool"
+                                               UsePrecompiledHeader="1"
+                                       />
+                               </FileConfiguration>
+                       </File>
+               </Filter>
+               <Filter
+                       Name="\83w\83b\83_\81\83t\83@\83C\83\8b"
+                       Filter="h;hpp;hxx;hm;inl;inc;xsd"
+                       UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+                       >
+                       <File
+                               RelativePath=".\ExMODIst.h"
+                               >
+                       </File>
+                       <File
+                               RelativePath=".\Resource.h"
+                               >
+                       </File>
+                       <File
+                               RelativePath=".\stdafx.h"
+                               >
+                       </File>
+                       <File
+                               RelativePath=".\targetver.h"
+                               >
+                       </File>
+               </Filter>
+               <Filter
+                       Name="\83\8a\83\\81[\83\83t\83@\83C\83\8b"
+                       Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
+                       UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+                       >
+                       <File
+                               RelativePath=".\ExMODIst.rc"
+                               >
+                       </File>
+               </Filter>
+               <File
+                       RelativePath=".\ReadMe.txt"
+                       >
+               </File>
+       </Files>
+       <Globals>
+       </Globals>
+</VisualStudioProject>
diff --git a/ExMODIst/ExMODIst.vcxproj b/ExMODIst/ExMODIst.vcxproj
new file mode 100644 (file)
index 0000000..9598af8
--- /dev/null
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup Label="ProjectConfigurations">
+    <ProjectConfiguration Include="Debug|Win32">
+      <Configuration>Debug</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|Win32">
+      <Configuration>Release</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+  </ItemGroup>
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{1061424B-BA88-4553-AFB9-5A89717E44D7}</ProjectGuid>
+    <RootNamespace>ExMODIst</RootNamespace>
+    <Keyword>Win32Proj</Keyword>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseOfMfc>false</UseOfMfc>
+    <CharacterSet>Unicode</CharacterSet>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseOfMfc>false</UseOfMfc>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ImportGroup Label="ExtensionSettings">
+  </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <PropertyGroup Label="UserMacros" />
+  <PropertyGroup>
+    <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\</IntDir>
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</IntDir>
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+  </PropertyGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <ClCompile>
+      <Optimization>Disabled</Optimization>
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <MinimalRebuild>true</MinimalRebuild>
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+      <PrecompiledHeader>Use</PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+    </ClCompile>
+    <Link>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <SubSystem>Console</SubSystem>
+      <TargetMachine>MachineX86</TargetMachine>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <ClCompile>
+      <Optimization>MaxSpeed</Optimization>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <PrecompiledHeader>Use</PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+    </ClCompile>
+    <Link>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <SubSystem>Console</SubSystem>
+      <OptimizeReferences>true</OptimizeReferences>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <TargetMachine>MachineX86</TargetMachine>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemGroup>
+    <ClCompile Include="ExMODIst.cpp" />
+    <ClCompile Include="stdafx.cpp">
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
+    </ClCompile>
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="ExMODIst.h" />
+    <ClInclude Include="Resource.h" />
+    <ClInclude Include="stdafx.h" />
+    <ClInclude Include="targetver.h" />
+  </ItemGroup>
+  <ItemGroup>
+    <ResourceCompile Include="ExMODIst.rc" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="ReadMe.txt" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+  <ImportGroup Label="ExtensionTargets">
+  </ImportGroup>
+</Project>
\ No newline at end of file
diff --git a/ExMODIst/ExMODIst.vcxproj.filters b/ExMODIst/ExMODIst.vcxproj.filters
new file mode 100644 (file)
index 0000000..9c6aaca
--- /dev/null
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup>
+    <Filter Include="ソース ファイル">
+      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+    </Filter>
+    <Filter Include="ヘッダー ファイル">
+      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
+    </Filter>
+    <Filter Include="リソース ファイル">
+      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
+      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav</Extensions>
+    </Filter>
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="ExMODIst.cpp">
+      <Filter>ソース ファイル</Filter>
+    </ClCompile>
+    <ClCompile Include="stdafx.cpp">
+      <Filter>ソース ファイル</Filter>
+    </ClCompile>
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="ExMODIst.h">
+      <Filter>ヘッダー ファイル</Filter>
+    </ClInclude>
+    <ClInclude Include="Resource.h">
+      <Filter>ヘッダー ファイル</Filter>
+    </ClInclude>
+    <ClInclude Include="stdafx.h">
+      <Filter>ヘッダー ファイル</Filter>
+    </ClInclude>
+    <ClInclude Include="targetver.h">
+      <Filter>ヘッダー ファイル</Filter>
+    </ClInclude>
+  </ItemGroup>
+  <ItemGroup>
+    <ResourceCompile Include="ExMODIst.rc">
+      <Filter>リソース ファイル</Filter>
+    </ResourceCompile>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="ReadMe.txt" />
+  </ItemGroup>
+</Project>
\ No newline at end of file
diff --git a/ExMODIst/ReadMe.txt b/ExMODIst/ReadMe.txt
new file mode 100644 (file)
index 0000000..52922bf
--- /dev/null
@@ -0,0 +1,2 @@
+Visual Studio 2008でビルドする必要あり。(だったと思う)
+でないと、アプリ起動時にMODIが入っていないとエラーになる(だったと思う)
diff --git a/ExMODIst/Resource.h b/ExMODIst/Resource.h
new file mode 100644 (file)
index 0000000..dcd0136
--- /dev/null
@@ -0,0 +1,17 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Visual C++ generated include file.
+// Used by ExMODIst.rc
+//
+
+#define IDS_APP_TITLE                  103
+
+// \90V\82µ\82¢\83I\83u\83W\83F\83N\83g\82Ì\8e\9f\82Ì\8aù\92è\92l
+//
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE       101
+#define _APS_NEXT_COMMAND_VALUE                40001
+#define _APS_NEXT_CONTROL_VALUE                1000
+#define _APS_NEXT_SYMED_VALUE          101
+#endif
+#endif
diff --git a/ExMODIst/main.cpp b/ExMODIst/main.cpp
new file mode 100644 (file)
index 0000000..d6305e9
--- /dev/null
@@ -0,0 +1,123 @@
+//---------------------------------------------------------------------------
+#include <windows.h>
+#include <oleidl.h>
+#pragma hdrstop
+
+//---------------------------------------------------------------------------
+
+const GUID CLSID_Document = 
+       {0x40942a6c,0x1520,0x4132,{0xbd,0xf8,0xbd,0xc1,0xf7,0x1f,0x54,0x7b}}; 
+
+#define MIDL_DEFINE_GUID(type,name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \
+               const type name = {l,w1,w2,{b1,b2,b3,b4,b5,b6,b7,b8}}
+
+MIDL_DEFINE_GUID(IID, IID_IDocument,0xD4073843,0xA58A,0x469A,0xA8,0xE2,0xCF,0xF3,0xFF,0x77,0xEE,0x4E);
+
+#define        _Inout_
+#define        _In_
+#define        _Out_
+#define        _Deref_out_opt_
+
+struct __POSITION {};
+typedef __POSITION* POSITION;
+
+typedef /* [v1_enum] */ 
+enum WTS_ALPHATYPE
+       {       WTSAT_UNKNOWN   = 0,
+       WTSAT_RGB       = 1,
+       WTSAT_ARGB      = 2
+       }       WTS_ALPHATYPE;
+
+class IFilterChunkValue;
+       
+interface IDocument
+{
+protected:
+       IDocument() : m_refCount(0)
+       {
+       }
+
+public:
+       virtual ~IDocument()
+       {
+       }
+
+       virtual LONG AddRef()
+       {
+               return InterlockedIncrement((long*)&m_refCount);
+       }
+
+       virtual LONG Release()
+       {
+               //__assert__(m_refCount > 0);
+               if (InterlockedDecrement((long*)&m_refCount) == 0)
+               {
+                       delete this;
+                       return 0;
+               }
+
+               return m_refCount;
+       }
+
+       virtual HRESULT LoadFromStream(
+               _Inout_ IStream* pStream,
+               _In_ DWORD grfMode) = 0;
+       virtual void InitializeSearchContent() = 0;
+       virtual void BeginReadChunks() = 0;
+
+       virtual BOOL GetThumbnail(
+               _In_ UINT cx,
+               _Out_ HBITMAP* phbmp,
+               _Out_ WTS_ALPHATYPE* pdwAlpha) = 0;
+
+       virtual void ClearChunkList() = 0;
+       virtual BOOL SetChunkValue(
+               _In_ IFilterChunkValue* value) = 0;
+       virtual BOOL ReadNextChunkValue(
+               _Deref_out_opt_ IFilterChunkValue** value) = 0;
+       virtual void RemoveChunk(
+               _In_ REFCLSID guid,
+               _In_ DWORD pid) = 0;
+       virtual POSITION FindChunk(
+               _In_ REFCLSID guid,
+               _In_ DWORD pid) = 0;
+
+       virtual LPVOID GetContainer() const = 0;
+
+protected:
+       volatile LONG m_refCount;
+};
+
+#pragma argsused
+bool MODIAvail();
+int main(int argc, char* argv[])
+{
+       if (MODIAvail())
+               return 1;
+       return 0;
+}
+
+bool MODIAvail()
+{
+       bool exist = false;
+       HRESULT hr = CoInitialize(0);
+       if (SUCCEEDED(hr)){
+               IDocument *IDobj = NULL;
+               hr = ::CoCreateInstance(CLSID_Document, NULL, CLSCTX_ALL, IID_IDocument, (void**)&IDobj);
+               if (SUCCEEDED(hr)){
+#if 0
+                       hr = IDobj->Create(AsciiToBSTR("H:\\temp\\nishikawat\\amodi\\2014-12-02-151156.bmp"));
+                       if (SUCCEEDED(hr){
+                               
+                       }
+#endif
+                       exist = true;
+                       IDobj->Release();       //TODO: stack\82ð\89ó\82µ\82Ä\82µ\82Ü\82¤
+               }
+       }
+       CoUninitialize();
+
+       return exist;
+}
+
+
diff --git a/ExMODIst/stdafx.cpp b/ExMODIst/stdafx.cpp
new file mode 100644 (file)
index 0000000..35d78ac
--- /dev/null
@@ -0,0 +1,8 @@
+// stdafx.cpp : \95W\8f\80\83C\83\93\83N\83\8b\81[\83h ExMODIst.pch \82Ì\82Ý\82ð
+// \8aÜ\82Þ\83\\81[\83\83t\83@\83C\83\8b\82Í\81A\83v\83\8a\83R\83\93\83p\83C\83\8b\8dÏ\82Ý\83w\83b\83_\81[\82É\82È\82è\82Ü\82·\81B
+// stdafx.obj \82É\82Í\83v\83\8a\83R\83\93\83p\83C\83\8b\8dÏ\82Ý\8c^\8fî\95ñ\82ª\8aÜ\82Ü\82ê\82Ü\82·\81B
+
+#include "stdafx.h"
+
+// TODO: \82±\82Ì\83t\83@\83C\83\8b\82Å\82Í\82È\82­\81ASTDAFX.H \82Å\95K\97v\82È
+// \92Ç\89Á\83w\83b\83_\81[\82ð\8eQ\8fÆ\82µ\82Ä\82­\82¾\82³\82¢\81B
diff --git a/ExMODIst/stdafx.h b/ExMODIst/stdafx.h
new file mode 100644 (file)
index 0000000..53d8bf7
--- /dev/null
@@ -0,0 +1,14 @@
+// stdafx.h : \95W\8f\80\82Ì\83V\83X\83e\83\80 \83C\83\93\83N\83\8b\81[\83\83t\83@\83C\83\8b\82Ì\83C\83\93\83N\83\8b\81[\83\83t\83@\83C\83\8b\81A\82Ü\82½\82Í
+// \8eQ\8fÆ\89ñ\90\94\82ª\91½\82­\81A\82©\82Â\82 \82Ü\82è\95Ï\8dX\82³\82ê\82È\82¢\81A\83v\83\8d\83W\83F\83N\83g\90ê\97p\82Ì\83C\83\93\83N\83\8b\81[\83\83t\83@\83C\83\8b
+// \82ð\8bL\8fq\82µ\82Ü\82·\81B
+//
+
+#pragma once
+
+#include "targetver.h"
+
+#include <stdio.h>
+#include <tchar.h>
+
+
+// TODO: \83v\83\8d\83O\83\89\83\80\82É\95K\97v\82È\92Ç\89Á\83w\83b\83_\81[\82ð\82±\82±\82Å\8eQ\8fÆ\82µ\82Ä\82­\82¾\82³\82¢\81B
diff --git a/ExMODIst/targetver.h b/ExMODIst/targetver.h
new file mode 100644 (file)
index 0000000..a983fa0
--- /dev/null
@@ -0,0 +1,24 @@
+#pragma once
+
+// \88È\89º\82Ì\83}\83N\83\8d\82Í\81A\8dÅ\92á\8cÀ\95K\97v\82È\83v\83\89\83b\83g\83t\83H\81[\83\80\82ð\92è\8b`\82µ\82Ü\82·\81B\8dÅ\92á\8cÀ\95K\97v\82È\83v\83\89\83b\83g\83t\83H\81[\83\80\82Æ\82Í\81A
+// \83A\83v\83\8a\83P\81[\83V\83\87\83\93\82ð\8eÀ\8ds\82·\82é\82½\82ß\82É\95K\97v\82È\8b@\94\\82ð\94õ\82¦\82½\8dÅ\82à\8cÃ\82¢\83o\81[\83W\83\87\83\93\82Ì Windows \82â Internet Explorer \82È\82Ç
+// \82ð\82¢\82¢\82Ü\82·\81B\82±\82ê\82ç\82Ì\83}\83N\83\8d\82Í\81A\8ew\92è\82µ\82½\83o\81[\83W\83\87\83\93\82Æ\81A\82»\82ê\88È\91O\82Ì\83o\81[\83W\83\87\83\93\82Ì\83v\83\89\83b\83g\83t\83H\81[\83\80\8fã\82Å\97\98\97p\82Å\82«\82é\82·\82×\82Ä\82Ì\8b@\94\\82ð\97L\8cø\82É\82·\82é\82±\82Æ\82É\82æ\82Á\82Ä 
+// \93®\8dì\82µ\82Ü\82·\81B
+
+// \89º\82Å\8ew\92è\82³\82ê\82½\92è\8b`\82Ì\91O\82É\91Î\8fÛ\83v\83\89\83b\83g\83t\83H\81[\83\80\82ð\8ew\92è\82µ\82È\82¯\82ê\82Î\82È\82ç\82È\82¢\8fê\8d\87\81A\88È\89º\82Ì\92è\8b`\82ð\95Ï\8dX\82µ\82Ä\82­\82¾\82³\82¢\81B
+// \88Ù\82È\82é\83v\83\89\83b\83g\83t\83H\81[\83\80\82É\91Î\89\9e\82·\82é\92l\82É\8aÖ\82·\82é\8dÅ\90V\8fî\95ñ\82É\82Â\82¢\82Ä\82Í\81AMSDN \82ð\8eQ\8fÆ\82µ\82Ä\82­\82¾\82³\82¢\81B
+#ifndef WINVER                          // \8dÅ\92á\8cÀ\95K\97v\82È\83v\83\89\83b\83g\83t\83H\81[\83\80\82ª Windows Vista \82Å\82 \82é\82±\82Æ\82ð\8ew\92è\82µ\82Ü\82·\81B
+#define WINVER 0x0600           // \82±\82ê\82ð Windows \82Ì\91¼\82Ì\83o\81[\83W\83\87\83\93\8cü\82¯\82É\93K\90Ø\82È\92l\82É\95Ï\8dX\82µ\82Ä\82­\82¾\82³\82¢\81B
+#endif
+
+#ifndef _WIN32_WINNT            // \8dÅ\92á\8cÀ\95K\97v\82È\83v\83\89\83b\83g\83t\83H\81[\83\80\82ª Windows Vista \82Å\82 \82é\82±\82Æ\82ð\8ew\92è\82µ\82Ü\82·\81B
+#define _WIN32_WINNT 0x0600     // \82±\82ê\82ð Windows \82Ì\91¼\82Ì\83o\81[\83W\83\87\83\93\8cü\82¯\82É\93K\90Ø\82È\92l\82É\95Ï\8dX\82µ\82Ä\82­\82¾\82³\82¢\81B
+#endif
+
+#ifndef _WIN32_WINDOWS          // \8dÅ\92á\8cÀ\95K\97v\82È\83v\83\89\83b\83g\83t\83H\81[\83\80\82ª Windows 98 \82Å\82 \82é\82±\82Æ\82ð\8ew\92è\82µ\82Ü\82·\81B
+#define _WIN32_WINDOWS 0x0410 // \82±\82ê\82ð Windows Me \82Ü\82½\82Í\82»\82ê\88È\8d~\82Ì\83o\81[\83W\83\87\83\93\8cü\82¯\82É\93K\90Ø\82È\92l\82É\95Ï\8dX\82µ\82Ä\82­\82¾\82³\82¢\81B
+#endif
+
+#ifndef _WIN32_IE                       // \8dÅ\92á\8cÀ\95K\97v\82È\83v\83\89\83b\83g\83t\83H\81[\83\80\82ª Internet Explorer 7.0 \82Å\82 \82é\82±\82Æ\82ð\8ew\92è\82µ\82Ü\82·\81B
+#define _WIN32_IE 0x0700        // \82±\82ê\82ð IE \82Ì\91¼\82Ì\83o\81[\83W\83\87\83\93\8cü\82¯\82É\93K\90Ø\82È\92l\82É\95Ï\8dX\82µ\82Ä\82­\82¾\82³\82¢\81B
+#endif
diff --git a/ExMODIstBCC/ExMODIst.bpf b/ExMODIstBCC/ExMODIst.bpf
new file mode 100644 (file)
index 0000000..d2eea08
--- /dev/null
@@ -0,0 +1,5 @@
+USEUNIT("main.cpp");\r
+//---------------------------------------------------------------------------\r
+This file is used by the project manager only and should be treated like the project file\r
+
+\rmain
\ No newline at end of file
diff --git a/ExMODIstBCC/ExMODIst.bpr b/ExMODIstBCC/ExMODIst.bpr
new file mode 100644 (file)
index 0000000..8b81150
--- /dev/null
@@ -0,0 +1,114 @@
+<?xml version='1.0' encoding='utf-8' ?>
+<!-- C++Builder XML Project -->
+<PROJECT>
+  <MACROS>
+    <VERSION value="BCB.05.03"/>
+    <PROJECT value=".\obj\ExMODIst.exe"/>
+    <OBJFILES value="main.obj"/>
+    <RESFILES value=""/>
+    <DEFFILE value=""/>
+    <RESDEPEN value="$(RESFILES)"/>
+    <LIBFILES value=""/>
+    <LIBRARIES value=""/>
+    <SPARELIBS value=""/>
+    <PACKAGES value="Vcl50.bpi Vclx50.bpi bcbsmp50.bpi Qrpt50.bpi Vcldb50.bpi Vclbde50.bpi 
+      ibsmp50.bpi vcldbx50.bpi TeeUI50.bpi TeeDB50.bpi Tee50.bpi TeeQR50.bpi 
+      VCLIB50.bpi bcbie50.bpi vclie50.bpi Inetdb50.bpi Inet50.bpi NMFast50.bpi 
+      dclocx50.bpi bcb2kaxserver50.bpi TNTLIBR.bpi dclusr50.bpi"/>
+    <PATHCPP value=".;"/>
+    <PATHPAS value=".;"/>
+    <PATHRC value=".;"/>
+    <PATHASM value=".;"/>
+    <DEBUGLIBPATH value="$(BCB)\lib\debug"/>
+    <RELEASELIBPATH value="$(BCB)\lib\release"/>
+    <LINKER value="tlink32"/>
+    <USERDEFINES value=""/>
+    <SYSDEFINES value="NO_STRICT;_NO_VCL"/>
+    <MAINSOURCE value="ExMODIst.bpf"/>
+    <INCLUDEPATH value="$(BCB)\include;$(BCB)\include\vcl"/>
+    <LIBPATH value="$(BCB)\Projects\Lib;$(BCB)\lib\obj;$(BCB)\lib"/>
+    <WARNINGS value="-w-par"/>
+  </MACROS>
+  <OPTIONS>
+    <CFLAG1 value="-O2 -H=$(BCB)\lib\vcl50.csm -Hc -Vx -Ve -f- -X- -a8 -5 -b- -k- -vi -tWC 
+      -tWM -c"/>
+    <PFLAGS value="-$Y- -$L- -$D- -v -JPHNE -M"/>
+    <RFLAGS value=""/>
+    <AFLAGS value="/mx /w2 /zn"/>
+    <LFLAGS value="-D&quot;&quot; -ap -Tpe -x -Gn"/>
+  </OPTIONS>
+  <LINKER>
+    <ALLOBJ value="c0x32.obj $(OBJFILES)"/>
+    <ALLRES value="$(RESFILES)"/>
+    <ALLLIB value="$(LIBFILES) $(LIBRARIES) import32.lib cw32mt.lib"/>
+  </LINKER>
+  <IDEOPTIONS>
+[Version Info]
+IncludeVerInfo=0
+AutoIncBuild=0
+MajorVer=1
+MinorVer=0
+Release=0
+Build=0
+Debug=0
+PreRelease=0
+Special=0
+Private=0
+DLL=0
+Locale=1041
+CodePage=932
+
+[Version Info Keys]
+CompanyName=
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+Comments=
+
+[HistoryLists\hlIncludePath]
+Count=1
+Item0=$(BCB)\include;$(BCB)\include\vcl
+
+[HistoryLists\hlLibraryPath]
+Count=1
+Item0=$(BCB)\Projects\Lib;$(BCB)\lib\obj;$(BCB)\lib
+
+[HistoryLists\hlDebugSourcePath]
+Count=1
+Item0=$(BCB)\source\vcl
+
+[HistoryLists\hlConditionals]
+Count=1
+Item0=_DEBUG
+
+[HistoryLists\hlFinalOutputDir]
+Count=2
+Item0=.\obj\
+Item1=.\obj
+
+[Debugging]
+DebugSourceDirs=$(BCB)\source\vcl
+
+[Parameters]
+RunParams=
+HostApplication=
+RemoteHost=
+RemotePath=
+RemoteDebug=0
+
+[Compiler]
+ShowInfoMsgs=0
+LinkDebugVcl=0
+LinkCGLIB=0
+
+[Language]
+ActiveLang=
+ProjectLang=
+RootDir=
+  </IDEOPTIONS>
+</PROJECT>
\ No newline at end of file
diff --git a/ExMODIstBCC/main.cpp b/ExMODIstBCC/main.cpp
new file mode 100644 (file)
index 0000000..6818e87
--- /dev/null
@@ -0,0 +1,39 @@
+//---------------------------------------------------------------------------
+#include <windows.h>
+#pragma hdrstop
+#include "MDIVWCTL.tlh"
+
+//---------------------------------------------------------------------------
+#pragma argsused
+bool MODIAvail();
+int main(int argc, char* argv[])
+{
+       if (MODIAvail())
+               return 1;
+       return 0;
+}
+
+bool MODIAvail()
+{
+       bool exist = false;
+       HRESULT hr = CoInitialize(0);
+       if (SUCCEEDED(hr)){
+               IDocument *IDobj = NULL;
+               hr = ::CoCreateInstance(CLSID_Document, NULL, CLSCTX_ALL, IID_IDocument, (void**)&IDobj);
+               if (SUCCEEDED(hr)){
+#if 0
+                       hr = IDobj->Create(AsciiToBSTR("H:\\temp\\nishikawat\\amodi\\2014-12-02-151156.bmp"));
+                       if (SUCCEEDED(hr){
+                               
+                       }
+#endif
+                       exist = true;
+                       IDobj->Release();
+               }
+       }
+       CoUninitialize();
+
+       return exist;
+}
+
+
diff --git a/MK.BAT b/MK.BAT
new file mode 100644 (file)
index 0000000..12bcf3e
--- /dev/null
+++ b/MK.BAT
@@ -0,0 +1,80 @@
+@echo off
+echo/
+echo \8a®\91S\94Å\83p\83b\83P\81[\83W\82ð\8dì\90¬\82µ\82Ü\82·
+echo/
+echo ./dchook/dchook.dll\82ð\8f\80\94õ
+echo ./dchooktest/dchooktest.exe\82ð\8f\80\94õ
+echo ./vxd/hk95d.vxd\82ð\8f\80\94õ
+pause
+set TZ=JST-9
+
+copy .\dchook\dchook.dll .\DKPPHK.DLL /y
+copy .\VxD\hk95d.vxd .\HK95D.VXD /y
+copy .\dchooktest\dchooktest.exe .\DKPP.EXE /y
+
+touch -d12/09/02 -t01:11:00 -c DKPP.EXE DKPPHK.DLL HK95D.VXD README.TXT
+
+del dchook-1.11.lzh > nul
+
+lha32 a dchook-1.11.lzh /x README.TXT
+lha32 a dchook-1.11.lzh /x ./dchook/dchook.mak ./dchook/dchook.cpp ./dchook/dchook.h ./dchook/dchook.rc ./dchook/dchook.def
+lha32 a dchook-1.11.lzh /x ./dchooktest/dchooktest.bpr ./dchooktest/dchooktest.mak
+lha32 a dchook-1.11.lzh /x ./dchooktest/*.h ./dchooktest/*.cpp ./dchooktest/dchooktest.rc ./dchooktest/*.dfm ./dchooktest/dkpp.bmp ./dchooktest/popenable.bmp ./dchooktest/popdisable.bmp ./dchooktest/popenable.h ./dchooktest/popdisable.h ./dchooktest/icon.rc
+lha32 a dchook-1.11.lzh /x ./vxd/makefile ./vxd/hk95d.def ./vxd/*.h ./vxd/*.asm ./vxd/*.c
+
+perl -S chgini.pl dchook.ind Exe Name DKPP111.EXE
+perl -S chgini.pl dchook.ind Date Year 2002
+perl -S chgini.pl dchook.ind Date Month 12
+perl -S chgini.pl dchook.ind Date Day 09
+perl -S chgini.pl dchook.ind Date Hour 01
+perl -S chgini.pl dchook.ind Date Minute 11
+perl -S chgini.pl dchook.ind Date Second 00
+perl -S chgini.pl dchook.ind Back 8 "|Doko Pop! Ver.1.11"
+perl -S chgini.pl dchook.ind Back 12 "|Doko Pop! Ver.1.11"
+
+rem IND\82Ì\8eÀ\8ds
+k:\wbin\makeset\makeset .\dchook.ind
+
+rem lha32 a DKPP111.EXE DKPP.TXT DKPP.EXE DKPPHK.DLL HK95D.VXD
+ren DKPP111.EXE DKPP111.EXE
+touch -d12/09/02 -t01:11:00 -c DKPP111.EXE
+
+echo/
+echo \95Û\91\97p\88³\8fk\83t\83@\83C\83\8b\82ð\8dì\90¬\82µ\82Ü\82·
+echo/
+rem pause
+
+dir dchook-1.11.lzh
+
+echo/
+echo \8cö\8aJ\97p\83t\83@\83C\83\8b\82ð\8dX\90V\82µ\82Ü\82·
+echo/
+rem pause
+
+perl -S -i.bak filestamp.pl DKPPu.TXT
+del DKPPu.TXT.bak
+
+echo/
+echo Web\97p\82Ì\83t\83@\83C\83\8b\82ð\8dX\90V\82µ\82Ü\82·
+echo/
+pause
+
+copy dchook-1.11.lzh S:\Web\NIFTY\
+copy dchook-1.11.lzh S:\down\MySoft
+del S:\Web\NIFTY\dchook-1.10.lzh
+copy DKPP111.EXE S:\Web\NIFTY\
+copy DKPP111.EXE S:\down\MySoft
+del S:\Web\NIFTY\DKPP110.EXE
+
+copy S:\Web\NIFTY\pdic-download.var vars.dat
+perl -S repvars.pl S:\Web\NIFTY\pdic-download0.html > S:\Web\NIFTY\pdic-download.html
+copy vars.dat S:\Web\NIFTY\pdic-download.var
+
+rem echo [del] >> S:\Web\NIFTY\ftp.ctl
+rem echo dchook-1.10.lzh >> S:\Web\NIFTY\ftp.ctl
+rem echo DKPP110.EXE >> S:\Web\NIFTY\ftp.ctl
+rem echo [include] >> S:\Web\NIFTY\ftp.ctl
+rem echo DKPP111.EXE >> S:\Web\NIFTY\ftp.ctl
+rem echo dchook-1.11.lzh >> S:\Web\NIFTY\ftp.ctl
+
+
diff --git a/MKU.BAT b/MKU.BAT
new file mode 100644 (file)
index 0000000..f013dfc
--- /dev/null
+++ b/MKU.BAT
@@ -0,0 +1,74 @@
+@echo off
+echo/
+echo \8a®\91S\94Å\83p\83b\83P\81[\83W\82ð\8dì\90¬\82µ\82Ü\82·
+echo/
+echo \81¡\8am\94F\8e\96\8d\80
+echo \81E./dchooktest/dchooktest.exe\82ð\8f\80\94õ(USE_UNICODE defined)
+echo \81E\83o\81[\83W\83\87\83\93\94Ô\8d\86\81F.bpr\82ÆUtil.cpp(StrVersion, VersionValue)\82Ì\97¼\95û\82ª\95K\97v
+echo \81ERelease Build?
+echo \81EVisualStudio2008\82Åbuild\82µ\82½\82©\81H for W2K
+pause
+set TZ=JST-9
+
+echo/
+echo Copy the binary to the ind directory.
+echo/
+pause
+
+make copy_bin
+
+rem touch -d10/06/16 -t02:00:00 -c ind\DKPU.EXE ind\DKPUHK.DLL
+
+rem dkpu.iss\82Ì\8dX\90V
+perl change_iss.pl ind\dkpu.iss Setup AppVerName "DokoPop! 2.023" > ind\dkpu.iss.new
+del ind\dkpu.iss.old
+ren ind\dkpu.iss dkpu.iss.old
+ren ind\dkpu.iss.new dkpu.iss
+
+rem Installer \82Ì\8eÀ\8ds
+make buildis
+
+echo/
+echo Press Enter key after installer made.
+echo/
+pause
+
+copy ind\Output\setup.EXE DKPU2023.exe
+dir DKPU2023.exe
+
+rem lha32 a DKPU2023.exe DKPU.TXT DKPU.EXE DKPUHK.DLL
+ren DKPU2023.exe DKPU2023.exe
+rem touch -d10/06/16 -t02:00:00 -c DKPU2023.exe
+
+echo/
+echo \83\\81[\83X\83t\83@\83C\83\8b\82ðzip\82µ\82Ü\82·
+echo/
+pause
+
+make zip_src
+copy src.zip src-2.023.zip
+rem copy src-2.023.zip zip
+
+echo/
+echo \8cö\8aJ\97p\83t\83@\83C\83\8b\82ð\8dX\90V\82µ\82Ü\82·
+echo/
+rem pause
+
+perl -S -i.bak filestamp.pl DKPUu.TXT
+del DKPUu.TXT.bak
+
+echo/
+echo Web\97p\82Ì\83t\83@\83C\83\8b\82ð\8dX\90V\82µ\82Ü\82·
+echo/
+pause
+
+rem copy DKPU2023.exe S:\Web\NIFTY\
+rem del S:\Web\NIFTY\DKPU2022.EXE
+copy DKPU2023.exe S:\web\sakura-pdic\cgi-bin\download\files\
+del S:\web\sakura-pdic\cgi-bin\download\files\DKPU2022.EXE
+
+rem echo [del] >> S:\Web\NIFTY\ftp.ctl
+rem echo DKPU2022.EXE >> S:\Web\NIFTY\ftp.ctl
+rem echo [include] >> S:\Web\NIFTY\ftp.ctl
+rem echo DKPU2023.exe >> S:\Web\NIFTY\ftp.ctl
+
diff --git a/Makefile b/Makefile
new file mode 100644 (file)
index 0000000..d0afde4
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,39 @@
+#!make
+
+CPI=cp -i -p -u
+
+all:
+
+copy_release:
+       copy DCHook\Release\DCHook.dll DCHookTest\DKPUHK.DLL
+#      copy DCHook\Win32\Release\DCHook.dll DCHookTest\DKPUHK.DLL
+#      copy DCHook\x64\Release\DCHook.dll DCHookTest\DKPUHK64.DLL
+#      copy DCHook64\dchk64\x64\Release\dchk64.exe DCHooktest\DKPUHK64.exe
+
+copy_bin:
+       echo DKPUHK.DLL(DCHOOK.DLL)\82ÍVS2008\82Å\8dì\90¬\82µ\82½\82©\81H
+       pause
+#      $(CPI) DCHook\Win32\Release\DCHook.dll ind\DKPUHK.dll
+#      $(CPI) DCHook\x64\Release\DCHook.dll ind\DKPUHK64.dll
+#      $(CPI) bin\DKPUHK.DLL ind\DKPUHK.dll
+#      $(CPI) DCHook64\dchk64\x64\Release\dchk64.exe ind\DKPUHK64.exe
+       $(CPI) DCHookTest\DKPUHK.dll ind\DKPUHK.dll
+       $(CPI) DCHookTest\DKPUHK64.DLL ind\DKPUHK64.dll
+       $(CPI) DCHookTest\DKPUHK64.exe ind\DKPUHK64.exe
+       $(CPI) bin\amodi.exe ind\amodi.exe
+       $(CPI) bin\Interop.MODI.dll ind\Interop.MODI.dll
+       $(CPI) bin\ExMODIst.exe ind\ExMODIst.exe
+       $(CPI) DCHookTest\DCHookTest.exe ind\DKPu.exe
+       $(CPI) DKPU.TXT ind\DKPu.txt
+
+buildis:
+       cd ind
+       start dkpu.iss
+
+zip_src:
+       zip -r src . -i *.h *.c *.cpp *.cs *.dfm *.bpr *.bpf *.bpg *.rc *.ico *.bmp *.png *.txr *.ctt *.bat *.ind *.iss *.tpl *.manifest *.txt *.sln *.vcproj *.vcxproj *.user
+       zip -r src-amodi \src\amodi -i *.h *.c *.cpp *.cs *.dfm *.bpr *.bpf *.bpg *.rc *.ico *.bmp *.png *.txr *.ctt *.bat *.ind *.iss *.tpl *.manifest *.txt *.sln *.vcproj *.vcxproj *.user
+
+deploy:
+       mktplu
+       mku
diff --git a/README.TXT b/README.TXT
new file mode 100644 (file)
index 0000000..8db0ac2
--- /dev/null
@@ -0,0 +1,334 @@
+==========================================================================
+                        DCHook sample program
+==========================================================================
+Introduction -------------------------------------------------------------
+
+DCHook\82Í\81AWindows\82É\82¨\82¢\82Ä\94C\88Ó\82ÌWindow\82Ì\94C\88Ó\82Ì\8dÀ\95W\88Ê\92u\82©\82ç
+\82»\82±\82É\95`\89æ\82³\82ê\82Ä\82¢\82é\83e\83L\83X\83g\82ð\8fE\82Á\82Ä\82­\82é\83v\83\8d\83O\83\89\83\80\82Å\82·\81B
+\82¿\82å\82Á\82Æ\82â\82Á\82Ä\82Ý\82½\82ç\8aÈ\92P\82É\93®\82¢\82½\82Ì\82Å\81A\8cö\8aJ\82·\82é\82±\82Æ\82É\82µ\82Ü\82µ\82½\81B
+
+\82±\82Ì\83v\83\8d\83O\83\89\83\80\82Ì\89\9e\97p\82Æ\82µ\82Ä\82Í\81A
+\81E\94C\88Ó\82Ì\83E\83B\83\93\83h\83E\82Ì\83e\83L\83X\83g\82ð\8fE\82¤
+\81E\91S\83E\83B\83\93\83h\83E\82Ì\83e\83L\83X\83g\82ðgrep\82·\82é
+\81E\83J\81[\83\\83\8b\88Ê\92u\82Ì\83e\83L\83X\83g\82ð\8fE\82¤
+\82Æ\82¢\82Á\82½\88ê\95\97\95Ï\82í\82Á\82½\82±\82Æ\82ª\82Å\82«\82Ü\82·\81B
+\82±\82Ì\83v\83\8d\83O\83\89\83\80\82É\82Í\8eQ\8dl\82Æ\82µ\82Ä\81ADokoPop\82Æ\82¢\82¤\83T\83\93\83v\83\8b\83v\83\8d\83O\83\89\83\80\82ð
+\93Y\95t\82µ\82Ä\82 \82è\82Ü\82·\81B
+
+install ------------------------------------------------------------------
+
+\88³\8fk\83t\83@\83C\83\8b\82ð\93K\93\96\82È\82Æ\82±\82ë\82É\89ð\93\80\82µ\82Ä\82­\82¾\82³\82¢\81B
+\83f\83B\83\8c\83N\83g\83\8a\95t\82«\82Å\89ð\93\80\82·\82é\95K\97v\82ª\82 \82è\82Ü\82·\81B
+
+\93Y\95t\83t\83@\83C\83\8b -------------------------------------------------------------
+
+target\82É\82È\82é\82à\82Ì\81F
+
+dchook.dll (NT/2K\94Å or 9x\94Å)
+hk95d.vxd  (9x\90ê\97p)
+dchooktest.exe (NT/2K\82Æ9x8\8b¤\97p)
+
+\95K\97v\82È\8aJ\94­\8aÂ\8b« -----------------------------------------------------------
+C++ Builder 5
+Visual C++ 6.0
+Windows Device Driver Kit (DDK) for Windows 98
+
+\8dì\90¬\95û\96@ -----------------------------------------------------------------
+
+--------------------------------
+dchook.dll
+--------------------------------
+\95K\97v\82È\8aÂ\8b«\81F
+Visual C++
+
+\8dì\90¬\95û\96@\81F
+nmake -fdchook.mak
+
+--------------------------------
+hk95d.vxd
+--------------------------------
+\95K\97v\82È\8aÂ\8b«
+Visual C++, DDK for Win98
+
+\95Ï\8dX\89Ó\8f\8a\81F
+makefile
+INC32\82ðDDK\82Ìroot path\82É(e:\98ddk\82È\82Ç)
+
+\8dì\90¬\95û\96@\81F
+nmake
+\81¦\82±\82Ì\8eÀ\8ds\91O\82ÉVisual-C++\82¨\82æ\82ÑDDK\82Ì\8aÂ\8b«\82ª\90Ý\92è\82³\82ê\82Ä\82¢\82é\95K\97v\82ª\82 \82è\82Ü\82·\81B
+\81@\83o\83b\83`\83t\83@\83C\83\8b\82Å\8aÂ\8b«\90Ý\92è\82·\82é\82æ\82¤\82É\82È\82Á\82Ä\82¢\82é\8fê\8d\87\82Í\81A
+\81@\8dì\90¬\91O\82É\83o\83b\83`\83t\83@\83C\83\8b\82ð\8eÀ\8ds\82µ\82Ä\82­\82¾\82³\82¢\81B
+\81@\81ivcvars32.bat\81Asetenv.bat e:\98ddk \82Æ\82¢\82Á\82½\8a´\82\82Å
+\81@\81¨\8fÚ\82µ\82­\82ÍVisual-C++\81ADDK\82É\95t\91®\82Ì\90à\96¾\8f\91\82ð\8eQ\8fÆ\81j
+
+--------------------------------
+dchooktest.exe
+--------------------------------
+\95K\97v\82È\8aÂ\8b«\81F
+C++ Builder 5
+
+\95Ï\8dX\89Ó\8f\8a\81F
+\93Á\82É\82È\82µ
+\81¦DEBUG\82ðdefine\82·\82é\82Æ\81ADEBUG\97p\82Ì\93®\8dì\82É\82È\82è\82Ü\82·\81B
+
+\8dì\90¬\95û\96@\81F
+dchooktest.bpr\82ðC++Builder\82Å\8aJ\82¢\82Ä\82­\82¾\82³\82¢\81B
+C++Builder4\82Å\82à\82Å\82«\82é\82©\82à\81A\82Æ\8ev\82Á\82Ä C++Builder4\88È\91O\97p\82É
+dchooktest.mak\82à\93Y\95t\82µ\82Ä\82 \82è\82Ü\82·\81B\91½\8f­\82Ì\95Ï\8dX\82Å\8eg\82¦\82é\82©\82à\82µ\82ê\82Ü\82¹\82ñ\81B
+
+\82 \82Æ\82Í\81A\83\81\83j\83\85\81[\82©\82ç Project | \8dÄ\8d\\92\82Å\8dì\90¬\82µ\82Ü\82·\81B
+
+\8eÀ\8ds\81F
+dchooktest.exe\82ð\8eÀ\8ds\82µ\82Ü\82·\81B
+
+\81\9a\92\8d\88Ó\93_\81F
+DCHookTest.exe\82ªLoad\82·\82éDLL\82Í\81A
+DKPPHK.DLL -> DCHOOK.DLL
+\82Ì\8f\87\94Ô\82Å\90æ\82É\8c©\82Â\82©\82Á\82½\95û\82ðload\82·\82é\8ed\97l\82É\82È\82Á\82Ä\82¢\82Ü\82·\81B
+DEBUG\82ðdefine\82µ\82½\82Æ\82«\82Í\81ADCHOOK.DLL\82Ì\82Ý\82ðload\82µ\82æ\82¤\82Æ\82µ\82Ü\82·\81B
+
+\83v\83\8d\83O\83\89\83\80\90à\96¾ -----------------------------------------------------------
+
+\88ê\94Ô\96ï\89î\82È\82à\82Ì\82Í\81Adchook.cpp\82Å\82µ\82å\82¤\81B
+\8e\8e\8ds\8dö\8cë\82µ\82È\82ª\82ç\82à\92Z\8e\9e\8aÔ\82Å\88ê\8bC\82É\8f\91\82«\8fã\82°\82½\82à\82Ì\82Å\82·\82Ì\82Å\81A
+\82©\82È\82è\89\98\82­\82È\82Á\82Ä\82¢\82Ü\82·\81B
+#define\82É\82æ\82éswitch\82É\82Í\81A\90F\82ñ\82È\91g\82Ý\8d\87\82í\82¹\82ª\82 \82è\82Ü\82·\82ª\81A
+\8c»\8fó\88È\8aO\82Ì\90Ý\92è\82É\82·\82é\82Æ\90³\8fí\82É\93®\8dì\82µ\82È\82©\82Á\82½\82è\81A
+compile\82³\82¦\82à\82Å\82«\82È\82¢\82Í\82¸\82Å\82·\81B\82¾\82Á\82½\82ç\81A\90®\97\9d\82µ\82È\82³\82¢\81I
+\82Æ\8c¾\82í\82ê\82»\82¤\82Å\82·\82ª\81A\8d¡\8cã\95K\97v\82Æ\82È\82é\82Æ\82±\82ë\82ª\82 \82é\82©\82à\82µ\82ê\82È\82¢\82Ì\82Å\81A
+\82»\82Ì\82Ü\82Ü\82É\82µ\82Ä\82 \82è\82Ü\82·\81B
+
+\93®\8dì\8c´\97\9d\82Æ\82µ\82Ä\82Í\81A\83e\83L\83X\83g\82ð\8eæ\93¾\82µ\82½\82¢window\82É\91Î\82µ\82Ä
+\8dÄ\95`\89æ\96½\97ß\82ð\91\97\82è\81A\8dÄ\95`\89æ\92\86\82Ì\83e\83L\83X\83g\95`\89æ\8aÖ\90\94\82Ì\93à\97e\82ð
+\89¡\8eæ\82è\82·\82é\82±\82Æ\82Å\8fE\82Á\82Ä\82«\82Ü\82·\81B
+
+\8dÅ\8f\89\8dì\82è\8en\82ß\82½\8d \82Í\81AWindows\82©\82çDC\82ð\93n\82µ\82Ä\82¢\82é\8aÖ\90\94\82ðhook\82µ\81A
+DC\82ðmetafile\82Å\8dÄ\90\82·\82ê\82Î\8aÈ\92P\82\82á\82È\82¢\82©\81H\82Æ\8ev\82Á\82Ä\82â\82Á\82Ä\82Ý\82Ü\82µ\82½\81B
+\82»\82¤\82µ\82½\82ç\82 \82Á\82¯\82È\82­\93®\82¢\82½\82Ì\82Å\82·\82ª\81A\95Ê\82Ìapplication\82Å\82â\82Á\82Ä\82Ý\82é\82Æ
+\82¤\82Ü\82­\93®\82©\82È\82¢\82±\82Æ\82ª\82 \82è\82Ü\82µ\82½\81B
+\8c´\88ö\82Í\81ACreateCompatibleBitmap\82Åbitmap\82ð\8dì\90¬\82µ\81A\82»\82±\82Ö\88ê\92U\95`\89æ
+\82µ\82Ä\82©\82ç\81ABitBlt\82Åwindow\82É\93\\82è\95t\82¯\82éapplication\82ª\82 \82Á\82½\82©\82ç\82Å\82·\81B
+\82»\82¤\82È\82é\82Æ\81ADC\82¾\82¯\82Å\82Í\83e\83L\83X\83g\95`\89æ\8fî\95ñ\82ª\93¾\82ç\82ê\82Ü\82¹\82ñ\82Ì\82Å\81A
+\95K\97v\82Ètext\95`\89æ\8aÖ\90\94\82ðhook\82µ\82Ä\82â\82é\95K\97v\82ª\82 \82è\82Ü\82·\81B
+(\82Ù\82©\82É\82àBeginPaint()\82Å\93n\82³\82ê\82éDC\82Å\82Í\82È\82­\81AGetDC()\82Å
+\93¾\82½DC\82É\91Î\82µ\82Ä\95`\89æ\82µ\82Ä\82¢\82éapplicaton\82É\91Î\82µ\82Ä\82à\82¤\82Ü\82­\82¢\82«\82Ü\82¹\82ñ\82Å\82µ\82½)
+
+\82±\82Ì\91O\82É\82±\82Ìhook\82Ì\95û\96@\82Å\82·\82ª\81ANT\82Æ9x\82Å\82Í\88Ù\82È\82è\82Ü\82·\81B
+NT\82Í\8aeapplication\82ª\93Æ\97§\82Ìmemory\8bó\8aÔ\82Å\82 \82è\81Auser32.dll,gdi32.dll\82à
+application\96\88\82Ìmemory\8bó\8aÔ\82É\91\8dÝ\82µ\82Ä\82¢\82é\82Ì\82Å\82·\82ª\81A9x\82Å\82Í\81A
+\82¢\82«\82È\82è\8b¤\97Lmemory\82Ö\8ds\82Á\82Ä\82µ\82Ü\82Á\82Ä\82¢\82é\82Ì\82Å\81A\8aÈ\92P\82É\82Íhook\82Å\82«\82Ü\82¹\82ñ\81B
+
+API\82Ìhook\95û\96@\82Í\81A\83A\83X\83L\81[\82©\82ç\8fo\94Å\82³\82ê\82Ä\82¢\82é\81uAdvanced Windows\81v
+\82ð\8eQ\8dl\82É\82µ\82Ü\82µ\82½\81B
+http://www.amazon.co.jp/exec/obidos/ASIN/4756138055/pdichomepage-22
+\82±\82±\82ÉAPI\83t\83b\83N\82Ì\90à\96¾\82ª\8fÚ\8d×\82É\8bL\8fq\82³\82ê\82Ä\82¢\82Ü\82·\81B
+\82µ\82©\82µ\81A\82±\82Ì\95û\96@\82ð\92m\82é\82Ü\82Å\82Í Hook\90æ\82Ì\83A\83h\83\8c\83X\82ð\92¼\90Ú\8f\91\82«\8a·\82¦\82é\82Æ\82¢\82¤
+\8aë\8c¯\82È\95û\96@\82ð\82â\82Á\82Ä\82¢\82Ü\82µ\82½\81B\82Â\82Ü\82è Advanced Windows\82É\8bL\8fq\82³\82ê\82Ä\82¢\82é
+\82P\94Ô\96Ú\82Ì\95û\96@\82Å\82·\82Ë\81BNT\8cn\82ÌOS\82È\82ç\82Ù\82Ú\96â\91è\82È\82­\93®\8dì\82·\82é\82Ì\82Å\82·\82ª\81A
+9x\8cn\82Í\97á\8aO\82ª\82Ç\82¤\82µ\82Ä\82à\94­\90\82µ\82Ä\82µ\82Ü\82¢\82Ü\82·\81B
+\82Æ\82¢\82¤\82±\82Æ\82Å\81A\82±\82Ì\96{\82Ì\82Q\94Ô\96Ú\82Ì\95û\96@\82Å\88À\92è\82µ\82Ä\93®\8dì\82·\82é\82æ\82¤\82É
+\82È\82è\82Ü\82µ\82½\81B\82µ\82©\82µ\81A\82±\82Ì\96{\82Ì\82Ü\82Ü\82Å\82ÍDokoPop!\82Å\8cø\97¦\82æ\82­
+\93®\8dì\82µ\82Ä\82­\82ê\82È\82¢\82Ì\82Å\81A\82©\82È\82è\8f\91\82«\8a·\82¦\82Ä\82 \82è\82Ü\82·\81B
+\81i\82Æ\82¢\82¤\82±\82Æ\82Å\92\98\8dì\8c \95\\8e¦\82à\8fÈ\97ª\82µ\82½\82è\82µ\82Ä\81E\81E\81E\81j
+\8f\91\82«\8a·\82¦\82½\81A\82Æ\82¢\82¤\82æ\82è\81A\8d¡\82Ü\82Å\8e©\95ª\82ª\8f\91\82¢\82½APIHOOK\8d\\91¢\91Ì\82ð
+\95Ï\8dX\82µ\82½\81A\82Æ\82¢\82¤\82Ù\82¤\82ª\90³\82µ\82¢\82©\82à\82µ\82ê\82Ü\82¹\82ñ\81B
+API\83t\83b\83N\82Ì\89ð\90à\82Í\82±\82Ì\96{\82É\8f÷\82è\82Ü\82·\81B
+
+\82Å\82·\82ª\81A\82¹\82Á\82©\82­\82P\94Ô\96Ú\82Ì\8aë\8c¯\82È\95û\96@\82Å\82¢\82­\82Â\82©\93¾\82½\8fî\95ñ\82ª\82 \82é\82Ì\82Å\81A
+\8b\8c\83o\81[\83W\83\87\83\93\82Å\8eg\97p\82µ\82Ä\82¢\82½\83t\83b\83N\95û\96@\82Ì\8fî\95ñ\82ð\8f\91\82¢\82Ä\82¨\82«\82Ü\82·\81B
+---------- \8cÃ\82¢\98b ----------
+\82¿\82È\82Ý\82É\81ANT\82Å\82ÍUSER32.DLL,GDI32.DLL\82ÌGetProcAddress()\82Í
+application\82É\82æ\82Á\82Ä\88Ù\82È\82è\82Ü\82·\81B\82µ\82©\82µ\81A9x\82Å\82Í\93¯\82\82Å\82·\81B
+\90æ\82Ù\82Ç\82à\82¿\82ç\82Á\82Æ\8f\91\82¢\82½\82æ\82¤\82É\81ANT\82Ìapplication\82Í\8cÂ\95Ê\82Ìmemory\8bó\8aÔ\82Å
+USER32.DLL,GDI32.DLL\82à\88Ù\82È\82é\8bó\8aÔ\82É\91\8dÝ\82µ\82Ä\82¢\82é\82©\82ç\82Å\82·\81B
+\82Æ\82±\82ë\82ª9x\82Í\8b¤\97L\82µ\82Ä\82¢\82Ä\81A\82µ\82©\82àjump\82µ\82½\82ç\82·\82®\82Ékernel mode\82É
+\93ü\82Á\82Ä\82¢\82é\82æ\82¤\82Å\82·\81B(NT\82Í\82 \82é\92ö\93xuser mode\82Å\82â\82Á\82Ä\82¢\82é\8a´\82\81j
+
+\82³\82ç\82É\82»\82Ì\90æ\82Í\82Ç\82¤\82È\82Á\82Ä\82¢\82é\82©\82Æ\82¢\82¤\82Æ\81E\81E\81E\82Æ\82¢\82¤\98b\82Í
+\82±\82Ì\83v\83\8d\83O\83\89\83\80\82Ìscope\8aO\82È\82Ì\82Å\82Ü\82½\82Ì\8b@\89ï\82É\8f÷\82é\82Æ\82µ\82Ä\81A
+\82±\82±\82Å9x\82É\91Î\82µ\82Ä\82¿\82å\82Á\82Æ\8c\99\82È\97\\8a´\82ª\82æ\82¬\82è\82Ü\82·\81B
+NT\82Ì\8fê\8d\87\81Aentry point\82ð\8f\91\82«\8a·\82¦\82Ä\82à\82»\82Ìapplication\8cÅ\97L\82Ì
+entry point\82Å\82 \82é\82½\82ß\81A\82»\82Ì\8aÔ\82Étask switching\82ª\94­\90\82µ\82Ä\82à
+\96â\91è\82È\82¢\82Ì\82Å\82·\82ª\81A9x\82Å\82Í\81Aentry point\82ð\8f\91\82«\8a·\82¦\82½\92¼\8cã\82É
+task switching\82ª\94­\90\82µ\82½\82ç\81A(\97\88\82Ä\97~\82µ\82­\82È\82¢)\82Ù\82©\82Ìapplication\82ª
+\82»\82Ìhook\82ð\93`\82Á\82Ä\82â\82Á\82Ä\82­\82é\81E\81E\81E\8dÅ\88«entry point\8f\91\82«\8a·\82¦\92\86\82É
+switching\82ª\94­\90\82·\82é\82Æ\81E\81E\81E\82¿\82å\82Á\82Æ\95|\82¢\82Å\82·\81B
+\82Å\82à\81A\8eÀ\8dÛ\82Í\82»\82Ì\82æ\82¤\82È\83P\81[\83X\82Í\8bN\82±\82è\82É\82­\82­\81A\8eÀ\8dÛ\82»\82¤\82¢\82¤
+\96â\91è\82Í\94­\90\82µ\82Ä\82¢\82Ü\82¹\82ñ\81B\82Å\82·\82ª\81A\88ê\89\9e\83v\83\8d\83O\83\89\83\80\82Å\82Í
+\82»\82Ì\82½\82ß\82Ì\91Î\8dô\82ð\82µ\82Ä\82 \82è\82Ü\82·\81B
+(\82±\82Ì\82Ö\82ñ\82Ì\97\9d\8bü\82à\8f\91\82¢\82½\95û\82ª\82¢\82¢\82Ì\82Å\82·\82ª\81E\81E\81E\8fÈ\97ª\81j
+
+entry point\82Ì\8f\91\82«\8a·\82¦\82Å\82·\82ª\81ANT\82Ì\8fê\8d\87\82Í
+\92Ê\8fí\82Ìapplication\82Æ\93¯\82\82Å\82·\82Ì\82Å\81AWriteProcessMemory\8aÖ\90\94\82Å
+code\97Ì\88æ\82ð\8f\91\82«\8d\9e\82Ý\82ª\82Å\82«\82Ü\82·\81B\82µ\82©\82µ\81A9x\82Í
+\8b¤\97Lmemory\82Å\82 \82è\81A\82»\82±\82Íwrite protect\82³\82ê\82Ä\82¢\82Ü\82·\81B
+\82±\82Ìprotection\82ð\89ð\8f\9c\82·\82é\82É\82Í\92Ê\8fí\82ÌWindows API\82É\82Í
+\96³\82¢\82æ\82¤\82È\82Ì\82Å\81i\82 \82Á\82½\82ç\8b³\82¦\82Ä\97~\82µ\82¢\81j\81A\82í\82´\82í\82´
+memory\82ð\8f\91\82«\8a·\82¦\82é\82¾\82¯\82Ì\82½\82ß\82ÌVxD\82ð\8dì\82è\82Ü\82µ\82½\81B
+VxD\82È\82çkernel mode\82È\82Ì\82Å\82È\82ñ\82Å\82à\82Å\82«\82Ä\82µ\82Ü\82¢\82Ü\82·\81B
+(\82±\82Ì\82Ö\82ñ\82ª\90æ\82Ù\82Ç\82Ìtask switching\82Ì\98b\82Æ\97\8d\82ñ\82Å\82¢\82Ü\82·\82ª)
+
+VxD\82Ídynamic loading\82Å\8dì\82Á\82Ä\82 \82è\82Ü\82·\81B
+\82±\82ÌVxD\82Å\92\8d\88Ó\82µ\82È\82¯\82ê\82Î\82È\82ç\82È\82¢\82Ì\82Í\81ACreateFile()\8aÖ\90\94\82Å
+VxD\82ðload\82µ\82Ä\82¢\82Ü\82·\82ª\81A\93ñ\93xCreateFile()\82Í\82Å\82«\82È\82¢\82Æ\82±\82ë\82Å\82·\81B
+\8f]\82Á\82Ä\81A\88ê\94Ô\8dÅ\8f\89\82Ì\8f\89\8aú\89»\82Ì\82Æ\82«\82¾\82¯\81ACreateFile()\82ð\8ds\82¢\81A
+\82 \82Æ\82Í\82¸\82Á\82ÆVxD\82ð\8fí\92\93\82³\82¹\82½\82Ü\82Ü\82É\82µ\82Ä\82¨\82­\95K\97v\82ª\82 \82è\82Ü\82·\81B
+
+\88ê\89\9eAPI Hook\82Ì\98b\82Í\82±\82Ì\82­\82ç\82¢\82É\82µ\82Ä\82¨\82«\82Ü\82·\81B
+API Hook\82ð\82·\82éapplication\82Í\82Ù\82©\82É\82à\82 \82è\82Ü\82·\82ª\81A
+\82»\82¤\82¢\82¤application\82Í\82±\82ê\82Æ\93¯\82\95û\96@\82ð\8eg\97p\82µ\82Ä\82¢\82é\82Ì\82Å\82µ\82å\82¤\82©\81H
+MSDN\82É\82àapimon(\82¾\82Á\82½\82©\82È\81H)\82Æ\82¢\82¤tool\82ª\95t\91®\82µ\82Ä\82¢\82Ü\82·\82ª\81A
+\82Ç\82¤\82È\82ñ\82Å\82µ\82å\82¤\81H
+---------- \88È\8fã\81A\8cÃ\82¢\98b ----------
+
+\98b\82Í\82¸\82Á\82Æ\91O\82É\96ß\82Á\82Ä\81ABitBlt\91Î\8dô\82Ì\98b\82Å\82·\81B
+\82±\82ÌBitBlt\82Å\95`\89æ\82·\82é\95û\96@\82ð\92²\82×\82Ä\82Ý\82é\82Æ\81Awindow\91S\91Ì\82Å\82Í\82È\82­\81A
+banding\82É\82æ\82Á\82Ä\81Awindow\82ð\95¡\90\94\82Ìbitmap\82É\95ª\8a\84\82µ\82ÄBitBlt\82µ\82Ä\82¢\82é
+\82æ\82¤\82Å\82·\81B\8f]\82Á\82Ä\81ABitBlt API\82àhook\82µ\82Ä\82â\82è\81Abitmap\82Ötext\82ð
+\95`\89æ\82µ\82½\82Æ\82«\82Ì\8dÀ\95W\82Æ\81ABitBlt\82µ\82½\82Æ\82«\82Ìdestination point\82Ì
+offset\82ð\8dl\97\82µ\82Ätext\8dÀ\95W\82ð\8cv\8eZ\82µ\82Ä\82â\82é\95K\97v\82ª\82 \82è\82Ü\82·\81B
+
+\88È\8fã\81Atext\82ðget\82Å\82«\82½\82ç\81A\8ew\92è\8dÀ\95W(sample\82Å\82Ímouse\82Ìcursor\88Ê\92u)\82É
+text\82ª\82 \82é\82©\82Ç\82¤\82©\81A\82Æ\82¢\82¤\94»\92è\82ð\8ds\82¢\82Ü\82·\81B
+hit\82µ\82½\8fê\8d\87\82Í\81A\82»\82Ìtext\91S\91Ì\82Æ\81Atext\8fã\82Ìbyte offset\82ð
+WM_COPYDATA message\82Å\8f\89\8aú\89»\82Ì\8e\9e\82É\93o\98^\82µ\82Ä\82 \82é window\82ÖSendMessage()
+\82µ\82Ü\82·\81B(WM_COPYDATA\82ÍSendMessage\82Å\82È\82¢\82Æ\82¢\82¯\82È\82¢)
+
+\82»\82µ\82Ä\81ADCHookTest.exe\82ª\82»\82Ìmessage\82ð\8eó\82¯\8eæ\82è\81ADCHookTest.exe\82ª
+text\82ð\82Ù\82©\82Ìapplication(PDIC)\82ÖDDE\82Å\93n\82µ\82Ä\82¢\82Ü\82·\81B
+
+DCHookTest.exe\82ª\82â\82Á\82Ä\82¢\82é\82±\82Æ\82Í\82»\82ê\82ª\82Ù\82Æ\82ñ\82Ç\82Å\81A
+dchook.dll\82É\82­\82ç\82×\82ê\82Îê¡\82©\82É\8ay\82È\8ed\8e\96\82È\82Ì\82Å\82·\81B
+
+DLL\82Å\82Í\8fí\8e¯\82Å\82·\82ª\81Adata\82Í\8aî\96{\93I\82Éprocess\8cÅ\97L\82Ì\92l\82ð\8e\9d\82¿\82Ü\82·\81B
+\82±\82±\82Å\92\8d\88Ó\82µ\82È\82¯\82ê\82Î\82È\82ç\82È\82¢\82Ì\82ª\81AWindowsHook\82Ìhook dll\82Í\81A
+WindowsHook\82Å\83Z\83b\83g\82µ\82½\8cã\81Aforeground application\82É
+\90Ø\82è\91Ö\82í\82Á\82½\82Æ\82«\82É\8f\89\82ß\82Äattach\82³\82ê\82Ü\82·\81B
+(\82Â\82Ü\82è\81AWindowsHook\82µ\82½\8e\9e\93_\82Å\82ÍHook\82µ\82½process\82É\82µ\82©
+attach\82³\82ê\82Ä\82¢\82È\82¢)
+\82µ\82©\82à\81Aattach\82µ\82½\82Æ\82«\82É\82Í\81A\95Ê\82Ìapplication\82Ìprocess\8bó\8aÔ\82É
+\8b\8f\82Ü\82·\82Ì\82Å\81AWM_COPYDATA\82Ì\91\97\82è\90æ\82Ì\8fî\95ñ\82ª\82Ç\82±\82É\82à\82 \82è\82Ü\82¹\82ñ\81B
+\83t\83@\83C\83\8b/registry\82É\95Û\91\82µ\82Ä\93Ç\82Ý\8d\9e\82Þ\81A\82È\82ñ\82Ä\82¢\82¤\95û\96@\82à\82 \82è
+\82Ü\82·\82ª\81Adchook.def\82Åshared\82É\82æ\82Á\82Ä\81Adll\8aÔ\82Å\8b¤\97L\82·\82é
+data segment\82ð\8dì\90¬\82·\82é\95û\96@\82ª\82 \82è\82Ü\82·\81B
+\82±\82±\82ÉWM_COPYDATA\91\97\82è\90æ\82Ìhandle\82ð\95Û\91\82µ\82Ä\82¨\82¯\82Î\81A\82±\82Ì\82æ\82¤\82È
+\96â\91è\82Í\89ð\8c\88\82Å\82«\82Ü\82·\81B
+
+\82»\82ê\82Æ\82à\82¤\88ê\82Â\82â\82Á\82Ä\82Ý\82Ä\82í\82©\82Á\82½\82Ì\82Å\82·\82ª\81A9x\82Å\82Í
+Unhook\82ð\82·\82é\82Æ\81A\82·\82®\82É\82·\82×\82Ädetach\82³\82ê\82é\82Ì\82Å\82·\82ª\81A
+NT\82Å\82Í\81A\82±\82ê\82Ü\82½foreground\82É\90Ø\82è\91Ö\82í\82Á\82½\82Æ\82«\82É\82µ\82©
+detach\82µ\82Ä\82­\82ê\82Ü\82¹\82ñ\81B\82»\82±\82Å\81Adchook\82Å\82Í\8b­\90§\93I\82É
+detach\82³\82¹\82é\82½\82ß\82Émessage\82ðbroadcast\82³\82¹\82Ä\82¢\82Ü\82·\81B
+\8eÀ\8dÛ\82Í\82»\82±\82Ü\82Å\82â\82é\95K\97v\90«\82Í\82È\82¢\82Ì\82Å\82·\82ª\81A\8aJ\94­\8e\9e\82É
+memory\82ð\89ð\95ú\82³\82¹\82é\82½\82ß\82É\90F\82ñ\82Èapplication\82É\90Ø\82è\91Ö\82¦\82é\82Ì\82ª
+\8c\99\82¾\82Á\82½\82Ì\82Å\81E\81E\81EBroadcastMessage\88È\8aO\82É\97Ç\82¢\95û\96@\82ª\82 \82é\82Ì\82©\82È\81H
+
+\83v\83\8d\83O\83\89\83\80\89ð\90à -----------------------------------------------------------
+
+DBW()
+
+\83f\83o\83b\83O\97p\82Ì\8aÖ\90\94\82Å\82·\81B\90Ù\8dì\82Ìdbgmsg.exe\82Ö\95\8e\9a\97ñ\82ð\8fo\97Í\82µ\82Ü\82·\82ª\81A
+\82Ù\82©\82Ìdebug string\82ð\95â\91«\82·\82édebug string monitor\82Å\8eg\82¦\82é\82æ\82¤\82É
+DBW()\82ð\8f\91\82«\8a·\82¦\82½\82Ù\82¤\82ª\97Ç\82¢\82Å\82µ\82å\82¤\81B(OutputDebugString()\82È\82Ç)
+
+popenable.h, popdisable.h
+\82±\82ê\82ç\82Í\81u\89E\83N\83\8a\83b\83N\8c\9f\8dõ\82ð\97L\8cø\82É\82µ\82Ü\82µ\82½\81v\82Æ\82¢\82¤\83\81\83b\83Z\81[\83W\83E\83B\83\93\83h\83E\82Ì
+\83\8a\81[\83W\83\87\83\93\8fî\95ñ\82Å\82·\81B\81i\8aÛ\82Ý\82Ì\82 \82é\83E\83B\83\93\83h\83E\81j
+\82±\82Ì\83\8a\81[\83W\83\87\83\93\8fî\95ñ\82Í\81Abmp2rgn\82Æ\82¢\82¤\83c\81[\83\8b\82Åpopenable.bmp, popdisable.bmp
+\82ð\95Ï\8a·\82µ\82½\82à\82Ì\82Å\82·\81Bbmp2rgn\82Í\83t\83\8a\81[\83E\83F\83A\82Å\82·\81B
+
+\83T\83\93\83v\83\8b\83v\83\8d\83O\83\89\83\80 -------------------------------------------------------
+
+sample program\82Æ\82µ\82Ä\81Amouse cursor\88Ê\92u\82Ìtext\82ð\92\8a\8fo\82µ\81A
+\90Ù\8eÒ\8dì\82Ì\89p\98a\8e«\8f\91\8c\9f\8dõ\83v\83\8d\83O\83\89\83\80 Personal Dictionary for Win32(PDIC)\82Ö
+DDE\82ð\8co\97R\82µ\82Ä\81A\8c\9f\8dõ\8c\8b\89Ê\82ðpopup\82³\82¹\82é \81u\82Ç\82±\83|\83b\83v\81I\81v\82Æ\82¢\82¤\82à\82Ì\82ª\82 \82è\82Ü\82·\81B
+
+http://homepage3.nifty.com/TaN/pdic-download.html
+\82ÉDokoPop!\82Æ\82¢\82¤\96¼\91O\82Å\93o\98^\82³\82ê\82Ä\82¢\82Ü\82·\81B
+
+\8d¡\8cã\82Ì\89Û\91è ---------------------------------------------------------------
+
+\81E\95¡\90\94\8ds\8c\9f\8fo
+\81@\82±\82Ì\83v\83\8d\83O\83\89\83\80\82Å\82Í\82P\8ds\95ª\82µ\82©\8eæ\93¾\82Å\82«\82Ü\82¹\82ñ\82ª\81A
+\81@\95`\89æ\8aJ\8en\88Ê\92u\82ð\92Ç\90Õ\82·\82é\82±\82Æ\82É\82æ\82è\81A\91O\8cã\82Ì\8ds\82à\92\8a\8fo\89Â\94\\82É\82È\82é\82Æ
+\81@\8ev\82¢\82Ü\82·\81B
+
+\92\98\8dì\8c  ------------------------------------------------------------------
+
+\8dÄ\94z\95z\81A\93]\8dÚ\81A\95¡\90»\81A\89ü\95Ï\81A\94Ì\94\84\93\99\82Í\82·\82×\82Ä\8e©\97R\82Å\82·\81B\88ê\90Ø\82Ì\90§\8cÀ\82ð\90Ý\82¯\82Ü\82¹\82ñ\81B
+\82½\82¾\82µ\81A\88È\89º\82Ì\82±\82Æ\82Í\82²\97¯\88Ó\82­\82¾\82³\82¢\81B
+\81E\82±\82Ì\83\\83t\83g\83E\83F\83A\82É\82æ\82Á\82Ä\90\82\82é\88ê\90Ø\82Ì\91¹\8aQ\90Ó\94C\82ð\95\89\82¢\82Ü\82¹\82ñ\81B
+\81E\82±\82Ì\83\\83t\83g\83E\83F\83A\82É\8aÖ\82µ\82Ä\95M\8eÒ\82Í\82¢\82©\82È\82é\8b`\96±\82à\95\89\82¢\82Ü\82¹\82ñ\81B
+\81E\8dÄ\94z\95z\82³\82ê\82½\82à\82Ì\82É\8aÖ\82µ\82Ä\82Í\88ê\90Ø\8aÖ\92m\82µ\82Ü\82¹\82ñ\81B
+
+\97\9a\97ð --------------------------------------------------------------------
+
+>> Ver.1.12 <<
+* \8e«\8f\91\82ª\91å\82«\82¢\8fê\8d\87\82É\81APDIC\8bN\93®\8cã\82Ì\8dÅ\8f\89\82Ì\83|\83b\83v\83A\83b\83v\82ª\82Å\82«\82È\82¢\82Æ\82«\82ª\82 \82Á\82½
+
+>> Ver.1.11 <<
+\81EUnicode\94Å\91Î\89\9e\82Ì\82½\82ß\82É\93à\95\94\8f\88\97\9d\82ð\95Ï\8dX
+
+>> Ver.1.10 <<
+\81\9bDokoPop\82Å\83|\83b\83v\83A\83b\83v\82µ\82½\83E\83B\83\93\83h\83E\8fã\82Å\82³\82ç\82É\83|\83b\83v\83A\83b\83v\82·\82é
+  \82±\82Æ\82ª\89Â\94\\82É\81i\98A\91±\83|\83b\83v\83A\83b\83v\81j\81iPDIC for Win32\82ÍVer.4.50\88È\8fã\82ª\95K\97v\81j
+\81\9b\93ú\96{\8cê\8d¬\8dÝ\82Ì\95\8fÍ\82Å\82à\90³\82µ\82­\93®\8dì\82·\82é\82æ\82¤\82É\82µ\82½\81B
+\81@\81i\90Ý\92è\83_\83C\83A\83\8d\83O\82Ì\81h\93ú\96{\8cê\82ð\96³\8e\8b\82·\82é\81h\82Å\90Ø\82è\91Ö\82¦\89Â\94\\81j
+
+>> Ver.1.02 <<
+* DKPP.EXE\82Ì\83o\81[\83W\83\87\83\93\90Ý\92è\82ð\8aÔ\88á\82Á\82Ä\82¢\82½
+
+>> Ver.1.01 <<
+* Windows9x\82Å\83|\83b\83v\83A\83b\83v\82µ\82È\82¢\8fê\8d\87\82ª\82 \82Á\82½(IE\82È\82Ç)
+\81E\82»\82ê\82É\91Î\8f\88\82µ\82½\82½\82ß\81AWindows95\82Í\93®\8dì\91Î\8fÛ\8aO\82É
+* \89E\83N\83\8a\83b\83N\8c\9f\8dõ\90Ø\82è\91Ö\82¦\82Å\83\8a\83\\81[\83X\83\8a\81[\83N\82ª\94­\90\82µ\82Ä\82¢\82½
+* \83q\83b\83g\82µ\82È\82¢\92P\8cê\82ª\82 \82é\82Æ\83\81\83\82\83\8a\83\8a\81[\83N\82ª\94­\90\82µ\82Ä\82¢\82½
+
+>> Ver.1.00 <<
+* Windows9x/Me\8cn\82ÌOS\82Å\82Ì\93®\8dì\82ð\88À\92è\89»\82µ\82½
+* \8e«\8f\91\83O\83\8b\81[\83v\8ew\92è\82ð\90³\8fí\82É\93®\8dì\82·\82é\82æ\82¤\82É\82µ\82½
+  \81y\92\8d\88Ó\81z\82±\82Ì\8b@\94\\82ÍPDIC for Win32 Ver.4.40\82©\82ç\82Ì\91Î\89\9e\82É\82È\82è\82Ü\82·
+\81E\8c\9f\8dõ\82Ì\83L\81[\82Ì\91g\82Ý\8d\87\82í\82¹\82ð\83J\83X\83^\83}\83C\83Y\82Å\82«\82é\82æ\82¤\82É\82µ\82½
+\81E\83t\83@\83C\83\8b\8d\\90¬\82ð\95Ï\8dX
+\81E\98A\91±\82µ\82Ä\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82ª\82Å\82«\82é\82æ\82¤\82É\82µ\82½
+\81E\82Ù\82©\95\\8e¦\82Ì\95Ï\8dX\82È\82Ç
+
+>> Ver.0.98 <<
+\81\9b\83}\83E\83X\89E\83N\83\8a\83b\83N\82Ì\82Ý\82Å\83|\83b\83v\83A\83b\83v\82ð\89Â\94\\82É
+\81@\81iCtrl+Alt+\89E\83N\83\8a\83b\83N\82ÅON/OFF\82Å\82«\82Ü\82·\81j
+* \81h\8e«\8f\91\83O\83\8b\81[\83v\82ª\8aJ\82¯\82Ü\82¹\82ñ\81h\82Æ\8fo\82é\82±\82Æ\82ª\82 \82Á\82½
+* \8dÅ\8f¬\89»\82Å\8bN\93®\82µ\82½\8fê\8d\87\81A\83^\83X\83N\83o\81[\82É\83A\83C\83R\83\93\82ª\8ec\82Á\82Ä\82¢\82½
+
+>> Ver.0.97 <<
+* \8e«\8f\91\83O\83\8b\81[\83v\82Ì\95Ï\8dX\82ª\82Å\82«\82È\82­\82È\82Á\82Ä\82¢\82½
+* IE\82Å\83q\83b\83g\82µ\82È\82¢\82±\82Æ\82ª\82 \82Á\82½
+
+>> Ver.0.96 <<
+* PDIC\82ð\8e©\93®\8bN\93®\82Å\82«\82È\82©\82Á\82½(\93Ç\82Ý\8d\9e\82Þregistry\82ð\8aÔ\88á\82Á\82Ä\82¢\82½)
+* \82Ç\82±\83|\83b\83v\82ð\8dÅ\8f¬\89»\82Å\8bN\93®\82µ\82½\8fê\8d\87\81A\83X\83v\83\89\83b\83V\83\85\83E\83B\83\93\83h\83E\82ª\8fÁ\82¦\82È\82©\82Á\82½
+
+>> Ver.0.95 <<
+??
+
+>> Ver.0.94 <<
+* \83X\83v\83\89\83b\83V\83\85\82ð\94ñ\95\\8e¦\82É\82µ\82½\8fê\8d\87\82Ì\95s\8bï\8d\87\8fC\90³
+
+>> Ver.0.94 <<
+* \8bN\93®\8e\9eDLL\8f\89\8aú\89»\8e¸\94s(Win98)
+* \93ú\96{\8cê\8d¬\82\82è\82Ì\95\82Å\83e\83L\83X\83g\92\8a\8fo\88Ê\92u\82ª\82¸\82ê\82Ä\82¢\82½(Win98)
+
+>> Ver.0.93 <<
+\81E\8bN\93®\83X\83v\83\89\83b\83V\83\85\95Ï\8dX
+\81E\83X\83v\83\89\83b\83V\83\85\95\\8e¦\81E\94ñ\95\\8e¦
+\81E\83X\83v\83\89\83b\83V\83\85\83r\83b\83g\83}\83b\83v\82Ì\83J\83X\83^\83}\83C\83Y
+\81E\83C\83\93\83X\83g\81[\83\89\92Ç\89Á
+* \83\81\83\82\92 \82Å\88Ù\8fí\8fI\97¹(NT)
+* \93ú\96{\8cê\8d¬\82\82è\82Ì\95\82Å\83e\83L\83X\83g\92\8a\8fo\88Ê\92u\82ª\82¸\82ê\82Ä\82¢\82½
+
+>> Ver.0.92 <<
+\81E\88À\92è\90«\8cü\8fã
+
+>> Ver.0.90 <<
+\81E\8dÅ\8f\89\82Ì\8cö\8aJ
+
diff --git a/VxD/hk95c.c b/VxD/hk95c.c
new file mode 100644 (file)
index 0000000..16093b2
--- /dev/null
@@ -0,0 +1,164 @@
+//// HK95c.c
+// --------------------------------------------
+// Dynamically loadable VxD for DCHOOK
+// --------------------------------------------
+#define WIN32_LEAN_AND_MEAN // Excludes un-needed parts of windows.h
+#include <windows.h>
+#include <vmm.h>
+#include <vwin32.h>
+#include <debug.h>
+#include "hk95d.h"
+
+// -------------------------------------
+// Externs defined in assembly module 
+// -------------------------------------
+// These defined in assembly for the VMM.INC or VPICD.INC file inclusion
+// ------------------------
+// PRAGMA for this DATA 
+// ------------------------
+// Establish segment
+#pragma data_seg ( "_LDATA","_LCODE")
+
+// ------------------------------------
+// Data structures MUST be INITIALIZED
+// ------------------------------------
+// ------------------------
+// PRAGMAS for this CODE 
+// ------------------------
+// Establish segment
+#pragma code_seg ( "_LTEXT", "_LCODE" )
+//No stack checking for routines in this module
+#pragma check_stack(off)
+
+// ---------------------------------------
+// Set Good Return code for DIOC requests
+// ---------------------------------------
+void _declspec(naked)GoodReturnDIOC(void)
+{
+       // Clear eax and carry flag for GOOD return
+       _asm xor eax,eax
+       _asm clc
+       _asm ret;
+}
+
+// ---------------------------------------
+// Set Bad Return code for DIOC requests
+// ---------------------------------------
+void _declspec(naked) BadReturnDIOC(void)
+{
+       // NOTE: 50 is a FCN NOT SUPPORTED code -- ok to use
+       // SET carry flag for BAD return
+       _asm mov eax,50
+       _asm stc
+       _asm ret;
+}
+
+
+// ------------------------------
+// Routine for DCHOOK Device UNINIT  
+// ------------------------------
+void CHK95_Device_UNInit()
+{
+       // Set GOOD return code
+       GoodReturnDIOC();
+       return;
+}
+// ------------------------------
+// Routine for DCHOOK Device INIT  
+// ------------------------------
+
+void CHK95_Device_Init()
+{
+    GoodReturnDIOC();
+}
+DWORD VXDINLINE
+PageModPerm( DWORD Page, DWORD nPages, DWORD Flags1, DWORD Flags2 )
+{
+    DWORD    dw;
+
+       _asm push [Flags2]
+       _asm push [Flags1]
+       _asm push [nPages]
+       _asm push [Page]
+    VMMCall( _PageModifyPermissions );
+       _asm add esp, 10h
+    _asm mov [dw], eax
+
+    return(dw);
+}
+
+// --------------------------------
+// Routine for DCHOOK Device IO ctrl  
+// --------------------------------
+void CHK95_Device_IOctrl(PDIOCPARAMETERS ptr)
+{
+       int i;
+       unsigned int addr;
+       unsigned int page;
+       int npage;
+       unsigned char *p;
+       unsigned char *q;
+       DWORD oldpermission;
+       // Field the DEV IO requests from VMM
+       switch(ptr->dwIoControlCode)
+               {
+               case DIOC_WRITEABLE_MEMORY:     // The address to be changed must be already committed.
+                       if ( ptr->lpvInBuffer ){
+                               // Does it need a PC_STATIC?
+
+                               long r = 0;
+
+                               // I don't know exact parameters. But it works well, so I don't care about it....
+
+                               r = PageModPerm( *((DWORD*)ptr->lpvInBuffer), 1, 0xFFFFFFFF, PC_WRITEABLE | PC_USER | PC_STATIC );
+                               if ( ptr->lpvOutBuffer ){
+                                       *((DWORD*)ptr->lpvOutBuffer) = r;
+                               }
+                       }
+               break;
+               case DIOC_NONWRITEABLE_MEMORY:  // The address to be changed must be already committed.
+                       {
+                       long r = 0;
+
+                       r = PageModPerm( *((DWORD*)ptr->lpvInBuffer), 1, ~PC_WRITEABLE, PC_USER | PC_STATIC );
+                       if ( ptr->lpvOutBuffer ){
+                               *((DWORD*)ptr->lpvOutBuffer) = r;
+                       }
+                       }
+               break;
+               case DIOC_CHANGE_MEMORY:
+                       addr = (DWORD)ptr->lpvOutBuffer;
+                       page = addr >> 12;      // 4KB
+                       npage = ((addr + ptr->cbInBuffer) >> 12) - page + 1;
+                       oldpermission = PageModPerm( page, npage, 0xFFFFFFFF, PC_WRITEABLE | PC_USER | PC_STATIC );
+                       _asm pushfd
+                       _asm cli
+                       if ( oldpermission == (DWORD)-1 ){
+                               _asm popfd
+                               BadReturnDIOC();
+                               return;
+                       }
+                       p = (unsigned char*)addr;
+                       q = (unsigned char*)ptr->lpvInBuffer;
+                       for ( i=0;i<ptr->cbInBuffer;i++ ){
+                               *p++ = *q++;
+                       }
+                       PageModPerm( page, npage, oldpermission, oldpermission );
+                       _asm popfd
+               break;
+#if 0
+               case DIOC_DEBUG:
+                       *(DWORD*)ptr->lpvOutBuffer = (DWORD)CHK95_Device_IOctrl;
+               break;
+#endif
+               //The below DIOC_GETVERSION is a part of the dynamic load protocol
+               //It MUST return a GOOD code (all codes here use GoodReturnDIOC()
+//             case(DIOC_GETVERSION):
+//             case(DIOC_CLOSEHANDLE):
+//             default:
+//             break;
+       }
+       GoodReturnDIOC();
+       return;
+}
+
diff --git a/VxD/hk95d.asm b/VxD/hk95d.asm
new file mode 100644 (file)
index 0000000..91017cc
--- /dev/null
@@ -0,0 +1,120 @@
+;;HK95d.asm
+name HK95D
+.386p
+;; ------------------------------------------------
+;; ------------------------------------------------
+;; HK95d.asm -- Assembly module, MAIN module for
+;; Dynamically loadable VxD for DCHOOK
+;; ------------------------------------------------
+;; ------------------------------------------------
+
+;; -----------------------------------
+;; INCLUDE files needed by this module
+;; -----------------------------------
+
+include <inc\win98\vmm.inc>
+include <inc\win98\vwin32.inc>
+include <inc\win98\vpicd.inc>
+
+;; ------------------------------------
+;; C routines/data used by this module
+;; ------------------------------------
+extrn _CHK95_Device_Init:near
+extrn _CHK95_Device_UNInit:near
+extrn _CHK95_Device_IOctrl:near
+
+;; -------------------------------------
+;; Routines/data called from this module
+;; -------------------------------------
+; public
+
+ ; ==================================================================================
+;; Misc HK95-specific Equates
+;; ----------------------------------------------------------------------------------
+HK95_MajoREV equ 1              ;MAJOR revision level
+HK95_MinoREV equ 0              ;decimal number of revision
+HK95_DeviceID equ Undefined_Device_ID ;no need for MS device number assignment
+; ==================================================================================
+
+;; ---------------------------------------------
+;; Virtual Device Declaration (Required)
+;; (Declares this code as virtual device driver)
+;; Also creates the Device Data Block
+;; ---------------------------------------------
+Declare_Virtual_Device HK95D,HK95_MajoREV,HK95_MinoREV,HK95_Control,HK95_DeviceID,Undefined_Init_Order
+
+VxD_LOCKED_CODE_SEG
+;; --------------------------------------------
+;; Control Dispatch Table & Proc (Required)
+;; Used to dispatch supported messages sent by
+;; VMM -- clears carry for unsupported mssgs.
+;; --------------------------------------------
+;; Only 3 VMM messages are recognized and processed
+;; by this routine -- all DIOC interface messages
+;; translate to W32_DeviceIoControl mssgs from the VMM.
+;; "Control_Dispatch" precedes MSSG NUMBER, PROCEDURE
+
+BeginProc HK95_Control
+    Control_Dispatch Sys_Dynamic_Device_Exit, HK95_Device_UNInit
+    Control_Dispatch Sys_Dynamic_Device_Init, HK95_Device_Init
+       Control_Dispatch W32_DeviceIoControl,     HK95_Device_IOctrl
+    xor eax,eax  ;;return 0 (required in some instances)
+    clc          ;;clear carry flg for GOOD indicator   
+       ret
+EndProc HK95_Control
+
+;; -------------------------------------------------------------
+;; NOTE: "BeginProc & EndProc" are needed in conjunction with
+;; the above dispatch table -- below routines facilitate C fcns
+;; -------------------------------------------------------------
+
+;; =======================================================================
+;; Routines below are VXD interface (load, unload, process) ROUTINES
+;; =======================================================================
+
+;; --------------------------------------------
+;; Routine to jump to C routine for processing
+;; SYS_DYNAMIC_DEVICE_INIT message
+;; --------------------------------------------
+BeginProc HK95_Device_Init
+    call _CHK95_Device_Init
+    ret
+EndProc HK95_Device_Init
+
+;; --------------------------------------------
+;; Routine to jump to C routine for processing
+;; SYS_DYNAMIC_DEVICE_EXIT message
+;; --------------------------------------------
+
+BeginProc HK95_Device_UNInit
+        call _CHK95_Device_UNInit
+        ret
+EndProc HK95_Device_UNInit
+
+;; --------------------------------------------
+;; Routine to jump to C routine for processing
+;; W32_DEVICEIOCONTROL messages -- These are
+;; VxD requests from the application.
+;; At entry, esi points to the DIOC interface
+;; structure passed by the application
+;; --------------------------------------------
+
+BeginProc HK95_Device_IOctrl
+        push esi
+        call _CHK95_Device_IOctrl
+        pop esi
+        ret
+EndProc HK95_Device_IOctrl
+
+;; ======================================================
+;; Routines below are miscellaneous assembly interfaces
+;; ======================================================
+
+VxD_LOCKED_CODE_ENDS
+
+VxD_LOCKED_DATA_SEG
+VxD_LOCKED_DATA_ENDS
+
+        END
+
diff --git a/VxD/hk95d.def b/VxD/hk95d.def
new file mode 100644 (file)
index 0000000..32880d1
--- /dev/null
@@ -0,0 +1,24 @@
+VXD HK95D.VXD  DYNAMIC
+DESCRIPTION 'Hk 95 Vxd'
+SEGMENTS
+       _LDATA CLASS 'LCODE' PRELOAD NONDISCARDABLE
+       _LTEXT CLASS 'LCODE' PRELOAD NONDISCARDABLE
+    _LPTEXT     CLASS 'LCODE'   PRELOAD NONDISCARDABLE
+    _TEXT       CLASS 'LCODE'   PRELOAD NONDISCARDABLE
+    _DATA       CLASS 'LCODE'   PRELOAD NONDISCARDABLE
+    CONST       CLASS 'LCODE'   PRELOAD NONDISCARDABLE
+    _TLS        CLASS 'LCODE'   PRELOAD NONDISCARDABLE
+    _BSS        CLASS 'LCODE'   PRELOAD NONDISCARDABLE
+    _ITEXT      CLASS 'ICODE'   DISCARDABLE
+    _IDATA      CLASS 'ICODE'   DISCARDABLE
+    _PTEXT      CLASS 'PCODE'   NONDISCARDABLE
+    _PDATA      CLASS 'PDATA'   NONDISCARDABLE SHARED
+    _STEXT      CLASS 'SCODE'   RESIDENT
+    _SDATA      CLASS 'SCODE'   RESIDENT
+    _DBOSTART   CLASS 'DBOCODE' PRELOAD NONDISCARDABLE CONFORMING
+    _DBOCODE    CLASS 'DBOCODE' PRELOAD NONDISCARDABLE CONFORMING
+    _DBODATA    CLASS 'DBOCODE' PRELOAD NONDISCARDABLE CONFORMING
+    _16ICODE    CLASS '16ICODE' PRELOAD DISCARDABLE
+    _RCODE      CLASS 'RCODE'
+EXPORTS                                            
+        HK95D_DDB @1
diff --git a/VxD/hk95d.h b/VxD/hk95d.h
new file mode 100644 (file)
index 0000000..75f87dc
--- /dev/null
@@ -0,0 +1,12 @@
+//hk95d.h
+
+#define        DIOC_CHANGE_MEMORY              20
+#define        DIOC_QUERY_MEMORY               21
+#define        DIOC_WRITEABLE_MEMORY   22
+#define        DIOC_NONWRITEABLE_MEMORY 23
+#define        DIOC_SET_HOOK                   25
+#define        DIOC_RESTORE_HOOK               26
+#define        DIOC_HOOK_START                 30
+#define        DIOC_HOOK_END                   31
+#define        DIOC_LAST_STATUS                32
+#define        DIOC_DEBUG                              33
diff --git a/VxD/makefile b/VxD/makefile
new file mode 100644 (file)
index 0000000..d9f3c75
--- /dev/null
@@ -0,0 +1,70 @@
+BUILD_TYPE=base
+# !INCLUDE $(BASEDIR)\inc\master.mk
+
+# OUTDIR = obj\i386\\
+
+# sample make file for building vxd virtual device for Windows
+
+NAME = HK95D
+
+#       Definitions for the debug level 
+
+!ifdef DEBUG
+DDEBUG  =-DDEBLEVEL=1 -DDEBUG
+!else
+DDEBUG  =-DDEBLEVEL=0
+!endif
+
+#       Definitions for MASM 6 Assembler
+
+INC32  = k:\98ddk
+ASM    = ml
+AFLAGS = -coff -DBLD_COFF -DIS_32 -W2 -c -Cx -Zm -DMASM6 -I$(INC32) $(DDEBUG)
+ASMENV = ML
+LFLAGS = /VXD /NOD
+
+CFLAGS = -DWIN32 -Di386 -D_X86_ -I$(BASEDIR)\inc
+
+#       MASM 6 only inference rules
+
+.asm{$(OUTDIR)}.obj:
+       set $(ASMENV)=$(AFLAGS)
+       $(ASM) -Fo$*.obj $< 
+
+.c{$(OUDIR)}.obj:
+       $(CC) -c $(CFLAGS) -Fo$*.obj $*.c
+
+all : $(OUTDIR)$(NAME).VXD
+
+OBJS = $(OUTDIR)hk95d.obj $(OUTDIR)hk95c.obj
+
+$(OUTDIR)vxdstub.exe: $(OUTDIR)vxdstub.obj
+!ifndef PASS0ONLY
+       @echo link -OUT:$@
+       $(LINK16) $(OUTDIR)vxdstub.obj;
+!endif
+
+$(OUTDIR)hk95d.obj: hk95d.asm
+
+$(OUTDIR)$(NAME).vxd: $(NAME).def $(OBJS)
+!ifndef PASS0ONLY
+               @echo link -OUT:$@
+        link @<<$(OUTDIR)$(NAME).lnk
+$(LFLAGS) 
+-ignore:4078 -ignore:4039
+/OUT:$(OUTDIR)$(NAME).vxd
+/MAP:$(TOUDIR)$(NAME).map
+/DEF:$(NAME).def
+$(OBJS)
+<<
+        mapsym -s -o $(OUTDIR)R$(NAME).sym $(OUTDIR)$(NAME).map
+!endif
+
+clean:
+    -@if exist $(OUTDIR)*.obj del $(OUTDIR)*.obj
+    -@if exist $(OUTDIR)*.vxd del $(OUTDIR)*.vxd
+    -@if exist $(OUTDIR)*.exp del $(OUTDIR)*.exp
+    -@if exist $(OUTDIR)*.lib del $(OUTDIR)*.lib
+    -@if exist $(OUTDIR)*.map del $(OUTDIR)*.map
+    -@if exist $(OUTDIR)*.sym del $(OUTDIR)*.sym
+    -@if exist *.bak del *.bak
diff --git a/amodi/amodi.sln b/amodi/amodi.sln
new file mode 100644 (file)
index 0000000..f2e8599
--- /dev/null
@@ -0,0 +1,18 @@
+
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "amodi", "amodi\amodi.csproj", "{211FD925-C172-418B-A746-83DBCE9D339F}"
+EndProject
+Global
+       GlobalSection(SolutionConfigurationPlatforms) = preSolution
+               Debug|x86 = Debug|x86
+               Release|x86 = Release|x86
+       EndGlobalSection
+       GlobalSection(ProjectConfigurationPlatforms) = postSolution
+               {211FD925-C172-418B-A746-83DBCE9D339F}.Debug|x86.ActiveCfg = Debug|Any CPU
+               {211FD925-C172-418B-A746-83DBCE9D339F}.Release|x86.ActiveCfg = Release|Any CPU
+       EndGlobalSection
+       GlobalSection(SolutionProperties) = preSolution
+               HideSolutionNode = FALSE
+       EndGlobalSection
+EndGlobal
diff --git a/amodi/amodi/MainForm.Designer.cs b/amodi/amodi/MainForm.Designer.cs
new file mode 100644 (file)
index 0000000..571c106
--- /dev/null
@@ -0,0 +1,204 @@
+namespace amodi
+{
+    partial class AutoMODIMainForm
+    {
+        /// <summary>
+        /// 必要なデザイナー変数です。
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// 使用中のリソースをすべてクリーンアップします。
+        /// </summary>
+        /// <param name="disposing">マネージ リソースが破棄される場合 true、破棄されない場合は false です。</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows フォーム デザイナーで生成されたコード
+
+        /// <summary>
+        /// デザイナー サポートに必要なメソッドです。このメソッドの内容を
+        /// コード エディターで変更しないでください。
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.components = new System.ComponentModel.Container();
+            this.tbText = new System.Windows.Forms.TextBox();
+            this.btnDoOCR = new System.Windows.Forms.Button();
+            this.tbFileName = new System.Windows.Forms.TextBox();
+            this.lbFileName = new System.Windows.Forms.Label();
+            this.lbStatus = new System.Windows.Forms.Label();
+            this.tbInfo = new System.Windows.Forms.TextBox();
+            this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);
+            this.miCapturePage = new System.Windows.Forms.ToolStripMenuItem();
+            this.miUseDefLang = new System.Windows.Forms.ToolStripMenuItem();
+            this.miDebugMode = new System.Windows.Forms.ToolStripMenuItem();
+            this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripSeparator();
+            this.miExit = new System.Windows.Forms.ToolStripMenuItem();
+            this.lbPoint = new System.Windows.Forms.Label();
+            this.contextMenuStrip1.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // tbText
+            // 
+            this.tbText.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                        | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.tbText.Location = new System.Drawing.Point(15, 117);
+            this.tbText.Multiline = true;
+            this.tbText.Name = "tbText";
+            this.tbText.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
+            this.tbText.Size = new System.Drawing.Size(265, 199);
+            this.tbText.TabIndex = 7;
+            // 
+            // btnDoOCR
+            // 
+            this.btnDoOCR.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.btnDoOCR.Location = new System.Drawing.Point(87, 54);
+            this.btnDoOCR.Name = "btnDoOCR";
+            this.btnDoOCR.Size = new System.Drawing.Size(98, 28);
+            this.btnDoOCR.TabIndex = 6;
+            this.btnDoOCR.Text = "Do OCR";
+            this.btnDoOCR.UseVisualStyleBackColor = true;
+            this.btnDoOCR.Click += new System.EventHandler(this.btnDoOCR_Click);
+            // 
+            // tbFileName
+            // 
+            this.tbFileName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.tbFileName.Location = new System.Drawing.Point(12, 29);
+            this.tbFileName.Name = "tbFileName";
+            this.tbFileName.Size = new System.Drawing.Size(267, 19);
+            this.tbFileName.TabIndex = 5;
+            // 
+            // lbFileName
+            // 
+            this.lbFileName.AutoSize = true;
+            this.lbFileName.Location = new System.Drawing.Point(13, 9);
+            this.lbFileName.Name = "lbFileName";
+            this.lbFileName.Size = new System.Drawing.Size(53, 12);
+            this.lbFileName.TabIndex = 4;
+            this.lbFileName.Text = "&Filename:";
+            // 
+            // lbStatus
+            // 
+            this.lbStatus.AutoSize = true;
+            this.lbStatus.Location = new System.Drawing.Point(22, 94);
+            this.lbStatus.Name = "lbStatus";
+            this.lbStatus.Size = new System.Drawing.Size(38, 12);
+            this.lbStatus.TabIndex = 8;
+            this.lbStatus.Text = "Status";
+            // 
+            // tbInfo
+            // 
+            this.tbInfo.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.tbInfo.Location = new System.Drawing.Point(16, 322);
+            this.tbInfo.Multiline = true;
+            this.tbInfo.Name = "tbInfo";
+            this.tbInfo.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
+            this.tbInfo.Size = new System.Drawing.Size(262, 51);
+            this.tbInfo.TabIndex = 9;
+            // 
+            // contextMenuStrip1
+            // 
+            this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.miCapturePage,
+            this.miUseDefLang,
+            this.miDebugMode,
+            this.toolStripMenuItem1,
+            this.miExit});
+            this.contextMenuStrip1.Name = "contextMenuStrip1";
+            this.contextMenuStrip1.Size = new System.Drawing.Size(296, 98);
+            // 
+            // miCapturePage
+            // 
+            this.miCapturePage.Name = "miCapturePage";
+            this.miCapturePage.Size = new System.Drawing.Size(295, 22);
+            this.miCapturePage.Text = "Capture &Page";
+            this.miCapturePage.Click += new System.EventHandler(this.miCapturePage_Click);
+            // 
+            // miUseDefLang
+            // 
+            this.miUseDefLang.Name = "miUseDefLang";
+            this.miUseDefLang.Size = new System.Drawing.Size(295, 22);
+            this.miUseDefLang.Text = "Use Default Language (Experimental)";
+            this.miUseDefLang.Click += new System.EventHandler(this.miUseDefLang_Click);
+            // 
+            // miDebugMode
+            // 
+            this.miDebugMode.Name = "miDebugMode";
+            this.miDebugMode.Size = new System.Drawing.Size(295, 22);
+            this.miDebugMode.Text = "&Debug Mode";
+            this.miDebugMode.Click += new System.EventHandler(this.miDebugMode_Click);
+            // 
+            // toolStripMenuItem1
+            // 
+            this.toolStripMenuItem1.Name = "toolStripMenuItem1";
+            this.toolStripMenuItem1.Size = new System.Drawing.Size(292, 6);
+            // 
+            // miExit
+            // 
+            this.miExit.Name = "miExit";
+            this.miExit.ShortcutKeyDisplayString = "Ctrl+W";
+            this.miExit.Size = new System.Drawing.Size(295, 22);
+            this.miExit.Text = "E&xit";
+            this.miExit.Click += new System.EventHandler(this.miExit_Click);
+            // 
+            // lbPoint
+            // 
+            this.lbPoint.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+            this.lbPoint.AutoSize = true;
+            this.lbPoint.Location = new System.Drawing.Point(205, 66);
+            this.lbPoint.Name = "lbPoint";
+            this.lbPoint.Size = new System.Drawing.Size(31, 12);
+            this.lbPoint.TabIndex = 10;
+            this.lbPoint.Text = "Point";
+            // 
+            // AutoMODIMainForm
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(292, 384);
+            this.ContextMenuStrip = this.contextMenuStrip1;
+            this.Controls.Add(this.lbPoint);
+            this.Controls.Add(this.tbInfo);
+            this.Controls.Add(this.lbStatus);
+            this.Controls.Add(this.tbText);
+            this.Controls.Add(this.btnDoOCR);
+            this.Controls.Add(this.tbFileName);
+            this.Controls.Add(this.lbFileName);
+            this.Name = "AutoMODIMainForm";
+            this.Text = "Auto MODI";
+            this.Activated += new System.EventHandler(this.AutoMODIMainForm_Activated);
+            this.contextMenuStrip1.ResumeLayout(false);
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.TextBox tbText;
+        private System.Windows.Forms.Button btnDoOCR;
+        private System.Windows.Forms.TextBox tbFileName;
+        private System.Windows.Forms.Label lbFileName;
+        private System.Windows.Forms.Label lbStatus;
+        private System.Windows.Forms.TextBox tbInfo;
+        private System.Windows.Forms.ContextMenuStrip contextMenuStrip1;
+        private System.Windows.Forms.ToolStripMenuItem miExit;
+        private System.Windows.Forms.ToolStripMenuItem miCapturePage;
+               private System.Windows.Forms.ToolStripMenuItem miDebugMode;
+               private System.Windows.Forms.ToolStripMenuItem miUseDefLang;
+               private System.Windows.Forms.ToolStripSeparator toolStripMenuItem1;
+        private System.Windows.Forms.Label lbPoint;
+    }
+}
+
diff --git a/amodi/amodi/MainForm.cs b/amodi/amodi/MainForm.cs
new file mode 100644 (file)
index 0000000..7103cc6
--- /dev/null
@@ -0,0 +1,403 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Text.RegularExpressions;
+using System.Windows.Forms;
+using System.IO;
+using System.Runtime.InteropServices;
+
+namespace amodi
+{
+    public partial class AutoMODIMainForm : Form
+    {
+
+               const int MARGIN_UNDER_CLICK = 2;       // 次の行までの空白
+
+        const int WM_COPYDATA = 0x4A;
+        const int WM_APP = 0x8000;
+        const int WM_AMODI = (WM_APP + 0x400);
+        const int WM_EXEC_OCR = (WM_APP + 0x410);
+
+        // WM_COPYDATA command
+        const int WMCD_EXISTCHECK = 0x4000;
+               const int WMCD_SETPOINT = 0x4001;
+               const int WMCD_RESTORE_WINDOW = 0x4002;
+
+
+        //[StructLayout(LayoutKind.Sequential)]
+        private struct COPYDATASTRUCT
+        {
+            public IntPtr dwData;
+            public int cbData;
+            public IntPtr lpData;
+        }
+
+        public struct COPYDATASTRUCT_send {
+            public Int32 dwData;        //送信する32ビット値
+            public Int32 cbData;    //lpDataのバイト数
+            public string lpData;   //送信するデータへのポインタ(0も可能)
+        }
+
+        [DllImport("user32.dll", SetLastError = true)]
+        private static extern int PostMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);
+        [DllImport("user32.dll", SetLastError = true)]
+        private static extern int SendMessage(IntPtr hWnd, uint msg, IntPtr wParam, ref COPYDATASTRUCT_send lparam);
+        [DllImport("User32.dll", EntryPoint = "FindWindow")]
+        public static extern Int32 FindWindow(String lpClassName, String lpWindowName);
+
+        MODI.Document md;
+        System.IO.FileSystemWatcher fsw;
+        Queue<string> FileNameQue;
+
+               // parser output //
+               int CurLoc;     // mouse cursor position in text.
+
+        public AutoMODIMainForm()
+        {
+                       InitializeComponent();
+            md = new MODI.Document();
+            FileNameQue = new Queue<string>();
+
+#if true
+            string exepath = System.IO.Path.GetTempPath();
+            exepath += "amodi\\";
+
+                       try
+                       {
+                               System.IO.Directory.Delete(exepath);
+                       } catch { }
+            System.IO.Directory.CreateDirectory(exepath);
+#else
+            string exepath = Application.StartupPath;
+            lbFileName.Text = "Watching... - " + exepath;
+#endif
+            fsw = new System.IO.FileSystemWatcher();
+            fsw.Path = exepath;
+            fsw.IncludeSubdirectories = false;
+            fsw.SynchronizingObject = this;
+            fsw.Changed += new System.IO.FileSystemEventHandler(watcher_Changed);
+            fsw.EnableRaisingEvents = true;
+        }
+        void Cleanup()
+        {
+            fsw.EnableRaisingEvents = false;
+            fsw.Dispose();
+            fsw= null;
+        }
+
+        private void btnDoOCR_Click(object sender, EventArgs e)
+        {
+            DoOCR(tbFileName.Text);
+        }
+
+        private bool DoingOCR = false;
+        bool DoOCR(string filename)
+        {
+            if (DoingOCR) return false;
+            DoingOCR = true;
+
+            bool capture_page = miCapturePage.Checked;
+
+                       ParseFileName(filename);
+
+            lbStatus.Text = "Recognizing... " + filename;
+            tbText.Text = "";
+            tbInfo.Text = "";
+            for (int i = 0; i < 10; i++){
+                try {
+                    md.Create(filename);
+                } catch {
+                    tbInfo.AppendText("MODI Create failure: " + filename + "\r\n");
+                    DBW("MODI Create file failure: " + filename);
+                    System.Threading.Thread.Sleep(30);
+                    continue;
+                }
+                break;
+            }
+            DBW("DoOCR:OCR");
+            try {
+                               if (miUseDefLang.Checked){
+                                       md.OCR(MODI.MiLANGUAGES.miLANG_SYSDEFAULT, true, true);
+                               } else {
+                                       md.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, true, true);
+                               }
+            } catch {
+                DBW("MODI OCR Error: " + filename);
+                md.Close();
+                DBW("DoOCR:Closed");
+                lbStatus.Text = "OCR Error: " + filename;
+                DoingOCR = false;
+                return false;
+            }
+            DBW("DoOCR:Completed");
+            const int UnderGap = MARGIN_UNDER_CLICK; // 単語のある領域より少し下のpointでも検索対象と認識する空白部分(Y方向)
+            int last_x = 0;
+            int lineno = 0;
+                       CurLoc = 0;
+            lbPoint.Text = "" + CursorPoint.X + "," + CursorPoint.Y;
+            tbInfo.AppendText("Page:" + md.Images.Count + " pt:" + CursorPoint.X + "," + CursorPoint.Y + "\r\n");
+            for (int i = 0; i < md.Images.Count; i++)
+            {
+                MODI.Image image = (MODI.Image)md.Images[i];
+                MODI.Layout layout = image.Layout;
+                               bool outok = capture_page;
+                               string prevWord = "";
+                               for (int j = 0; j < layout.Words.Count; j++)
+                {
+                    MODI.Word word = (MODI.Word)layout.Words[j];
+                    bool cr = false;
+                    bool curLocSet = false;
+
+                    for (int k = 0; k < word.Rects.Count; k++)
+                    {
+                        MODI.MiRect rc = (MODI.MiRect)word.Rects[k];
+                        int h = rc.Bottom - rc.Top;
+                        int w = rc.Right - rc.Left;
+
+                        //bool incursor;
+                                               //tbText.AppendText(word.Text + " (" + rc.Left + "," + rc.Top+ ")\r\n");
+                        if (CursorPoint.Y >= rc.Top && CursorPoint.Y <= rc.Bottom+UnderGap){
+                            //incursor = true;
+                                                       if (!outok)
+                                                       {
+                                if (CursorPoint.X < rc.Left) {
+                                    // cursorを飛び越えた
+                                    outok = true;
+                                                                       curLocSet = true;
+                                    if (prevWord.Length != 0) {
+                                        tbText.AppendText(prevWord + " ");
+                                        CurLoc = prevWord.Length + 1;
+                                    }
+                                } else
+                                                                       if (CursorPoint.X >= rc.Left && CursorPoint.X <= rc.Right){
+                                                                               outok = true;
+                                                                               curLocSet = true;
+                                        if (prevWord.Length != 0) {
+                                            tbText.AppendText(prevWord + " ");
+                                            CurLoc = prevWord.Length + 1;
+                                        }
+                                                                       } else {
+                                                                               prevWord = word.Text;
+                                                                       }
+                                                       }
+                        } else {
+                            //incursor = false;
+                        }
+
+                        if (outok){
+                            tbInfo.AppendText(word.Text + " (" + w + "x" + h + ":" + rc.Left + "," + rc.Top + ")\r\n");
+                        }
+
+                        if (last_x > rc.Left){
+                            if (tbText.Text!="")
+                                cr = true;
+                            lineno++;
+                        }
+                        last_x = rc.Left;
+                    }
+
+                    if (outok){
+                        if (cr){
+                            tbText.AppendText("\r\n");
+                            if (curLocSet)
+                               CurLoc += 2;    // CR+LF
+                        }
+
+                        tbText.AppendText(word.Text + " ");
+                    }
+                }
+            }
+            md.Close(false);
+            lbStatus.Text = "Done. " + filename;
+            DoingOCR = false;
+            return true;
+        }
+               private void ParseFileName(string filename)
+               {
+                       Regex r = new Regex(@"\((?<x>\d+),(?<y>\d+)\)");
+                       Match m = r.Match(filename);
+                       if (m.Success)
+                       {
+                               CursorPoint.X = int.Parse(m.Groups["x"].Value);
+                               CursorPoint.Y = int.Parse(m.Groups["y"].Value);
+                       }
+               }
+
+        //イベントハンドラ
+        private void watcher_Changed(System.Object source,
+            System.IO.FileSystemEventArgs e)
+        {
+            switch (e.ChangeType)
+            {
+                case System.IO.WatcherChangeTypes.Changed:
+                    string ext = System.IO.Path.GetExtension(e.FullPath);
+                    if (ext==".gif" || ext==".jpg" || ext==".png" || ext==".tif" || ext==".bmp" || ext==".dib")
+                    {
+                        PostOCR(e.FullPath);
+                    }
+                    break;
+//                case System.IO.WatcherChangeTypes.Created:
+                    //break;
+//                case System.IO.WatcherChangeTypes.Deleted:
+  //                  break;
+            }
+        }
+
+        private void PostOCR(string filename)
+        {
+            FileNameQue.Enqueue(filename);
+            PostMessage(this.Handle, WM_EXEC_OCR, IntPtr.Zero, IntPtr.Zero);
+        }
+
+        private void ExecOCR(string filename)
+        {
+            if (DoOCR(filename)) {
+                string textname = filename + ".txt";
+                for (int i = 0; i < 10; i++) {
+                    try {
+                        StreamWriter writer = new StreamWriter(textname, false, System.Text.Encoding.GetEncoding("utf-16"));
+                        writer.WriteLine(CurLoc.ToString());
+                        writer.Write(tbText.Text);
+                        writer.Close();
+                    } catch {
+                        tbInfo.AppendText("Write Error:" + textname + "\r\n");
+                        System.Threading.Thread.Sleep(30);
+                        continue;
+                    }
+                    break;
+                }
+            }
+            if (!miDebugMode.Checked) {
+                try {
+                    System.IO.File.Delete(filename);
+                }
+                catch
+                {
+                    // 連続して.bmpファイルが作られているため
+                    tbInfo.AppendText("Delete Error:" + filename + "\r\n");
+                }
+            }
+        }
+
+        private void miExit_Click(object sender, EventArgs e)
+        {
+            Close();
+        }
+
+        enum AMODI_CMD
+        {
+            QUERY = 0,
+            PAGE_CAPTURE = 1,
+        };
+        struct POINT
+        {
+            public int x;
+            public int y;
+        };
+        Point CursorPoint;
+        unsafe static Point int2point(IntPtr param)
+        {
+                       POINT pt = (POINT)Marshal.PtrToStructure((IntPtr)param, typeof(POINT));
+            Point p = new Point();
+            p.X = pt.x;
+            p.Y = pt.y;
+            return p;
+        }
+        // interface for external app
+        protected override void WndProc(ref Message m)
+        {
+            if (m.Msg == WM_AMODI)
+            {
+                switch ((AMODI_CMD)m.WParam)
+                {
+                    case AMODI_CMD.QUERY:
+                        m.Result = (IntPtr)m.LParam;
+                        return;
+                    case AMODI_CMD.PAGE_CAPTURE:
+                        m.Result = (IntPtr)(miCapturePage.Checked ? 1 : 0);
+                        return;
+                    default:
+                        break;
+                }
+            } else
+            if (m.Msg == WM_EXEC_OCR) {
+                string filename = "";
+                while (FileNameQue.Count()!=0) {
+                    filename = FileNameQue.Dequeue();
+                }
+                if (filename != "") {
+                    ExecOCR(filename);
+                }
+            } else
+            if (m.Msg == WM_COPYDATA)
+            {
+                COPYDATASTRUCT cds = new COPYDATASTRUCT();
+                cds = (COPYDATASTRUCT)Marshal.PtrToStructure(m.LParam, typeof(COPYDATASTRUCT));
+                if (cds.dwData == (IntPtr)WMCD_EXISTCHECK)
+                {
+                    m.Result = (IntPtr)1;
+                    return;
+                } else
+                               if (cds.dwData == (IntPtr)WMCD_SETPOINT){
+                                       CursorPoint = int2point(cds.lpData);
+                                       Console.WriteLine("Cursor:" + CursorPoint.X + "," + CursorPoint.Y);
+                                       return;
+                               } else
+                               if (cds.dwData == (IntPtr)WMCD_RESTORE_WINDOW)
+                               {
+                                       this.Show();
+                               }
+#if false   // 参考
+                if (cds.cbData > 0)
+                {
+                    byte[] data = new byte[cds.cbData];
+                    Marshal.Copy(cds.lpData, data, 0, cds.cbData);
+                    //あとは data に COPYDATA の内容が入ってるので適宜処理
+                }
+                m.Result = (IntPtr)1;
+#endif
+            }
+            base.WndProc(ref m);
+        }
+
+        private void miCapturePage_Click(object sender, EventArgs e)
+        {
+            miCapturePage.Checked = !miCapturePage.Checked;
+        }
+
+               private void AutoMODIMainForm_Activated(object sender, EventArgs e)
+               {
+                       //this.Hide();
+               }
+
+               private void miDebugMode_Click(object sender, EventArgs e)
+               {
+                       miDebugMode.Checked = !miDebugMode.Checked;
+               }
+
+               private void miUseDefLang_Click(object sender, EventArgs e)
+               {
+                       miUseDefLang.Checked = !miUseDefLang.Checked;
+               }
+
+        static int hWin = 0;
+        void DBW( string msg )
+        {
+               if ( hWin==0 ){
+                       hWin = FindWindow( "TDbgMsgForm", "Debug Messenger" );
+                       if ( hWin==0 ) return;
+               }
+            byte[] bytearray = System.Text.Encoding.Default.GetBytes(msg);
+            int len = bytearray.Length;
+               COPYDATASTRUCT_send cds;
+               cds.dwData = 1; // Indicate String
+               cds.cbData = len + 1;
+            cds.lpData = msg;
+               SendMessage( (IntPtr)hWin, WM_COPYDATA, IntPtr.Zero, ref cds );
+        }
+    }
+}
diff --git a/amodi/amodi/MainForm.resx b/amodi/amodi/MainForm.resx
new file mode 100644 (file)
index 0000000..ad53752
--- /dev/null
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="contextMenuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+</root>
\ No newline at end of file
diff --git a/amodi/amodi/Program.cs b/amodi/amodi/Program.cs
new file mode 100644 (file)
index 0000000..d0a3d05
--- /dev/null
@@ -0,0 +1,35 @@
+using System;
+using System.Collections.Generic;
+//using System.Linq;
+using System.Windows.Forms;
+using System.Threading;
+using System.Reflection;
+
+namespace amodi
+{
+    static class Program
+    {
+        /// <summary>
+        /// アプリケーションのメイン エントリ ポイントです。
+        /// </summary>
+        [STAThread]
+        static void Main()
+        {
+                       Assembly asm = Assembly.GetEntryAssembly();
+                       string path = asm.Location;
+                       path = path.Replace('\\', '_');
+                       Mutex mutex = new Mutex(false, path);
+                       if (mutex.WaitOne(0, false) == false){
+                               // すでに起動している
+                               return;
+                       }
+
+            Application.EnableVisualStyles();
+            Application.SetCompatibleTextRenderingDefault(false);
+            Application.Run(new AutoMODIMainForm());
+
+                       mutex.ReleaseMutex();
+        }
+    }
+}
+
diff --git a/amodi/amodi/Properties/AssemblyInfo.cs b/amodi/amodi/Properties/AssemblyInfo.cs
new file mode 100644 (file)
index 0000000..17350a2
--- /dev/null
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。
+// アセンブリに関連付けられている情報を変更するには、
+// これらの属性値を変更してください。
+[assembly: AssemblyTitle("amodi")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("DokoPop Project")]
+[assembly: AssemblyProduct("amodi")]
+[assembly: AssemblyCopyright("Copyright © DokoPop Project")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// ComVisible を false に設定すると、その型はこのアセンブリ内で COM コンポーネントから 
+// 参照不可能になります。COM からこのアセンブリ内の型にアクセスする場合は、
+// その型の ComVisible 属性を true に設定してください。
+[assembly: ComVisible(false)]
+
+// 次の GUID は、このプロジェクトが COM に公開される場合の、typelib の ID です
+[assembly: Guid("c033b27f-f82d-417e-b219-5878fc8c0169")]
+
+// アセンブリのバージョン情報は、以下の 4 つの値で構成されています:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+// すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を 
+// 既定値にすることができます:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/amodi/amodi/Properties/Resources.Designer.cs b/amodi/amodi/Properties/Resources.Designer.cs
new file mode 100644 (file)
index 0000000..0a1842c
--- /dev/null
@@ -0,0 +1,63 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     このコードはツールによって生成されました。
+//     ランタイム バージョン:4.0.30319.18449
+//
+//     このファイルへの変更は、以下の状況下で不正な動作の原因になったり、
+//     コードが再生成されるときに損失したりします。
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace amodi.Properties {
+    using System;
+    
+    
+    /// <summary>
+    ///   ローカライズされた文字列などを検索するための、厳密に型指定されたリソース クラスです。
+    /// </summary>
+    // このクラスは StronglyTypedResourceBuilder クラスが ResGen
+    // または Visual Studio のようなツールを使用して自動生成されました。
+    // メンバーを追加または削除するには、.ResX ファイルを編集して、/str オプションと共に
+    // ResGen を実行し直すか、または VS プロジェクトをビルドし直します。
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    internal class Resources {
+        
+        private static global::System.Resources.ResourceManager resourceMan;
+        
+        private static global::System.Globalization.CultureInfo resourceCulture;
+        
+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+        internal Resources() {
+        }
+        
+        /// <summary>
+        ///   このクラスで使用されているキャッシュされた ResourceManager インスタンスを返します。
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Resources.ResourceManager ResourceManager {
+            get {
+                if (object.ReferenceEquals(resourceMan, null)) {
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("amodi.Properties.Resources", typeof(Resources).Assembly);
+                    resourceMan = temp;
+                }
+                return resourceMan;
+            }
+        }
+        
+        /// <summary>
+        ///   厳密に型指定されたこのリソース クラスを使用して、すべての検索リソースに対し、
+        ///   現在のスレッドの CurrentUICulture プロパティをオーバーライドします。
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Globalization.CultureInfo Culture {
+            get {
+                return resourceCulture;
+            }
+            set {
+                resourceCulture = value;
+            }
+        }
+    }
+}
diff --git a/amodi/amodi/Properties/Resources.resx b/amodi/amodi/Properties/Resources.resx
new file mode 100644 (file)
index 0000000..af7dbeb
--- /dev/null
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
\ No newline at end of file
diff --git a/amodi/amodi/Properties/Settings.Designer.cs b/amodi/amodi/Properties/Settings.Designer.cs
new file mode 100644 (file)
index 0000000..38239fa
--- /dev/null
@@ -0,0 +1,26 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     このコードはツールによって生成されました。
+//     ランタイム バージョン:4.0.30319.18449
+//
+//     このファイルへの変更は、以下の状況下で不正な動作の原因になったり、
+//     コードが再生成されるときに損失したりします。
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace amodi.Properties {
+    
+    
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
+    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
+        
+        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+        
+        public static Settings Default {
+            get {
+                return defaultInstance;
+            }
+        }
+    }
+}
diff --git a/amodi/amodi/Properties/Settings.settings b/amodi/amodi/Properties/Settings.settings
new file mode 100644 (file)
index 0000000..3964565
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version='1.0' encoding='utf-8'?>
+<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
+  <Profiles>
+    <Profile Name="(Default)" />
+  </Profiles>
+  <Settings />
+</SettingsFile>
diff --git a/amodi/amodi/amodi.csproj b/amodi/amodi/amodi.csproj
new file mode 100644 (file)
index 0000000..549a716
--- /dev/null
@@ -0,0 +1,106 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>8.0.30703</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{211FD925-C172-418B-A746-83DBCE9D339F}</ProjectGuid>
+    <OutputType>WinExe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>amodi</RootNamespace>
+    <AssemblyName>amodi</AssemblyName>
+    <TargetFrameworkVersion>v4.5.1</TargetFrameworkVersion>
+    <TargetFrameworkProfile>
+    </TargetFrameworkProfile>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+  </PropertyGroup>
+  <PropertyGroup>
+    <StartupObject>
+    </StartupObject>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Deployment" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="MainForm.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="MainForm.Designer.cs">
+      <DependentUpon>MainForm.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <EmbeddedResource Include="MainForm.resx">
+      <DependentUpon>MainForm.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Properties\Resources.resx">
+      <Generator>ResXFileCodeGenerator</Generator>
+      <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <Compile Include="Properties\Resources.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Resources.resx</DependentUpon>
+      <DesignTime>True</DesignTime>
+    </Compile>
+    <None Include="app.config" />
+    <None Include="Properties\Settings.settings">
+      <Generator>SettingsSingleFileGenerator</Generator>
+      <LastGenOutput>Settings.Designer.cs</LastGenOutput>
+    </None>
+    <Compile Include="Properties\Settings.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Settings.settings</DependentUpon>
+      <DesignTimeSharedInput>True</DesignTimeSharedInput>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <COMReference Include="MODI">
+      <Guid>{A5EDEDF4-2BBC-45F3-822B-E60C278A1A79}</Guid>
+      <VersionMajor>12</VersionMajor>
+      <VersionMinor>0</VersionMinor>
+      <Lcid>0</Lcid>
+      <WrapperTool>tlbimp</WrapperTool>
+      <Isolated>False</Isolated>
+      <EmbedInteropTypes>True</EmbedInteropTypes>
+    </COMReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
\ No newline at end of file
diff --git a/amodi/amodi/app.config b/amodi/amodi/app.config
new file mode 100644 (file)
index 0000000..37fee69
--- /dev/null
@@ -0,0 +1,3 @@
+<?xml version="1.0"?>
+<configuration>
+<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1"/></startup></configuration>
diff --git a/amodi/readme.txt b/amodi/readme.txt
new file mode 100644 (file)
index 0000000..d323400
--- /dev/null
@@ -0,0 +1,16 @@
+\81¡Tips
+\81EMODI\82Ì\83v\83\8d\83W\83F\83N\83g\82Ö\82Ì\92Ç\89Á\95û\96@
+  VS2013\82Ì\8fê\8d\87\81F
+    - \83\\83\8a\83\85\81[\83V\83\87\83\93\83G\83N\83X\83v\83\8d\81[\83\89\81[\82É\81u\8eQ\8fÆ\90Ý\92è\81v\82Ì\8d\80\96Ú\82ª\82 \82é
+    - \82»\82±\82ð\91I\91ð\81¨\8eQ\8fÆ\82Ì\92Ç\89Á
+    - \8d\91¤\82Ì\83y\83C\83\93\82æ\82è\81A\81uCOM - \83^\83C\83v\83\89\83C\83u\83\89\83\8a\81v\82ð\91I\91ð
+    - \88ê\97\97\82Ì\92\86\82É\81uMicrosoft Office Document Imaging 12.0 Type Libray\81v\82ª\82 \82é\82Ì\82Å\82»\82ê\82ð\91I\91ð\82µ\82ÄOK
+
+\81E(MODI.Image)md.Images[i] \82Ì\82Æ\82±\82ë\82Åcompile error\82ª\8fo\82é\82Æ\82«
+  - \8dª\96{\93I\82È\89ð\8c\88\82Å\82Í\82È\82¢\82ª\81Aamodi.csproj \82Ì\92\86\82Ì\8e\9f\82Ì\8d\80\96Ú\82ð\95Ï\8dX\81E\8dí\8f\9c\82·\82é
+    - "x86"\82ð\82·\82×\82Ä"AnyCPU"\82É
+    - TargetFrameworkVersion\82ðv4.0\82©\82çv4.5\82É\95Ï\8dX
+    - <Prefer32Bit>false</Prefer32Bit>\82ð\8dí\8f\9c
+    - <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\82ð\8dí\8f\9c
+    \82±\82ê\82Åcompile error\82Íthrough\82·\82é\82æ\82¤\82¾
+
diff --git a/change_iss.pl b/change_iss.pl
new file mode 100644 (file)
index 0000000..01f6f9a
--- /dev/null
@@ -0,0 +1,46 @@
+#!perl
+# Change the string in the .iss file.
+
+sub usage
+{
+print << "EOT";
+Usage:
+  change_iss.pl [input filename] [section name] [key name] [substituted value]
+EOT
+}
+
+$u_input = $ARGV[0];
+$u_section = $ARGV[1];
+$u_key = $ARGV[2];
+$u_value = $ARGV[3];
+
+if (!$u_value){
+       usage();
+       exit(1);
+}
+
+open F,$u_input or die "open error $u_input";
+
+while (<F>){
+       if (length>0){
+               if (/^\[(.+)\]/){
+                       # Section start
+                       $section = $1;
+                       $key = '';
+               } else {
+                       if (/^(.+?)=/){
+                               # Found a key.
+                               $key = $1;
+                               if ($u_section =~ /^$section$/i){
+                                       # found the same section
+                                       if ($u_key =~ /^$key$/i){
+                                               $_ = "$key=$u_value\n";
+                                       }
+                               }
+                       }
+               }
+       }
+       print $_;
+}
+
+
diff --git a/cpr.bat b/cpr.bat
new file mode 100644 (file)
index 0000000..9b98c4d
--- /dev/null
+++ b/cpr.bat
@@ -0,0 +1,3 @@
+copy DCHook\Win32\Release\DCHook.dll DCHookTest\DKPUHK.DLL
+copy DCHook\x64\Release\DCHook.dll DCHookTest\DKPUHK64.DLL
+copy DCHook64\dchk64\x64\Release\dchk64.exe DCHookTest\DKPUHK64.exe
diff --git a/dchook.ind b/dchook.ind
new file mode 100644 (file)
index 0000000..5a3041f
--- /dev/null
@@ -0,0 +1,232 @@
+[Finish]
+Disp=0
+Comp=1148
+[Jump]
+Check=0
+Date=0
+Del=0
+Dir=0
+Div=0
+Exe=0
+Ext=0
+File=0
+Go=0
+Go2=0
+Menu=0
+Pack=0
+Title=0
+Upl=0
+Reg=0
+Ask=0
+News=0
+Error=0
+Back=0
+Uninstall=0
+[Setup]
+NoUninstall=0
+OnlyUninstall=0
+[Exe]
+Name=DKPP111.exe
+IconName=DKPP.EXE
+Icon=0
+#No1=#1
+#No2=#3
+[Title]
+Setup=DokoPop!
+Company=DokoPopProject
+Soft=DKPP
+[Del]
+Auto=0
+Checked=1
+ShowError=1
+0=
+Force=1
+Reboot=1
+[Dir]
+Root=%programs%\DokoPop
+1=
+[DirRemove]
+1=
+[File0]
+Name=D:\SRC\DCHook\DKPP.EXE
+Dir=
+Del=1
+News=0
+NoAsk=1
+NoError=0
+Date=0
+[File1]
+Name=D:\SRC\DCHook\DKPP.TXT
+Dir=
+Del=1
+News=0
+NoAsk=1
+NoError=0
+Date=0
+[File2]
+Name=D:\SRC\DCHook\DKPPHK.DLL
+Dir=
+Del=1
+News=0
+NoAsk=1
+NoError=0
+Date=0
+[File3]
+Name=D:\SRC\DCHook\HK95D.VXD
+Dir=
+Del=1
+News=0
+NoAsk=1
+NoError=0
+Date=0
+[File4]
+Name=
+Dir=
+Del=1
+News=0
+NoAsk=1
+NoError=0
+Date=0
+[File5]
+Name=
+[CopyFile]
+DefaultNo=0
+Reboot=1
+Question=0
+[Pack]
+Copy=0
+Del=0
+[Menu]
+Name=DokoPop!
+[Check]
+Desktop=0
+Startup=2
+Menu=2
+Ext=0
+Send=0
+[Go]
+Readmename=DKPP.TXT
+Readmeno=1
+Desktop=0
+Startup=1
+Menu=1
+Auto=0
+Agree=0
+[Go2]
+Make0=
+Erase0=
+[Menu0]
+Name=DokoPop!
+Path=DKPP.EXE
+Arg=
+Icon=DKPP.EXE
+Work=
+Short=
+IconNo=0
+Show=0
+Init=0
+[Menu1]
+Name=DokoPop! \90à\96¾\8f\91
+Path=DKPP.TXT
+Arg=DKPP.TXT
+Icon=DKPP.TXT
+Work=
+Short=
+IconNo=0
+Show=0
+Init=1
+[Menu2]
+Name=
+[Send0]
+Name=
+[Desktop]
+Name=
+[Startup]
+Name=DokoPop!
+Path=DKPP.EXE
+Arg=
+Icon=DKPP.EXE
+Work=
+Short=
+IconNo=0
+Show=0
+Init=0
+[Ext0]
+Ext=
+[Date]
+Year=2002
+Month=12
+Day=9
+Hour=1
+Minute=11
+Second=0
+Comp=1
+Exe=1
+[Upl]
+Check=IBM PC/AT\8cÝ\8a·\8b@,NT4.0,Win98
+Env=MS-Windows 98/NT4.0
+Key=DKPP,PDIC,$WIN32,#APP,#UTL
+Kind=\83t\83\8a\81[\83E\83F\83A
+Make=
+Man=TaN(SGM00353)
+Title=DokoPop!
+Trans=\93]\8dÚ\8e©\97R
+Gal=0
+Win=0
+[Intr]
+Count=0
+[Hist]
+Count=0
+[Div]
+New=DKPPC
+Go=0
+Top=0
+Delete=0
+Num=1457664
+TopNum=1457664
+[Reg]
+Make0=
+Erase0=
+[Back]
+Do=0
+0=fill,0,0,0
+1=mode,bottom
+2=rect,0,0,%100,%80
+3=gradation,0,0,0,0,0,255
+4=mode,bottom
+5=rect,%1,%1
+6=font,0,0,0,-21,0,0,0,700,255,0,0,0,3,2,1,18,Times New Roman
+7=height,%10
+8=|Doko Pop! Ver.1.11
+9=rect,%2,%2
+10=font,255,255,0,-21,0,0,0,700,255,0,0,0,3,2,1,18,Times New Roman
+11=height,%10
+12=|Doko Pop! Ver.1.11
+13=/-----
+14=
+[Readme]
+0=page,install
+1=mode,fill
+2=fill,64,192,192
+3=mode,right
+4=rect,5,0
+5=font,255,255,255,-36,0,0,0,400,0,0,0,0,3,2,1,34,Arial
+6=|Welcome to 
+7=font,255,255,255,-36,0,0,0,400,0,0,0,128,3,2,1,50,\82l\82\82o\83S\83V\83b\83N
+8=|Doko Pop!
+9=rect,7,2
+10=font,0,0,0,-36,0,0,0,400,0,0,0,128,3,2,1,50,\82l\82\82o\83S\83V\83b\83N
+11=|Welcome to 
+12=font,0,0,0,-36,0,0,0,400,0,0,0,128,3,2,1,50,\82l\82\82o\83S\83V\83b\83N
+13=|DokoPop!
+14=font,0,0,0,-12,0,0,0,400,0,0,0,128,3,2,1,50,\82l\82\82o\83S\83V\83b\83N
+15=mode,bottom
+16=rect,7,70
+17=|
+18=|\83A\83\93\83C\83\93\83X\83g\81[\83\8b\82Í
+19=|
+20=|\83R\83\93\83g\83\8d\81[\83\8b\83p\83l\83\8b\82Ì\81u\83A\83v\83\8a\83P\81[\83V\83\87\83\93\82Ì\92Ç\89Á\82Æ\8dí\8f\9c\81v\82©\82ç
+21=|
+22=|\81uDokoPop!\81v\82ð\91I\91ð\81\95\8eÀ\8ds\82µ\82Ä\82­\82¾\82³\82¢\81D
+23=/-----
+No=24
diff --git a/dchook.tpl b/dchook.tpl
new file mode 100644 (file)
index 0000000..024ef72
--- /dev/null
@@ -0,0 +1,678 @@
+#!perl -S mktpl.pl dchook.tpl
+------------------------------------------------------------------------
+ DCHOOK Document Template
+------------------------------------------------------------------------
+%NEWMAJOR=1
+%NEWMINOR=11
+%POST=
+%OLDMAJOR=1
+%OLDMINOR=10
+%OLDPOST=
+
+%DATE_Y=02             \8cö\8aJ\93ú
+%DATE_M=12
+%DATE_D=09
+
+%TIME_H=01
+%TIME_M=11
+%TIME_S=00
+
+%DATE_YY=20%DATE_Y%
+%VERSION = %NEWMAJOR%.%NEWMINOR%%POST%
+%VER=%NEWMAJOR%%NEWMINOR%
+%OLDVERSION=%OLDMAJOR%.%OLDMINOR%%OLDPOST%
+%OLDVER=%OLDMAJOR%%OLDMINOR%
+%DATE=%DATE_YY%.%DATE_M%.%DATE_D%
+
+%ARC=dchook-%VERSION%.lzh
+%DKPPARC=DKPP%VER%.EXE
+
+%HTML=S:\Web\NIFTY\
+%MYSOFT=S:\down\MySoft
+
+#\88È\89º\82ÍMK.BAT\97p
+%FDATE=%DATE_M%/%DATE_D%/%DATE_Y%
+%FTIME=%TIME_H%:%TIME_M%:%TIME_S%
+%PDNEW=%VER%
+%PDOLD=%OLDVER%
+
+%VARFILE=%HTML%pdic-download.var
+%IND=dchook.ind
+%CHGINI=perl -S chgini.pl
+
+%KEY1=DOKOPOP
+%KEY2=PDIC
+%KEY3=$WIN32
+%KEY4=#APP
+%KEY5=#EDU
+
+****************** UPDATE \93à\97e **************************************
+<*UPDATE.TXT
+>> Ver.1.12 <<
+* \8e«\8f\91\82ª\91å\82«\82¢\8fê\8d\87\82É\81APDIC\8bN\93®\8cã\82Ì\8dÅ\8f\89\82Ì\83|\83b\83v\83A\83b\83v\82ª\82Å\82«\82È\82¢\82Æ\82«\82ª\82 \82Á\82½
+##EOF
+******************** DokoPop! \82Ì\95Ï\8dX\97\9a\97ð ****************************
+##<*HISTORY.TXT
+##>UPDATE.TXT
+
+>> Ver.1.11 <<
+\81EUnicode\94Å\91Î\89\9e\82Ì\82½\82ß\82É\93à\95\94\8f\88\97\9d\82ð\95Ï\8dX
+
+>> Ver.1.10 <<
+\81\9bDokoPop\82Å\83|\83b\83v\83A\83b\83v\82µ\82½\83E\83B\83\93\83h\83E\8fã\82Å\82³\82ç\82É\83|\83b\83v\83A\83b\83v\82·\82é
+  \82±\82Æ\82ª\89Â\94\\82É\81i\98A\91±\83|\83b\83v\83A\83b\83v\81j\81iPDIC for Win32\82ÍVer.4.50\88È\8fã\82ª\95K\97v\81j
+\81\9b\93ú\96{\8cê\8d¬\8dÝ\82Ì\95\8fÍ\82Å\82à\90³\82µ\82­\93®\8dì\82·\82é\82æ\82¤\82É\82µ\82½\81B
+\81@\81i\90Ý\92è\83_\83C\83A\83\8d\83O\82Ì\81h\93ú\96{\8cê\82ð\96³\8e\8b\82·\82é\81h\82Å\90Ø\82è\91Ö\82¦\89Â\94\\81j
+
+>> Ver.1.02 <<
+* DKPP.EXE\82Ì\83o\81[\83W\83\87\83\93\90Ý\92è\82ð\8aÔ\88á\82Á\82Ä\82¢\82½
+
+>> Ver.1.01 <<
+* Windows9x\82Å\83|\83b\83v\83A\83b\83v\82µ\82È\82¢\8fê\8d\87\82ª\82 \82Á\82½(IE\82È\82Ç)
+\81E\82»\82ê\82É\91Î\8f\88\82µ\82½\82½\82ß\81AWindows95\82Í\93®\8dì\91Î\8fÛ\8aO\82É
+* \89E\83N\83\8a\83b\83N\8c\9f\8dõ\90Ø\82è\91Ö\82¦\82Å\83\8a\83\\81[\83X\83\8a\81[\83N\82ª\94­\90\82µ\82Ä\82¢\82½
+* \83q\83b\83g\82µ\82È\82¢\92P\8cê\82ª\82 \82é\82Æ\83\81\83\82\83\8a\83\8a\81[\83N\82ª\94­\90\82µ\82Ä\82¢\82½
+
+>> Ver.1.00 <<
+* Windows9x/Me\8cn\82ÌOS\82Å\82Ì\93®\8dì\82ð\88À\92è\89»\82µ\82½
+* \8e«\8f\91\83O\83\8b\81[\83v\8ew\92è\82ð\90³\8fí\82É\93®\8dì\82·\82é\82æ\82¤\82É\82µ\82½
+  \81y\92\8d\88Ó\81z\82±\82Ì\8b@\94\\82ÍPDIC for Win32 Ver.4.40\82©\82ç\82Ì\91Î\89\9e\82É\82È\82è\82Ü\82·
+\81E\8c\9f\8dõ\82Ì\83L\81[\82Ì\91g\82Ý\8d\87\82í\82¹\82ð\83J\83X\83^\83}\83C\83Y\82Å\82«\82é\82æ\82¤\82É\82µ\82½
+\81E\83t\83@\83C\83\8b\8d\\90¬\82ð\95Ï\8dX
+\81E\98A\91±\82µ\82Ä\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82ª\82Å\82«\82é\82æ\82¤\82É\82µ\82½
+\81E\82Ù\82©\95\\8e¦\82Ì\95Ï\8dX\82È\82Ç
+
+>> Ver.0.98 <<
+\81\9b\83}\83E\83X\89E\83N\83\8a\83b\83N\82Ì\82Ý\82Å\83|\83b\83v\83A\83b\83v\82ð\89Â\94\\82É
+\81@\81iCtrl+Alt+\89E\83N\83\8a\83b\83N\82ÅON/OFF\82Å\82«\82Ü\82·\81j
+* \81h\8e«\8f\91\83O\83\8b\81[\83v\82ª\8aJ\82¯\82Ü\82¹\82ñ\81h\82Æ\8fo\82é\82±\82Æ\82ª\82 \82Á\82½
+* \8dÅ\8f¬\89»\82Å\8bN\93®\82µ\82½\8fê\8d\87\81A\83^\83X\83N\83o\81[\82É\83A\83C\83R\83\93\82ª\8ec\82Á\82Ä\82¢\82½
+
+>> Ver.0.97 <<
+* \8e«\8f\91\83O\83\8b\81[\83v\82Ì\95Ï\8dX\82ª\82Å\82«\82È\82­\82È\82Á\82Ä\82¢\82½
+* IE\82Å\83q\83b\83g\82µ\82È\82¢\82±\82Æ\82ª\82 \82Á\82½
+
+>> Ver.0.96 <<
+* PDIC\82ð\8e©\93®\8bN\93®\82Å\82«\82È\82©\82Á\82½(\93Ç\82Ý\8d\9e\82Þregistry\82ð\8aÔ\88á\82Á\82Ä\82¢\82½)
+* \82Ç\82±\83|\83b\83v\82ð\8dÅ\8f¬\89»\82Å\8bN\93®\82µ\82½\8fê\8d\87\81A\83X\83v\83\89\83b\83V\83\85\83E\83B\83\93\83h\83E\82ª\8fÁ\82¦\82È\82©\82Á\82½
+
+>> Ver.0.95 <<
+??
+
+>> Ver.0.94 <<
+* \83X\83v\83\89\83b\83V\83\85\82ð\94ñ\95\\8e¦\82É\82µ\82½\8fê\8d\87\82Ì\95s\8bï\8d\87\8fC\90³
+
+>> Ver.0.94 <<
+* \8bN\93®\8e\9eDLL\8f\89\8aú\89»\8e¸\94s(Win98)
+* \93ú\96{\8cê\8d¬\82\82è\82Ì\95\82Å\83e\83L\83X\83g\92\8a\8fo\88Ê\92u\82ª\82¸\82ê\82Ä\82¢\82½(Win98)
+
+>> Ver.0.93 <<
+\81E\8bN\93®\83X\83v\83\89\83b\83V\83\85\95Ï\8dX
+\81E\83X\83v\83\89\83b\83V\83\85\95\\8e¦\81E\94ñ\95\\8e¦
+\81E\83X\83v\83\89\83b\83V\83\85\83r\83b\83g\83}\83b\83v\82Ì\83J\83X\83^\83}\83C\83Y
+\81E\83C\83\93\83X\83g\81[\83\89\92Ç\89Á
+* \83\81\83\82\92 \82Å\88Ù\8fí\8fI\97¹(NT)
+* \93ú\96{\8cê\8d¬\82\82è\82Ì\95\82Å\83e\83L\83X\83g\92\8a\8fo\88Ê\92u\82ª\82¸\82ê\82Ä\82¢\82½
+
+>> Ver.0.92 <<
+\81E\88À\92è\90«\8cü\8fã
+
+>> Ver.0.90 <<
+\81E\8dÅ\8f\89\82Ì\8cö\8aJ
+##EOF
+****************** \8e©\8cÈ\8fÐ\89î ******************************************
+##<*PROB.TXT
+\81EAcrobat Reader\8fã\82Å\82Í\93®\8dì\82µ\82È\82¢
+\81EOpera\8fã\82Å\82Í\93®\8dì\82µ\82È\82¢
+\81EDOS\91\8b\8fã\82Å\82Í\93®\8dì\82µ\82È\82¢
+\81E16bit\83A\83v\83\8a\8fã\82Å\82Í\93®\8dì\82µ\82È\82¢
+\81E\95¡\90\94\8ds\82É\82Ü\82½\82ª\82é\8fn\8cê\82Í\83q\83b\83g\82µ\82È\82¢
+##EOF
+
+##<*INTRO.TXT
+\81@DokoPop! - \82Ç\82±\83|\83b\83v\81\82Í\81ACtrl+\83}\83E\83X\89E\83N\83\8a\83b\83N\82Å\81A
+\81@\83}\83E\83X\83J\81[\83\\83\8b\88Ê\92u\82Ì\89p\92P\8cê\81E\89p\8fn\8cê\82ð\8c\9f\8dõ\82µ\81A\83|\83b\83v\83A\83b\83v\95\\8e¦\82µ\82Ü\82·\81B
+
+\81@\82Ç\82±\83|\83b\83v\81\82Í PDIC for Win32\82ÌDDE\8b@\94\\82ð\97\98\97p\82µ\82Ä\82¢\82Ü\82·\81B
+\81@\95Ê\93rPDIC for Win32\82ð\93ü\8eè\82µ\82Ä\89º\82³\82¢\81B
+
+\81@PDIC for Win32\82Ì\93ü\8eè\90æ(\95K\90{)\81F
+  http://homepage3.nifty.com/TaN/pdic-download.html
+
+\81@\83\\81[\83X\83t\83@\83C\83\8b\81F
+  http://homepage3.nifty.com/TaN/prog-tips.html  %ARC%
+##EOF
+
+##<DKPPu.TXT
+========================================================================
+\81y\83\83\83g\96¼\81z  \82Ç\82±\83|\83b\83v\81I Ver.%VERSION%
+\81y\93o  \98^  \96¼\81z\81@%DKPPARC%
+\81y\83o\83C\83g  \90\94\81z  <FILESIZE:%DKPPARC%> Bytes
+\81y\8c\9f\8dõ  \83L\81[\81z\81@1:%KEY1% 2:%KEY2% 3:%KEY3% 4:%KEY4% 5:%KEY5%
+\81y\92\98\8dì\8c   \8eÒ\81z\81@\82È\82µ
+\81y\8cf  \8dÚ  \8eÒ\81z\81@TaN(SGM00353)
+\81y\91Î\89\9e  \8b@\8eí\81z\81@MS-Windows 98/Me/NT4.0/2000/XP
+\81y\93®\8dì  \8am\94F\81z\81@IBM PC/AT\8cÝ\8a·\8b@,NT4,0,Win98,2000
+\81y\8cf  \8dÚ  \93ú\81z\81@%DATE%
+\81y\8dì\90¬  \95û\96@\81z\81@%DKPPARC% \82ð\8eÀ\8ds\82·\82é
+\81y¿Ìijª±\8eí\95Ê\81z\81@\83t\83\8a\81[\83E\83F\83A
+\81y\93]\8dÚ  \8fð\8c\8f\81z  \93]\8dÚ\8e©\97R
+========================================================================
+\81y\83\\83t\83g\8fÐ\89î\81z
+
+##>INTRO.TXT
+
+##>UPDATE.TXT
+
+\8c»\8dÝ\82Ì\96â\91è\93_
+
+##>PROB.TXT
+
+========================================================================
+\83_\83E\83\93\83\8d\81[\83h\83t\83@\83C\83\8b\96¼\82Í\81y%DKPPARC%\81z\82Å\82·\81B
+##EOF
+
+<README.TXT
+==========================================================================
+                        DCHook sample program
+==========================================================================
+Introduction -------------------------------------------------------------
+
+DCHook\82Í\81AWindows\82É\82¨\82¢\82Ä\94C\88Ó\82ÌWindow\82Ì\94C\88Ó\82Ì\8dÀ\95W\88Ê\92u\82©\82ç
+\82»\82±\82É\95`\89æ\82³\82ê\82Ä\82¢\82é\83e\83L\83X\83g\82ð\8fE\82Á\82Ä\82­\82é\83v\83\8d\83O\83\89\83\80\82Å\82·\81B
+\82¿\82å\82Á\82Æ\82â\82Á\82Ä\82Ý\82½\82ç\8aÈ\92P\82É\93®\82¢\82½\82Ì\82Å\81A\8cö\8aJ\82·\82é\82±\82Æ\82É\82µ\82Ü\82µ\82½\81B
+
+\82±\82Ì\83v\83\8d\83O\83\89\83\80\82Ì\89\9e\97p\82Æ\82µ\82Ä\82Í\81A
+\81E\94C\88Ó\82Ì\83E\83B\83\93\83h\83E\82Ì\83e\83L\83X\83g\82ð\8fE\82¤
+\81E\91S\83E\83B\83\93\83h\83E\82Ì\83e\83L\83X\83g\82ðgrep\82·\82é
+\81E\83J\81[\83\\83\8b\88Ê\92u\82Ì\83e\83L\83X\83g\82ð\8fE\82¤
+\82Æ\82¢\82Á\82½\88ê\95\97\95Ï\82í\82Á\82½\82±\82Æ\82ª\82Å\82«\82Ü\82·\81B
+\82±\82Ì\83v\83\8d\83O\83\89\83\80\82É\82Í\8eQ\8dl\82Æ\82µ\82Ä\81ADokoPop\82Æ\82¢\82¤\83T\83\93\83v\83\8b\83v\83\8d\83O\83\89\83\80\82ð
+\93Y\95t\82µ\82Ä\82 \82è\82Ü\82·\81B
+
+install ------------------------------------------------------------------
+
+\88³\8fk\83t\83@\83C\83\8b\82ð\93K\93\96\82È\82Æ\82±\82ë\82É\89ð\93\80\82µ\82Ä\82­\82¾\82³\82¢\81B
+\83f\83B\83\8c\83N\83g\83\8a\95t\82«\82Å\89ð\93\80\82·\82é\95K\97v\82ª\82 \82è\82Ü\82·\81B
+
+\93Y\95t\83t\83@\83C\83\8b -------------------------------------------------------------
+
+target\82É\82È\82é\82à\82Ì\81F
+
+dchook.dll (NT/2K\94Å or 9x\94Å)
+hk95d.vxd  (9x\90ê\97p)
+dchooktest.exe (NT/2K\82Æ9x8\8b¤\97p)
+
+\95K\97v\82È\8aJ\94­\8aÂ\8b« -----------------------------------------------------------
+C++ Builder 5
+Visual C++ 6.0
+Windows Device Driver Kit (DDK) for Windows 98
+
+\8dì\90¬\95û\96@ -----------------------------------------------------------------
+
+--------------------------------
+dchook.dll
+--------------------------------
+\95K\97v\82È\8aÂ\8b«\81F
+Visual C++
+
+\8dì\90¬\95û\96@\81F
+nmake -fdchook.mak
+
+--------------------------------
+hk95d.vxd
+--------------------------------
+\95K\97v\82È\8aÂ\8b«
+Visual C++, DDK for Win98
+
+\95Ï\8dX\89Ó\8f\8a\81F
+makefile
+INC32\82ðDDK\82Ìroot path\82É(e:\98ddk\82È\82Ç)
+
+\8dì\90¬\95û\96@\81F
+nmake
+\81¦\82±\82Ì\8eÀ\8ds\91O\82ÉVisual-C++\82¨\82æ\82ÑDDK\82Ì\8aÂ\8b«\82ª\90Ý\92è\82³\82ê\82Ä\82¢\82é\95K\97v\82ª\82 \82è\82Ü\82·\81B
+\81@\83o\83b\83`\83t\83@\83C\83\8b\82Å\8aÂ\8b«\90Ý\92è\82·\82é\82æ\82¤\82É\82È\82Á\82Ä\82¢\82é\8fê\8d\87\82Í\81A
+\81@\8dì\90¬\91O\82É\83o\83b\83`\83t\83@\83C\83\8b\82ð\8eÀ\8ds\82µ\82Ä\82­\82¾\82³\82¢\81B
+\81@\81ivcvars32.bat\81Asetenv.bat e:\98ddk \82Æ\82¢\82Á\82½\8a´\82\82Å
+\81@\81¨\8fÚ\82µ\82­\82ÍVisual-C++\81ADDK\82É\95t\91®\82Ì\90à\96¾\8f\91\82ð\8eQ\8fÆ\81j
+
+--------------------------------
+dchooktest.exe
+--------------------------------
+\95K\97v\82È\8aÂ\8b«\81F
+C++ Builder 5
+
+\95Ï\8dX\89Ó\8f\8a\81F
+\93Á\82É\82È\82µ
+\81¦DEBUG\82ðdefine\82·\82é\82Æ\81ADEBUG\97p\82Ì\93®\8dì\82É\82È\82è\82Ü\82·\81B
+
+\8dì\90¬\95û\96@\81F
+dchooktest.bpr\82ðC++Builder\82Å\8aJ\82¢\82Ä\82­\82¾\82³\82¢\81B
+C++Builder4\82Å\82à\82Å\82«\82é\82©\82à\81A\82Æ\8ev\82Á\82Ä C++Builder4\88È\91O\97p\82É
+dchooktest.mak\82à\93Y\95t\82µ\82Ä\82 \82è\82Ü\82·\81B\91½\8f­\82Ì\95Ï\8dX\82Å\8eg\82¦\82é\82©\82à\82µ\82ê\82Ü\82¹\82ñ\81B
+
+\82 \82Æ\82Í\81A\83\81\83j\83\85\81[\82©\82ç Project | \8dÄ\8d\\92\82Å\8dì\90¬\82µ\82Ü\82·\81B
+
+\8eÀ\8ds\81F
+dchooktest.exe\82ð\8eÀ\8ds\82µ\82Ü\82·\81B
+
+\81\9a\92\8d\88Ó\93_\81F
+DCHookTest.exe\82ªLoad\82·\82éDLL\82Í\81A
+DKPPHK.DLL -> DCHOOK.DLL
+\82Ì\8f\87\94Ô\82Å\90æ\82É\8c©\82Â\82©\82Á\82½\95û\82ðload\82·\82é\8ed\97l\82É\82È\82Á\82Ä\82¢\82Ü\82·\81B
+DEBUG\82ðdefine\82µ\82½\82Æ\82«\82Í\81ADCHOOK.DLL\82Ì\82Ý\82ðload\82µ\82æ\82¤\82Æ\82µ\82Ü\82·\81B
+
+\83v\83\8d\83O\83\89\83\80\90à\96¾ -----------------------------------------------------------
+
+\88ê\94Ô\96ï\89î\82È\82à\82Ì\82Í\81Adchook.cpp\82Å\82µ\82å\82¤\81B
+\8e\8e\8ds\8dö\8cë\82µ\82È\82ª\82ç\82à\92Z\8e\9e\8aÔ\82Å\88ê\8bC\82É\8f\91\82«\8fã\82°\82½\82à\82Ì\82Å\82·\82Ì\82Å\81A
+\82©\82È\82è\89\98\82­\82È\82Á\82Ä\82¢\82Ü\82·\81B
+#define\82É\82æ\82éswitch\82É\82Í\81A\90F\82ñ\82È\91g\82Ý\8d\87\82í\82¹\82ª\82 \82è\82Ü\82·\82ª\81A
+\8c»\8fó\88È\8aO\82Ì\90Ý\92è\82É\82·\82é\82Æ\90³\8fí\82É\93®\8dì\82µ\82È\82©\82Á\82½\82è\81A
+compile\82³\82¦\82à\82Å\82«\82È\82¢\82Í\82¸\82Å\82·\81B\82¾\82Á\82½\82ç\81A\90®\97\9d\82µ\82È\82³\82¢\81I
+\82Æ\8c¾\82í\82ê\82»\82¤\82Å\82·\82ª\81A\8d¡\8cã\95K\97v\82Æ\82È\82é\82Æ\82±\82ë\82ª\82 \82é\82©\82à\82µ\82ê\82È\82¢\82Ì\82Å\81A
+\82»\82Ì\82Ü\82Ü\82É\82µ\82Ä\82 \82è\82Ü\82·\81B
+
+\93®\8dì\8c´\97\9d\82Æ\82µ\82Ä\82Í\81A\83e\83L\83X\83g\82ð\8eæ\93¾\82µ\82½\82¢window\82É\91Î\82µ\82Ä
+\8dÄ\95`\89æ\96½\97ß\82ð\91\97\82è\81A\8dÄ\95`\89æ\92\86\82Ì\83e\83L\83X\83g\95`\89æ\8aÖ\90\94\82Ì\93à\97e\82ð
+\89¡\8eæ\82è\82·\82é\82±\82Æ\82Å\8fE\82Á\82Ä\82«\82Ü\82·\81B
+
+\8dÅ\8f\89\8dì\82è\8en\82ß\82½\8d \82Í\81AWindows\82©\82çDC\82ð\93n\82µ\82Ä\82¢\82é\8aÖ\90\94\82ðhook\82µ\81A
+DC\82ðmetafile\82Å\8dÄ\90\82·\82ê\82Î\8aÈ\92P\82\82á\82È\82¢\82©\81H\82Æ\8ev\82Á\82Ä\82â\82Á\82Ä\82Ý\82Ü\82µ\82½\81B
+\82»\82¤\82µ\82½\82ç\82 \82Á\82¯\82È\82­\93®\82¢\82½\82Ì\82Å\82·\82ª\81A\95Ê\82Ìapplication\82Å\82â\82Á\82Ä\82Ý\82é\82Æ
+\82¤\82Ü\82­\93®\82©\82È\82¢\82±\82Æ\82ª\82 \82è\82Ü\82µ\82½\81B
+\8c´\88ö\82Í\81ACreateCompatibleBitmap\82Åbitmap\82ð\8dì\90¬\82µ\81A\82»\82±\82Ö\88ê\92U\95`\89æ
+\82µ\82Ä\82©\82ç\81ABitBlt\82Åwindow\82É\93\\82è\95t\82¯\82éapplication\82ª\82 \82Á\82½\82©\82ç\82Å\82·\81B
+\82»\82¤\82È\82é\82Æ\81ADC\82¾\82¯\82Å\82Í\83e\83L\83X\83g\95`\89æ\8fî\95ñ\82ª\93¾\82ç\82ê\82Ü\82¹\82ñ\82Ì\82Å\81A
+\95K\97v\82Ètext\95`\89æ\8aÖ\90\94\82ðhook\82µ\82Ä\82â\82é\95K\97v\82ª\82 \82è\82Ü\82·\81B
+(\82Ù\82©\82É\82àBeginPaint()\82Å\93n\82³\82ê\82éDC\82Å\82Í\82È\82­\81AGetDC()\82Å
+\93¾\82½DC\82É\91Î\82µ\82Ä\95`\89æ\82µ\82Ä\82¢\82éapplicaton\82É\91Î\82µ\82Ä\82à\82¤\82Ü\82­\82¢\82«\82Ü\82¹\82ñ\82Å\82µ\82½)
+
+\82±\82Ì\91O\82É\82±\82Ìhook\82Ì\95û\96@\82Å\82·\82ª\81ANT\82Æ9x\82Å\82Í\88Ù\82È\82è\82Ü\82·\81B
+NT\82Í\8aeapplication\82ª\93Æ\97§\82Ìmemory\8bó\8aÔ\82Å\82 \82è\81Auser32.dll,gdi32.dll\82à
+application\96\88\82Ìmemory\8bó\8aÔ\82É\91\8dÝ\82µ\82Ä\82¢\82é\82Ì\82Å\82·\82ª\81A9x\82Å\82Í\81A
+\82¢\82«\82È\82è\8b¤\97Lmemory\82Ö\8ds\82Á\82Ä\82µ\82Ü\82Á\82Ä\82¢\82é\82Ì\82Å\81A\8aÈ\92P\82É\82Íhook\82Å\82«\82Ü\82¹\82ñ\81B
+
+API\82Ìhook\95û\96@\82Í\81A\83A\83X\83L\81[\82©\82ç\8fo\94Å\82³\82ê\82Ä\82¢\82é\81uAdvanced Windows\81v
+\82ð\8eQ\8dl\82É\82µ\82Ü\82µ\82½\81B
+http://www.amazon.co.jp/exec/obidos/ASIN/4756138055/pdichomepage-22
+\82±\82±\82ÉAPI\83t\83b\83N\82Ì\90à\96¾\82ª\8fÚ\8d×\82É\8bL\8fq\82³\82ê\82Ä\82¢\82Ü\82·\81B
+\82µ\82©\82µ\81A\82±\82Ì\95û\96@\82ð\92m\82é\82Ü\82Å\82Í Hook\90æ\82Ì\83A\83h\83\8c\83X\82ð\92¼\90Ú\8f\91\82«\8a·\82¦\82é\82Æ\82¢\82¤
+\8aë\8c¯\82È\95û\96@\82ð\82â\82Á\82Ä\82¢\82Ü\82µ\82½\81B\82Â\82Ü\82è Advanced Windows\82É\8bL\8fq\82³\82ê\82Ä\82¢\82é
+\82P\94Ô\96Ú\82Ì\95û\96@\82Å\82·\82Ë\81BNT\8cn\82ÌOS\82È\82ç\82Ù\82Ú\96â\91è\82È\82­\93®\8dì\82·\82é\82Ì\82Å\82·\82ª\81A
+9x\8cn\82Í\97á\8aO\82ª\82Ç\82¤\82µ\82Ä\82à\94­\90\82µ\82Ä\82µ\82Ü\82¢\82Ü\82·\81B
+\82Æ\82¢\82¤\82±\82Æ\82Å\81A\82±\82Ì\96{\82Ì\82Q\94Ô\96Ú\82Ì\95û\96@\82Å\88À\92è\82µ\82Ä\93®\8dì\82·\82é\82æ\82¤\82É
+\82È\82è\82Ü\82µ\82½\81B\82µ\82©\82µ\81A\82±\82Ì\96{\82Ì\82Ü\82Ü\82Å\82ÍDokoPop!\82Å\8cø\97¦\82æ\82­
+\93®\8dì\82µ\82Ä\82­\82ê\82È\82¢\82Ì\82Å\81A\82©\82È\82è\8f\91\82«\8a·\82¦\82Ä\82 \82è\82Ü\82·\81B
+\81i\82Æ\82¢\82¤\82±\82Æ\82Å\92\98\8dì\8c \95\\8e¦\82à\8fÈ\97ª\82µ\82½\82è\82µ\82Ä\81E\81E\81E\81j
+\8f\91\82«\8a·\82¦\82½\81A\82Æ\82¢\82¤\82æ\82è\81A\8d¡\82Ü\82Å\8e©\95ª\82ª\8f\91\82¢\82½APIHOOK\8d\\91¢\91Ì\82ð
+\95Ï\8dX\82µ\82½\81A\82Æ\82¢\82¤\82Ù\82¤\82ª\90³\82µ\82¢\82©\82à\82µ\82ê\82Ü\82¹\82ñ\81B
+API\83t\83b\83N\82Ì\89ð\90à\82Í\82±\82Ì\96{\82É\8f÷\82è\82Ü\82·\81B
+
+\82Å\82·\82ª\81A\82¹\82Á\82©\82­\82P\94Ô\96Ú\82Ì\8aë\8c¯\82È\95û\96@\82Å\82¢\82­\82Â\82©\93¾\82½\8fî\95ñ\82ª\82 \82é\82Ì\82Å\81A
+\8b\8c\83o\81[\83W\83\87\83\93\82Å\8eg\97p\82µ\82Ä\82¢\82½\83t\83b\83N\95û\96@\82Ì\8fî\95ñ\82ð\8f\91\82¢\82Ä\82¨\82«\82Ü\82·\81B
+---------- \8cÃ\82¢\98b ----------
+\82¿\82È\82Ý\82É\81ANT\82Å\82ÍUSER32.DLL,GDI32.DLL\82ÌGetProcAddress()\82Í
+application\82É\82æ\82Á\82Ä\88Ù\82È\82è\82Ü\82·\81B\82µ\82©\82µ\81A9x\82Å\82Í\93¯\82\82Å\82·\81B
+\90æ\82Ù\82Ç\82à\82¿\82ç\82Á\82Æ\8f\91\82¢\82½\82æ\82¤\82É\81ANT\82Ìapplication\82Í\8cÂ\95Ê\82Ìmemory\8bó\8aÔ\82Å
+USER32.DLL,GDI32.DLL\82à\88Ù\82È\82é\8bó\8aÔ\82É\91\8dÝ\82µ\82Ä\82¢\82é\82©\82ç\82Å\82·\81B
+\82Æ\82±\82ë\82ª9x\82Í\8b¤\97L\82µ\82Ä\82¢\82Ä\81A\82µ\82©\82àjump\82µ\82½\82ç\82·\82®\82Ékernel mode\82É
+\93ü\82Á\82Ä\82¢\82é\82æ\82¤\82Å\82·\81B(NT\82Í\82 \82é\92ö\93xuser mode\82Å\82â\82Á\82Ä\82¢\82é\8a´\82\81j
+
+\82³\82ç\82É\82»\82Ì\90æ\82Í\82Ç\82¤\82È\82Á\82Ä\82¢\82é\82©\82Æ\82¢\82¤\82Æ\81E\81E\81E\82Æ\82¢\82¤\98b\82Í
+\82±\82Ì\83v\83\8d\83O\83\89\83\80\82Ìscope\8aO\82È\82Ì\82Å\82Ü\82½\82Ì\8b@\89ï\82É\8f÷\82é\82Æ\82µ\82Ä\81A
+\82±\82±\82Å9x\82É\91Î\82µ\82Ä\82¿\82å\82Á\82Æ\8c\99\82È\97\\8a´\82ª\82æ\82¬\82è\82Ü\82·\81B
+NT\82Ì\8fê\8d\87\81Aentry point\82ð\8f\91\82«\8a·\82¦\82Ä\82à\82»\82Ìapplication\8cÅ\97L\82Ì
+entry point\82Å\82 \82é\82½\82ß\81A\82»\82Ì\8aÔ\82Étask switching\82ª\94­\90\82µ\82Ä\82à
+\96â\91è\82È\82¢\82Ì\82Å\82·\82ª\81A9x\82Å\82Í\81Aentry point\82ð\8f\91\82«\8a·\82¦\82½\92¼\8cã\82É
+task switching\82ª\94­\90\82µ\82½\82ç\81A(\97\88\82Ä\97~\82µ\82­\82È\82¢)\82Ù\82©\82Ìapplication\82ª
+\82»\82Ìhook\82ð\93`\82Á\82Ä\82â\82Á\82Ä\82­\82é\81E\81E\81E\8dÅ\88«entry point\8f\91\82«\8a·\82¦\92\86\82É
+switching\82ª\94­\90\82·\82é\82Æ\81E\81E\81E\82¿\82å\82Á\82Æ\95|\82¢\82Å\82·\81B
+\82Å\82à\81A\8eÀ\8dÛ\82Í\82»\82Ì\82æ\82¤\82È\83P\81[\83X\82Í\8bN\82±\82è\82É\82­\82­\81A\8eÀ\8dÛ\82»\82¤\82¢\82¤
+\96â\91è\82Í\94­\90\82µ\82Ä\82¢\82Ü\82¹\82ñ\81B\82Å\82·\82ª\81A\88ê\89\9e\83v\83\8d\83O\83\89\83\80\82Å\82Í
+\82»\82Ì\82½\82ß\82Ì\91Î\8dô\82ð\82µ\82Ä\82 \82è\82Ü\82·\81B
+(\82±\82Ì\82Ö\82ñ\82Ì\97\9d\8bü\82à\8f\91\82¢\82½\95û\82ª\82¢\82¢\82Ì\82Å\82·\82ª\81E\81E\81E\8fÈ\97ª\81j
+
+entry point\82Ì\8f\91\82«\8a·\82¦\82Å\82·\82ª\81ANT\82Ì\8fê\8d\87\82Í
+\92Ê\8fí\82Ìapplication\82Æ\93¯\82\82Å\82·\82Ì\82Å\81AWriteProcessMemory\8aÖ\90\94\82Å
+code\97Ì\88æ\82ð\8f\91\82«\8d\9e\82Ý\82ª\82Å\82«\82Ü\82·\81B\82µ\82©\82µ\81A9x\82Í
+\8b¤\97Lmemory\82Å\82 \82è\81A\82»\82±\82Íwrite protect\82³\82ê\82Ä\82¢\82Ü\82·\81B
+\82±\82Ìprotection\82ð\89ð\8f\9c\82·\82é\82É\82Í\92Ê\8fí\82ÌWindows API\82É\82Í
+\96³\82¢\82æ\82¤\82È\82Ì\82Å\81i\82 \82Á\82½\82ç\8b³\82¦\82Ä\97~\82µ\82¢\81j\81A\82í\82´\82í\82´
+memory\82ð\8f\91\82«\8a·\82¦\82é\82¾\82¯\82Ì\82½\82ß\82ÌVxD\82ð\8dì\82è\82Ü\82µ\82½\81B
+VxD\82È\82çkernel mode\82È\82Ì\82Å\82È\82ñ\82Å\82à\82Å\82«\82Ä\82µ\82Ü\82¢\82Ü\82·\81B
+(\82±\82Ì\82Ö\82ñ\82ª\90æ\82Ù\82Ç\82Ìtask switching\82Ì\98b\82Æ\97\8d\82ñ\82Å\82¢\82Ü\82·\82ª)
+
+VxD\82Ídynamic loading\82Å\8dì\82Á\82Ä\82 \82è\82Ü\82·\81B
+\82±\82ÌVxD\82Å\92\8d\88Ó\82µ\82È\82¯\82ê\82Î\82È\82ç\82È\82¢\82Ì\82Í\81ACreateFile()\8aÖ\90\94\82Å
+VxD\82ðload\82µ\82Ä\82¢\82Ü\82·\82ª\81A\93ñ\93xCreateFile()\82Í\82Å\82«\82È\82¢\82Æ\82±\82ë\82Å\82·\81B
+\8f]\82Á\82Ä\81A\88ê\94Ô\8dÅ\8f\89\82Ì\8f\89\8aú\89»\82Ì\82Æ\82«\82¾\82¯\81ACreateFile()\82ð\8ds\82¢\81A
+\82 \82Æ\82Í\82¸\82Á\82ÆVxD\82ð\8fí\92\93\82³\82¹\82½\82Ü\82Ü\82É\82µ\82Ä\82¨\82­\95K\97v\82ª\82 \82è\82Ü\82·\81B
+
+\88ê\89\9eAPI Hook\82Ì\98b\82Í\82±\82Ì\82­\82ç\82¢\82É\82µ\82Ä\82¨\82«\82Ü\82·\81B
+API Hook\82ð\82·\82éapplication\82Í\82Ù\82©\82É\82à\82 \82è\82Ü\82·\82ª\81A
+\82»\82¤\82¢\82¤application\82Í\82±\82ê\82Æ\93¯\82\95û\96@\82ð\8eg\97p\82µ\82Ä\82¢\82é\82Ì\82Å\82µ\82å\82¤\82©\81H
+MSDN\82É\82àapimon(\82¾\82Á\82½\82©\82È\81H)\82Æ\82¢\82¤tool\82ª\95t\91®\82µ\82Ä\82¢\82Ü\82·\82ª\81A
+\82Ç\82¤\82È\82ñ\82Å\82µ\82å\82¤\81H
+---------- \88È\8fã\81A\8cÃ\82¢\98b ----------
+
+\98b\82Í\82¸\82Á\82Æ\91O\82É\96ß\82Á\82Ä\81ABitBlt\91Î\8dô\82Ì\98b\82Å\82·\81B
+\82±\82ÌBitBlt\82Å\95`\89æ\82·\82é\95û\96@\82ð\92²\82×\82Ä\82Ý\82é\82Æ\81Awindow\91S\91Ì\82Å\82Í\82È\82­\81A
+banding\82É\82æ\82Á\82Ä\81Awindow\82ð\95¡\90\94\82Ìbitmap\82É\95ª\8a\84\82µ\82ÄBitBlt\82µ\82Ä\82¢\82é
+\82æ\82¤\82Å\82·\81B\8f]\82Á\82Ä\81ABitBlt API\82àhook\82µ\82Ä\82â\82è\81Abitmap\82Ötext\82ð
+\95`\89æ\82µ\82½\82Æ\82«\82Ì\8dÀ\95W\82Æ\81ABitBlt\82µ\82½\82Æ\82«\82Ìdestination point\82Ì
+offset\82ð\8dl\97\82µ\82Ätext\8dÀ\95W\82ð\8cv\8eZ\82µ\82Ä\82â\82é\95K\97v\82ª\82 \82è\82Ü\82·\81B
+
+\88È\8fã\81Atext\82ðget\82Å\82«\82½\82ç\81A\8ew\92è\8dÀ\95W(sample\82Å\82Ímouse\82Ìcursor\88Ê\92u)\82É
+text\82ª\82 \82é\82©\82Ç\82¤\82©\81A\82Æ\82¢\82¤\94»\92è\82ð\8ds\82¢\82Ü\82·\81B
+hit\82µ\82½\8fê\8d\87\82Í\81A\82»\82Ìtext\91S\91Ì\82Æ\81Atext\8fã\82Ìbyte offset\82ð
+WM_COPYDATA message\82Å\8f\89\8aú\89»\82Ì\8e\9e\82É\93o\98^\82µ\82Ä\82 \82é window\82ÖSendMessage()
+\82µ\82Ü\82·\81B(WM_COPYDATA\82ÍSendMessage\82Å\82È\82¢\82Æ\82¢\82¯\82È\82¢)
+
+\82»\82µ\82Ä\81ADCHookTest.exe\82ª\82»\82Ìmessage\82ð\8eó\82¯\8eæ\82è\81ADCHookTest.exe\82ª
+text\82ð\82Ù\82©\82Ìapplication(PDIC)\82ÖDDE\82Å\93n\82µ\82Ä\82¢\82Ü\82·\81B
+
+DCHookTest.exe\82ª\82â\82Á\82Ä\82¢\82é\82±\82Æ\82Í\82»\82ê\82ª\82Ù\82Æ\82ñ\82Ç\82Å\81A
+dchook.dll\82É\82­\82ç\82×\82ê\82Îê¡\82©\82É\8ay\82È\8ed\8e\96\82È\82Ì\82Å\82·\81B
+
+DLL\82Å\82Í\8fí\8e¯\82Å\82·\82ª\81Adata\82Í\8aî\96{\93I\82Éprocess\8cÅ\97L\82Ì\92l\82ð\8e\9d\82¿\82Ü\82·\81B
+\82±\82±\82Å\92\8d\88Ó\82µ\82È\82¯\82ê\82Î\82È\82ç\82È\82¢\82Ì\82ª\81AWindowsHook\82Ìhook dll\82Í\81A
+WindowsHook\82Å\83Z\83b\83g\82µ\82½\8cã\81Aforeground application\82É
+\90Ø\82è\91Ö\82í\82Á\82½\82Æ\82«\82É\8f\89\82ß\82Äattach\82³\82ê\82Ü\82·\81B
+(\82Â\82Ü\82è\81AWindowsHook\82µ\82½\8e\9e\93_\82Å\82ÍHook\82µ\82½process\82É\82µ\82©
+attach\82³\82ê\82Ä\82¢\82È\82¢)
+\82µ\82©\82à\81Aattach\82µ\82½\82Æ\82«\82É\82Í\81A\95Ê\82Ìapplication\82Ìprocess\8bó\8aÔ\82É
+\8b\8f\82Ü\82·\82Ì\82Å\81AWM_COPYDATA\82Ì\91\97\82è\90æ\82Ì\8fî\95ñ\82ª\82Ç\82±\82É\82à\82 \82è\82Ü\82¹\82ñ\81B
+\83t\83@\83C\83\8b/registry\82É\95Û\91\82µ\82Ä\93Ç\82Ý\8d\9e\82Þ\81A\82È\82ñ\82Ä\82¢\82¤\95û\96@\82à\82 \82è
+\82Ü\82·\82ª\81Adchook.def\82Åshared\82É\82æ\82Á\82Ä\81Adll\8aÔ\82Å\8b¤\97L\82·\82é
+data segment\82ð\8dì\90¬\82·\82é\95û\96@\82ª\82 \82è\82Ü\82·\81B
+\82±\82±\82ÉWM_COPYDATA\91\97\82è\90æ\82Ìhandle\82ð\95Û\91\82µ\82Ä\82¨\82¯\82Î\81A\82±\82Ì\82æ\82¤\82È
+\96â\91è\82Í\89ð\8c\88\82Å\82«\82Ü\82·\81B
+
+\82»\82ê\82Æ\82à\82¤\88ê\82Â\82â\82Á\82Ä\82Ý\82Ä\82í\82©\82Á\82½\82Ì\82Å\82·\82ª\81A9x\82Å\82Í
+Unhook\82ð\82·\82é\82Æ\81A\82·\82®\82É\82·\82×\82Ädetach\82³\82ê\82é\82Ì\82Å\82·\82ª\81A
+NT\82Å\82Í\81A\82±\82ê\82Ü\82½foreground\82É\90Ø\82è\91Ö\82í\82Á\82½\82Æ\82«\82É\82µ\82©
+detach\82µ\82Ä\82­\82ê\82Ü\82¹\82ñ\81B\82»\82±\82Å\81Adchook\82Å\82Í\8b­\90§\93I\82É
+detach\82³\82¹\82é\82½\82ß\82Émessage\82ðbroadcast\82³\82¹\82Ä\82¢\82Ü\82·\81B
+\8eÀ\8dÛ\82Í\82»\82±\82Ü\82Å\82â\82é\95K\97v\90«\82Í\82È\82¢\82Ì\82Å\82·\82ª\81A\8aJ\94­\8e\9e\82É
+memory\82ð\89ð\95ú\82³\82¹\82é\82½\82ß\82É\90F\82ñ\82Èapplication\82É\90Ø\82è\91Ö\82¦\82é\82Ì\82ª
+\8c\99\82¾\82Á\82½\82Ì\82Å\81E\81E\81EBroadcastMessage\88È\8aO\82É\97Ç\82¢\95û\96@\82ª\82 \82é\82Ì\82©\82È\81H
+
+\83v\83\8d\83O\83\89\83\80\89ð\90à -----------------------------------------------------------
+
+DBW()
+
+\83f\83o\83b\83O\97p\82Ì\8aÖ\90\94\82Å\82·\81B\90Ù\8dì\82Ìdbgmsg.exe\82Ö\95\8e\9a\97ñ\82ð\8fo\97Í\82µ\82Ü\82·\82ª\81A
+\82Ù\82©\82Ìdebug string\82ð\95â\91«\82·\82édebug string monitor\82Å\8eg\82¦\82é\82æ\82¤\82É
+DBW()\82ð\8f\91\82«\8a·\82¦\82½\82Ù\82¤\82ª\97Ç\82¢\82Å\82µ\82å\82¤\81B(OutputDebugString()\82È\82Ç)
+
+popenable.h, popdisable.h
+\82±\82ê\82ç\82Í\81u\89E\83N\83\8a\83b\83N\8c\9f\8dõ\82ð\97L\8cø\82É\82µ\82Ü\82µ\82½\81v\82Æ\82¢\82¤\83\81\83b\83Z\81[\83W\83E\83B\83\93\83h\83E\82Ì
+\83\8a\81[\83W\83\87\83\93\8fî\95ñ\82Å\82·\81B\81i\8aÛ\82Ý\82Ì\82 \82é\83E\83B\83\93\83h\83E\81j
+\82±\82Ì\83\8a\81[\83W\83\87\83\93\8fî\95ñ\82Í\81Abmp2rgn\82Æ\82¢\82¤\83c\81[\83\8b\82Åpopenable.bmp, popdisable.bmp
+\82ð\95Ï\8a·\82µ\82½\82à\82Ì\82Å\82·\81Bbmp2rgn\82Í\83t\83\8a\81[\83E\83F\83A\82Å\82·\81B
+
+\83T\83\93\83v\83\8b\83v\83\8d\83O\83\89\83\80 -------------------------------------------------------
+
+sample program\82Æ\82µ\82Ä\81Amouse cursor\88Ê\92u\82Ìtext\82ð\92\8a\8fo\82µ\81A
+\90Ù\8eÒ\8dì\82Ì\89p\98a\8e«\8f\91\8c\9f\8dõ\83v\83\8d\83O\83\89\83\80 Personal Dictionary for Win32(PDIC)\82Ö
+DDE\82ð\8co\97R\82µ\82Ä\81A\8c\9f\8dõ\8c\8b\89Ê\82ðpopup\82³\82¹\82é \81u\82Ç\82±\83|\83b\83v\81I\81v\82Æ\82¢\82¤\82à\82Ì\82ª\82 \82è\82Ü\82·\81B
+
+http://homepage3.nifty.com/TaN/pdic-download.html
+\82ÉDokoPop!\82Æ\82¢\82¤\96¼\91O\82Å\93o\98^\82³\82ê\82Ä\82¢\82Ü\82·\81B
+
+\8d¡\8cã\82Ì\89Û\91è ---------------------------------------------------------------
+
+\81E\95¡\90\94\8ds\8c\9f\8fo
+\81@\82±\82Ì\83v\83\8d\83O\83\89\83\80\82Å\82Í\82P\8ds\95ª\82µ\82©\8eæ\93¾\82Å\82«\82Ü\82¹\82ñ\82ª\81A
+\81@\95`\89æ\8aJ\8en\88Ê\92u\82ð\92Ç\90Õ\82·\82é\82±\82Æ\82É\82æ\82è\81A\91O\8cã\82Ì\8ds\82à\92\8a\8fo\89Â\94\\82É\82È\82é\82Æ
+\81@\8ev\82¢\82Ü\82·\81B
+
+\92\98\8dì\8c  ------------------------------------------------------------------
+
+\8dÄ\94z\95z\81A\93]\8dÚ\81A\95¡\90»\81A\89ü\95Ï\81A\94Ì\94\84\93\99\82Í\82·\82×\82Ä\8e©\97R\82Å\82·\81B\88ê\90Ø\82Ì\90§\8cÀ\82ð\90Ý\82¯\82Ü\82¹\82ñ\81B
+\82½\82¾\82µ\81A\88È\89º\82Ì\82±\82Æ\82Í\82²\97¯\88Ó\82­\82¾\82³\82¢\81B
+\81E\82±\82Ì\83\\83t\83g\83E\83F\83A\82É\82æ\82Á\82Ä\90\82\82é\88ê\90Ø\82Ì\91¹\8aQ\90Ó\94C\82ð\95\89\82¢\82Ü\82¹\82ñ\81B
+\81E\82±\82Ì\83\\83t\83g\83E\83F\83A\82É\8aÖ\82µ\82Ä\95M\8eÒ\82Í\82¢\82©\82È\82é\8b`\96±\82à\95\89\82¢\82Ü\82¹\82ñ\81B
+\81E\8dÄ\94z\95z\82³\82ê\82½\82à\82Ì\82É\8aÖ\82µ\82Ä\82Í\88ê\90Ø\8aÖ\92m\82µ\82Ü\82¹\82ñ\81B
+
+\97\9a\97ð --------------------------------------------------------------------
+
+##>HISTORY.TXT
+
+##EOF
+
+<DKPP.TXT
+==========================================================================
+                          \82Ç\82±\83|\83b\83v\81I    Ver.%VERSION%
+==========================================================================
+\8fÐ\89î ---------------------------------------------------------------------
+
+\81@\81u\82Ç\82±\83|\83b\83v\81I\81v\82Í\81ATaN\8dì\82ÌPersonal Dictionary for Win32(\88È\89ºPDIC)\82Æ
+\81@\98A\8cg\82µ\82Ä\81A\83}\83E\83X\82Ì\83N\83\8a\83b\83N\82É\82æ\82Á\82Ä\83}\83E\83X\88Ê\92u\82Ì\92P\8cê\82ð\8c\9f\8dõ\81A\93ú\96{\8cê\96ó\82È
+\81@\82Ç\82ð\83|\83b\83v\83A\83b\83v\83E\83B\83\93\83h\83E\82É\82æ\82Á\82Ä\95\\8e¦\82·\82é\83\\83t\83g\83E\83F\83A\82Å\82·\81B
+
+\93®\8dì\8am\94FOS --------------------------------------------------------------
+
+\81@Windows98/Me
+\81@WindowsNT4.0/2000/XP
+
+\96â\91è\93_ --------------------------------------------------------------------
+
+##>PROB.TXT
+
+\8f\80\94õ --------------------------------------------------------------------
+
+\81@%DKPPARC%\82ð\82»\82Ì\82Ü\82Ü\8eÀ\8ds\82µ\82Ä\89º\82³\82¢\81B
+\81@\8e©\93®\93I\82É\83C\83\93\83X\83g\81[\83\8b\82³\82ê\82Ü\82·\81B
+\81@\83X\83^\81[\83g\83A\83b\83v\82É\93o\98^\82µ\82½\95û\82ª\95Ö\97\98\82Å\82·\81B(Windows\8bN\93®\8e\9e\82ÉDokoPop!\82à\8bN\93®)
+
+\81@\82Ç\82±\83|\83b\83v\81I\82É\82ÍPDIC for Win32(\82Å\82«\82ê\82ÎVer.4.50\88È\8d~)\82ª\95K\97v\82Å\82·\81B
+\81@http://homepage3.nifty.com/TaN/pdic-download.html
+  \82©\82ç\83_\83E\83\93\83\8d\81[\83h\82µ\82Ä\89º\82³\82¢\81B
+
+  NT4.0\82Å\82Í\81APSAPI.DLL \82ª\95K\97v\82Å\82·\81B
+  http://homepage3.nifty.com/TaN/psapi.exe
+  \82©\82ç\83_\83E\83\93\83\8d\81[\83h\8cã\81A\89ð\93\80\81A\83V\83X\83e\83\80\83f\83B\83\8c\83N\83g\83\8a(C:\WINNT\System32\82È\82Ç)
+  \82Ö\83R\83s\81[\82µ\82Ä\82­\82¾\82³\82¢\81B
+
+\8eg\97p\95û\96@ -----------------------------------------------------------------
+
+\81@DKPP.EXE\82ð\8bN\93®\82·\82é\82Æ\83^\83X\83N\83g\83\8c\83C\82É\8fí\92\93\82µ\82Ü\82·\81B(DP\82Æ\8f\91\82¢\82Ä\82 \82é\83A\83C\83R\83\93)
+\81@Ctrl\83L\81[\82ð\89\9f\82µ\82È\82ª\82ç\83}\83E\83X\82Ì\89E\83{\83^\83\93\82ð\83N\83\8a\83b\83N\82·\82é\82Æ\81A\83N\83\8a\83b\83N\82µ\82½\88Ê\92u\82Ì
+\81@\92P\8cê\82Ü\82½\82Í\8fn\8cê\82Ì\88Ó\96¡\82ð\95\\8e¦\82µ\82Ü\82·\81B
+
+  \81y\92\8d\88Ó\81zPDIC\96{\91Ì\82Í\95K\82¸\8e«\8f\91\83O\83\8b\81[\83v\82ð\83I\81[\83v\83\93\82µ\82½\8fó\91Ô\82É\82µ\82Ä\82¨\82¢\82Ä\82­\82¾\82³\82¢\81B
+          \82Â\82Ü\82è\81A\92Ê\8fí\82Ì\8c\9f\8dõ(WORD\97\93\93ü\97Í\81j\82ª\82Å\82«\82é\8fó\91Ô\82É\82µ\82Ä\82¨\82¢\82Ä\82­\82¾\82³\82¢\81B
+          (\83\81\83j\83\85\81[\82Ì File | \8e«\8f\91\83O\83\8b\81[\83v\83I\81[\83v\83\93)
+          \8e«\8f\91\95Ï\8a·\92\86\82È\82Ç\81A\92Ê\8fí\82Ì\8c\9f\8dõ\82ª\82Å\82«\82È\82¢\8fó\91Ô\82Å\82Í\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82Í
+          \82Å\82«\82Ü\82¹\82ñ\81B
+
+  \81y\92\8d\88Ó\81zMS-Word\82Å\82Í Ctrl+\89E\83N\83\8a\83b\83\82ª\83J\83b\83g\81\95\83y\81[\83X\83g\82É\8a\84\82è\93\96\82Ä\82ç\82ê\82Ä\82¢\82é
+          \82½\82ß\81A\82¤\82Ü\82­\93®\8dì\82µ\82È\82¢\82Æ\82«\82ª\82 \82è\82Ü\82·\81B
+          \81i\81u\82Í\82\82ß\82É\91I\91ð\82µ\82Ä\82­\82¾\82³\82¢\81v\82È\82Ç\82Æ\8fo\82Ä\82­\82é\81j
+          \82à\82µ\82±\82Ì\96â\91è\82ð\89ñ\94ð\82µ\82½\82¢\8fê\8d\87\82Í\81A\8e\9f\82Ì\81u\82¿\82å\82Á\82Æ\95Ö\97\98\82È\8eg\97p\95û\96@\81v
+          \82É\82 \82é\82æ\82¤\82É\81A\81u\89E\83N\83\8a\83b\83N\82¾\82¯\82Å\83|\83b\83v\83A\83b\83v\81v\82É\82·\82é\82©\81A
+          \8e\9f\82Ì\82æ\82¤\82É\90Ý\92è\82ð\8ds\82Á\82Ä\82­\82¾\82³\82¢\81B
+          DokoPop!\82Ì\83^\83X\83N\83g\83\8c\83C\82Ì\83\81\83j\83\85\81[\82©\82ç\81A[\90Ý\92è...]\82ð\91I\82Ñ\81A
+          \81u\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\81v\82©\82ç\81A\83|\83b\83v\83A\83b\83v\82ð\82³\82¹\82é\82Æ\82«\82Ì\91g\82Ý\8d\87\82í\82¹\82ð
+          \91I\82ñ\82Å\82­\82¾\82³\82¢\81B
+          Alt + \89E\83N\83\8a\83b\83\82Å\82 \82ê\82Î\96â\91è\82È\82¢\82æ\82¤\82Å\82·\81B
+
+\82¿\82å\82Á\82Æ\95Ö\97\98\82È\8eg\97p\95û\96@ ---------------------------------------------------
+
+\81@\81uCtrl + \89E\83N\83\8a\83b\83N\81v\82Í\82í\82¸\82ç\82í\82µ\82¢\81I\81I
+\81@\82Æ\82¢\82¤\90l\82É\82Í\81A
+
+\81@\81u\89E\83N\83\8a\83b\83N\82¾\82¯\82Å\83|\83b\83v\83A\83b\83v\81v
+
+\81@\82Æ\82¢\82¤\95û\96@\82à\82 \82è\82Ü\82·\81B
+\81@Ctrl + Alt + \89E\83N\83\8a\83b\83\82ÅON/OFF\82Ì\90Ø\82è\91Ö\82¦\82ª\82Å\82«\82Ü\82·\81B
+\81@\81i\90Ø\82è\91Ö\82¦\8e\9e\82É\83\81\83b\83Z\81[\83W\82ª\8fo\82Ü\82·)
+
+\81@\83q\83\93\83g\81F\81u\89E\83N\83\8a\83b\83N\82¾\82¯\81v\82É\82µ\82½\8fê\8d\87\81A\81uCtrl + \89E\83N\83\8a\83b\83N\81v\82ð\82·\82é\82Æ\81A
+\81@\81@\81@\81@\81@\92Ê\8fí\82Ì\89E\83N\83\8a\83b\83N\83\81\83j\83\85\81[\82ª\8fo\82Ä\82«\82Ü\82·\81B
+\81@\81@\81@\81@\81@\82¿\82å\82¤\82Ç\81uCtrl\81v\82ª\8bt\93]\82·\82é\8a´\82\82É\82È\82è\82Ü\82·\81B
+
+\83\81\83j\83\85\81[ -----------------------------------------------------------------
+
+\81@\83^\83X\83N\83g\83\8c\83C\82ÌDokoPop!\83A\83C\83R\83\93\82ð\89E\83N\83\8a\83b\83N\82·\82é\82Æ\83\81\83j\83\85\81[\82ª\8c»\82ê\82Ü\82·\81B
+
+\81@\8e«\8f\91\83O\83\8b\81[\83v         - PDIC\82Ì\8e«\8f\91\83O\83\8b\81[\83v\82Ì\95Ï\8dX\82ð\8ds\82¢\82Ü\82·
+\81@\89E\83N\83\8a\83b\83N\8c\9f\8dõ       - \83}\83E\83X\82Ì\89E\83N\83\8a\83b\83N\82¾\82¯\82Å\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82ð\8ds\82¢\82Ü\82·
+\81@\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\97L\8cø - \8c\9f\8dõ\82ð\97L\8cø\81^\96³\8cø\82É\82µ\82Ü\82·
+\81@\90Ý\92è                 - \8ae\8eí\90Ý\92è\82ð\8ds\82¢\82Ü\82·
+\81@\90à\96¾\8f\91\82ð\95\\8e¦         - \82±\82Ì\83t\83@\83C\83\8b\82ð\95\\8e¦\82µ\82Ü\82·
+\81@\83o\81[\83W\83\87\83\93           - version\95\\8e¦
+\81@\8fI\97¹                 - \82Ç\82±\83|\83b\83v\81I\82Ì\8fI\97¹
+
+\90Ý\92è ----------------------------------------------------------------------
+
+  \83^\83X\83N\83g\83\8c\83C\82Ì\89E\83N\83\8a\83b\83N\82Å\8fo\82Ä\82«\82½\83\81\83j\83\85\81[\82Ì\81u\90Ý\92è\81v\82Å\82·\81B
+
+  \81¡\8bN\93®\8e\9e\82É\83X\83v\83\89\83b\83V\83\85\82ð\95\\8e¦\82·\82é
+    \8bN\93®\8e\9e\82Ì\89æ\96Ê\92\86\89\9b\82É\8fo\82Ä\82­\82é\83E\83B\83\93\83h\83E\82Ì
+    \95\\8e¦\82ð\97L\8cø\81^\96³\8cø\82É\82µ\82Ü\82·\81B
+
+    \81\9a\8bN\93®\8e\9e\82Ì\83X\83v\83\89\83b\83V\83\85\83r\83b\83g\83}\83b\83v\82ð\83J\83X\83^\83}\83C\83Y\81\9a
+    DKPP.EXE\82ª\82 \82é\83t\83H\83\8b\83_\81[\82É DKPP.BMP \82Æ\82¢\82¤\83t\83@\83C\83\8b\82ª\82 \82é\82Æ\81A
+    \82»\82Ì\83r\83b\83g\83}\83b\83v\82ð\8bN\93®\8e\9e\82Æ\83o\81[\83W\83\87\83\93...\82Ì\82Æ\82«\82É\95\\8e¦\82µ\82Ü\82·\81B
+
+  \81¡\8e«\8f\91\83O\83\8b\81[\83v\82ð\8ew\92è\82·\82é
+    \82±\82±\82ð\83`\83F\83b\83N\82·\82é\82Æ\81A\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82ð\8ds\82¤\82Æ\82«\82É
+    \82±\82±\82Å\8ew\92è\82µ\82½\8e«\8f\91\83O\83\8b\81[\83v\82ð\8eg\97p\82µ\82Ü\82·\81B
+    PDIC\96{\91Ì\82Å\82Ì\8e«\8f\91\83O\83\8b\81[\83v\82Ì\91I\91ð\82ª\95Ï\8dX\82³\82ê\82Ü\82·\81B
+    \81y\92\8d\88Ó\81z\82±\82Ì\8b@\94\\82ÍPDIC for Win32 Ver.4.40\82©\82ç\82Ì\91Î\89\9e\82É\82È\82è\82Ü\82·
+
+  \81¡\83|\83b\83v\83A\83b\83v\8c\9f\8dõ - \83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82ð\8ds\82¤\83}\83E\83X\82Æ\83L\81[\82Ì\91g\82Ý\8d\87\82í\82¹\82ð\8ew\92è
+    \82µ\82Ü\82·\81B
+
+  \81¡\89E\83N\83\8a\83b\83N\8c\9f\8dõON/OFF
+    \89E\83N\83\8a\83b\83N\8c\9f\8dõ\82Ì\97L\8cø\81E\96³\8cø\82ð\90Ø\82è\91Ö\82¦\82é\83}\83E\83X\82Æ\83L\81[\82Ì\91g\82Ý\8d\87\82í\82¹\82Å\82·\81B
+
+  \81¡Ctrl\83L\81[\82ð\97£\82µ\82½\82ç\83|\83b\83v\83A\83b\83v\82ð\95Â\82\82é
+    Ctrl+\83}\83E\83X\83N\83\8a\83b\83N\82Å\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82ð\8ds\82¤\82æ\82¤\82É\82µ\82½\8fê\8d\87\81A
+    \83|\83b\83v\83A\83b\83v\95\\8e¦\82³\82ê\82½\8cã\81ACtrl\83L\81[\82ð\97£\82µ\82½\82ç\83|\83b\83v\83A\83b\83v\82µ\82½
+    \83E\83B\83\93\83h\83E\82ð\95Â\82\82Ü\82·\81B
+    \81i\8f«\97\88\93I\82É\82±\82Ì\83I\83v\83V\83\87\83\93\82Í\96³\82­\82µ\82Ü\82· - \8d¢\82é\81I\82Æ\82¢\82¤\95û\82Í\82¨\92m\82ç\82¹\82­\82¾\82³\82¢\81j
+
+  \81¡\89p\90\94\8e\9a\82Ì\82Ý\8c\9f\8dõ\82·\82é
+    \93ú\96{\8cê\81E\89p\90\94\8e\9a\8d¬\8dÝ\82Ì\95\8fÍ\82ª\82 \82Á\82½\8fê\8d\87\81A\93ú\96{\8cê\82ð\96³\8e\8b\82µ\82Ä\8c\9f\8dõ\82ð\8ds\82¢\82Ü\82·\81B
+    \8d¬\8dÝ\95\8fÍ\82Å\82Í ON \82É\82µ\82½\82Ù\82¤\82ª\83q\83b\83g\82µ\82â\82·\82­\82È\82è\82Ü\82·\81B
+    \82Ü\82½\81A\83t\83\89\83\93\83X\8cê\81A\83h\83C\83c\8cê\82Ì\82æ\82¤\82È\83E\83\80\83\89\83E\83g\81E\83A\83N\83T\83\93\82È\82Ç\82ð
+    \8aÜ\82Þ\95\8fÍ\82Å\82Í\82±\82±\82ð OFF \82É\82µ\82È\82¢\82Æ\82¤\82Ü\82­\93®\8dì\82µ\82È\82¢\8fê\8d\87\82ª\82 \82è\82Ü\82·\81B
+
+\82»\82Ì\91¼ --------------------------------------------------------------------
+
+\81@\8dÄ\97\98\97p\81E\8dÄ\94z\95z\81E\89ü\95Ï\82È\82Ç\82Í\8e©\97R\82Å\82·\81B
+\81@\82±\82Ì\83\\83t\83g\83E\83F\83A\82É\82æ\82é\91¹\8aQ\82Í\88ê\90Ø\82»\82Ì\90Ó\94C\82ð\95\89\82¢\82Ü\82¹\82ñ\81B
+
+\81@\82±\82Ìprogram\82Í\81Aopen source\82Å\82 \82éDCHook\82Ìsample program\82Å\82·\81B
+\81@\83\\81[\83X\83t\83@\83C\83\8b\82Í\81A
+\81@http://homepage3.nifty.com/TaN/prog-tips.html
+\81@\82É\82 \82è\82Ü\82·\81B(dchook-x.xx.lzh)
+
+\81@\82±\82Ì\83\\83t\83g\83E\83F\83A\82Ì\83T\83|\81[\83g\82Í\8ds\82Á\82Ä\82¢\82Ü\82¹\82ñ\81B\82½\82¾\82µ\81A
+\81@http://www4.plala.or.jp/cgi-bin/wforum/wforum.cgi/grape/dkpp
+\81@\82É\82Ä\81A\8fî\95ñ\8cð\8a·\82ð\8ds\82Á\82Ä\82¢\82Ü\82·\81B
+
+\81@PDIC for Win32\82Í
+\81@http://homepage3.nifty.com/TaN/pdic-download.html
+
+\81@\83C\83\93\83X\83g\81[\83\89\82É\82¿\82­\82í\82³\82ñ(RXQ01346@nifty.ne.jp)\82ÌMakeSet\82ð\8eg\97p\82µ\82Ä\82¢\82Ü\82·\81B
+
+\97\9a\97ð ----------------------------------------------------------------------
+
+##>HISTORY.TXT
+
+---------------------------------------------------------------------------
+##EOF
+
+****************** \83p\83b\83P\81[\83W\8dì\90¬\97p.BAT\83t\83@\83C\83\8b *******************************
+<MK.BAT
+@echo off
+echo/
+echo \8a®\91S\94Å\83p\83b\83P\81[\83W\82ð\8dì\90¬\82µ\82Ü\82·
+echo/
+echo ./dchook/dchook.dll\82ð\8f\80\94õ
+echo ./dchooktest/dchooktest.exe\82ð\8f\80\94õ
+echo ./vxd/hk95d.vxd\82ð\8f\80\94õ
+pause
+set TZ=JST-9
+
+copy .\dchook\dchook.dll .\DKPPHK.DLL /y
+copy .\VxD\hk95d.vxd .\HK95D.VXD /y
+copy .\dchooktest\dchooktest.exe .\DKPP.EXE /y
+
+touch -d%FDATE% -t%FTIME% -c DKPP.EXE DKPPHK.DLL HK95D.VXD README.TXT
+
+del %ARC% > nul
+
+lha32 a %ARC% /x README.TXT
+lha32 a %ARC% /x ./dchook/dchook.mak ./dchook/dchook.cpp ./dchook/dchook.h ./dchook/dchook.rc ./dchook/dchook.def
+lha32 a %ARC% /x ./dchooktest/dchooktest.bpr ./dchooktest/dchooktest.mak
+lha32 a %ARC% /x ./dchooktest/*.h ./dchooktest/*.cpp ./dchooktest/dchooktest.rc ./dchooktest/*.dfm ./dchooktest/dkpp.bmp ./dchooktest/popenable.bmp ./dchooktest/popdisable.bmp ./dchooktest/popenable.h ./dchooktest/popdisable.h ./dchooktest/icon.rc
+lha32 a %ARC% /x ./vxd/makefile ./vxd/hk95d.def ./vxd/*.h ./vxd/*.asm ./vxd/*.c
+
+%CHGINI% %IND% Exe Name %DKPPARC%
+%CHGINI% %IND% Date Year %DATE_YY%
+%CHGINI% %IND% Date Month %DATE_M%
+%CHGINI% %IND% Date Day %DATE_D%
+%CHGINI% %IND% Date Hour %TIME_H%
+%CHGINI% %IND% Date Minute %TIME_M%
+%CHGINI% %IND% Date Second %TIME_S%
+%CHGINI% %IND% Back 8 "|Doko Pop! Ver.%VERSION%"
+%CHGINI% %IND% Back 12 "|Doko Pop! Ver.%VERSION%"
+
+rem IND\82Ì\8eÀ\8ds
+k:\wbin\makeset\makeset .\%IND%
+
+rem lha32 a %DKPPARC% DKPP.TXT DKPP.EXE DKPPHK.DLL HK95D.VXD
+ren %DKPPARC% %DKPPARC%
+touch -d%FDATE% -t%FTIME% -c %DKPPARC%
+
+echo/
+echo \95Û\91\97p\88³\8fk\83t\83@\83C\83\8b\82ð\8dì\90¬\82µ\82Ü\82·
+echo/
+rem pause
+
+dir %ARC%
+
+echo/
+echo \8cö\8aJ\97p\83t\83@\83C\83\8b\82ð\8dX\90V\82µ\82Ü\82·
+echo/
+rem pause
+
+perl -S -i.bak filestamp.pl DKPPu.TXT
+del DKPPu.TXT.bak
+
+echo/
+echo Web\97p\82Ì\83t\83@\83C\83\8b\82ð\8dX\90V\82µ\82Ü\82·
+echo/
+pause
+
+copy %ARC% %HTML%
+copy %ARC% %MYSOFT%
+del %HTML%dchook-%OLDVERSION%.lzh
+copy %DKPPARC% %HTML%
+copy %DKPPARC% %MYSOFT%
+del %HTML%DKPP%OLDVER%.EXE
+
+copy %VARFILE% vars.dat
+perl -S repvars.pl %HTML%pdic-download0.html > %HTML%pdic-download.html
+copy vars.dat %VARFILE%
+
+rem echo [del] >> %HTML%ftp.ctl
+rem echo dchook-%OLDVERSION%.lzh >> %HTML%ftp.ctl
+rem echo DKPP%OLDVER%.EXE >> %HTML%ftp.ctl
+rem echo [include] >> %HTML%ftp.ctl
+rem echo %DKPPARC% >> %HTML%ftp.ctl
+rem echo %ARC% >> %HTML%ftp.ctl
+
+
+##EOF
+
+<<@%VARFILE%,DP_
+
+\1a
\ No newline at end of file
diff --git a/dchooku.ind b/dchooku.ind
new file mode 100644 (file)
index 0000000..b2f0bed
--- /dev/null
@@ -0,0 +1,232 @@
+[Finish]
+Disp=0
+Comp=1148
+[Jump]
+Check=0
+Date=0
+Del=0
+Dir=0
+Div=0
+Exe=0
+Ext=0
+File=0
+Go=0
+Go2=0
+Menu=0
+Pack=0
+Title=0
+Upl=0
+Reg=0
+Ask=0
+News=0
+Error=0
+Back=0
+Uninstall=0
+[Setup]
+NoUninstall=0
+OnlyUninstall=0
+[Exe]
+Name=DKPU114.exe
+IconName=DKPU.EXE
+Icon=0
+#No1=#1
+#No2=#3
+[Title]
+Setup=DokoPop!/Unicode
+Company=DokoPopProject
+Soft=DKPU
+[Del]
+Auto=0
+Checked=1
+ShowError=1
+0=
+Force=1
+Reboot=1
+[Dir]
+Root=%programs%\DokoPopU
+1=
+[DirRemove]
+1=
+[File0]
+Name=D:\SRC\DCHook\DKPU.EXE
+Dir=
+Del=1
+News=0
+NoAsk=1
+NoError=0
+Date=0
+[File1]
+Name=D:\SRC\DCHook\DKPU.TXT
+Dir=
+Del=1
+News=0
+NoAsk=1
+NoError=0
+Date=0
+[File2]
+Name=D:\SRC\DCHook\DKPUHK.DLL
+Dir=
+Del=1
+News=0
+NoAsk=1
+NoError=0
+Date=0
+[File3]
+Name=
+Dir=
+Del=1
+News=0
+NoAsk=1
+NoError=0
+Date=0
+[File4]
+Name=
+Dir=
+Del=1
+News=0
+NoAsk=1
+NoError=0
+Date=0
+[File5]
+Name=
+[CopyFile]
+DefaultNo=0
+Reboot=1
+Question=0
+[Pack]
+Copy=0
+Del=0
+[Menu]
+Name=DokoPop!(Unicode)
+[Check]
+Desktop=0
+Startup=2
+Menu=2
+Ext=0
+Send=0
+[Go]
+Readmename=DKPU.TXT
+Readmeno=1
+Desktop=0
+Startup=1
+Menu=1
+Auto=0
+Agree=0
+[Go2]
+Make0=
+Erase0=
+[Menu0]
+Name=DokoPop!(Unicode)
+Path=DKPU.EXE
+Arg=
+Icon=DKPU.EXE
+Work=
+Short=
+IconNo=0
+Show=0
+Init=0
+[Menu1]
+Name=DokoPop!(Unicode) \90à\96¾\8f\91
+Path=DKPU.TXT
+Arg=DKPU.TXT
+Icon=DKPU.TXT
+Work=
+Short=
+IconNo=0
+Show=0
+Init=1
+[Menu2]
+Name=
+[Send0]
+Name=
+[Desktop]
+Name=
+[Startup]
+Name=DokoPop!(Unicode)
+Path=DKPU.EXE
+Arg=
+Icon=DKPU.EXE
+Work=
+Short=
+IconNo=0
+Show=0
+Init=0
+[Ext0]
+Ext=
+[Date]
+Year=2004
+Month=10
+Day=2
+Hour=1
+Minute=14
+Second=0
+Comp=1
+Exe=1
+[Upl]
+Check=IBM PC/AT\8cÝ\8a·\8b@,NT4.0,Win98
+Env=MS-Windows 98/NT4.0
+Key=DKPU,PDIC,$WIN32,#APP,#UTL
+Kind=\83t\83\8a\81[\83E\83F\83A
+Make=
+Man=TaN(SGM00353)
+Title=DokoPop!/Unicode
+Trans=\93]\8dÚ\8e©\97R
+Gal=0
+Win=0
+[Intr]
+Count=0
+[Hist]
+Count=0
+[Div]
+New=DKPPC
+Go=0
+Top=0
+Delete=0
+Num=1457664
+TopNum=1457664
+[Reg]
+Make0=
+Erase0=
+[Back]
+Do=0
+0=fill,0,0,0
+1=mode,bottom
+2=rect,0,0,%100,%80
+3=gradation,0,0,0,0,0,255
+4=mode,bottom
+5=rect,%1,%1
+6=font,0,0,0,-21,0,0,0,700,255,0,0,0,3,2,1,18,Times New Roman
+7=height,%10
+8=|Doko Pop! Ver.1.14
+9=rect,%2,%2
+10=font,255,255,0,-21,0,0,0,700,255,0,0,0,3,2,1,18,Times New Roman
+11=height,%10
+12=|Doko Pop! Ver.1.14
+13=/-----
+14=
+[Readme]
+0=page,install
+1=mode,fill
+2=fill,64,192,192
+3=mode,right
+4=rect,5,0
+5=font,255,255,255,-36,0,0,0,400,0,0,0,0,3,2,1,34,Arial
+6=|Welcome to 
+7=font,255,255,255,-36,0,0,0,400,0,0,0,128,3,2,1,50,\82l\82\82o\83S\83V\83b\83N
+8=|Doko Pop!
+9=rect,7,2
+10=font,0,0,0,-36,0,0,0,400,0,0,0,128,3,2,1,50,\82l\82\82o\83S\83V\83b\83N
+11=|Welcome to 
+12=font,0,0,0,-36,0,0,0,400,0,0,0,128,3,2,1,50,\82l\82\82o\83S\83V\83b\83N
+13=|DokoPop!/Unicode
+14=font,0,0,0,-12,0,0,0,400,0,0,0,128,3,2,1,50,\82l\82\82o\83S\83V\83b\83N
+15=mode,bottom
+16=rect,7,70
+17=|
+18=|\83A\83\93\83C\83\93\83X\83g\81[\83\8b\82Í
+19=|
+20=|\83R\83\93\83g\83\8d\81[\83\8b\83p\83l\83\8b\82Ì\81u\83A\83v\83\8a\83P\81[\83V\83\87\83\93\82Ì\92Ç\89Á\82Æ\8dí\8f\9c\81v\82©\82ç
+21=|
+22=|\81uDokoPop!\81v\82ð\91I\91ð\81\95\8eÀ\8ds\82µ\82Ä\82­\82¾\82³\82¢\81D
+23=/-----
+No=24
diff --git a/dchooku.tpl b/dchooku.tpl
new file mode 100644 (file)
index 0000000..bf9531f
--- /dev/null
@@ -0,0 +1,377 @@
+#!perl -S mktpl.pl dchooku.tpl
+------------------------------------------------------------------------
+ DCHOOK/Unicode Document Template
+------------------------------------------------------------------------
+%NEWMAJOR=2
+%NEWMINOR=0
+%NEWRELEASE=23
+%POST=
+%OLDMAJOR=2
+%OLDMINOR=0
+%OLDRELEASE=22
+%OLDPOST=
+
+%DATE_Y=16             \8cö\8aJ\93ú
+%DATE_M=10
+%DATE_D=06
+
+%TIME_H=02
+%TIME_M=00
+%TIME_S=00
+
+%DATE_YY=20%DATE_Y%
+%VERSION = %NEWMAJOR%.%NEWMINOR%%NEWRELEASE%%POST%
+%VER=%NEWMAJOR%%NEWMINOR%%NEWRELEASE%
+%OLDVERSION=%OLDMAJOR%.%OLDMINOR%%OLDRELEASE%%OLDPOST%
+%OLDVER=%OLDMAJOR%%OLDMINOR%%OLDRELEASE%
+%DATE=%DATE_YY%.%DATE_M%.%DATE_D%
+
+%INSTALLER=DKPU%VER%.exe
+
+%HTML=S:\Web\NIFTY\
+%SAKURA=S:\web\sakura-pdic\cgi-bin\download\files\
+
+#\88È\89º\82ÍMKU.BAT\97p
+%FDATE=%DATE_M%/%DATE_D%/%DATE_Y%
+%FTIME=%TIME_H%:%TIME_M%:%TIME_S%
+%PDNEW=%VER%
+%PDOLD=%OLDVER%
+
+%VARFILE=%HTML%pdic-unicode.var
+%IND=dchooku.ind
+%CHGINI=perl -S chgini.pl
+
+%KEY1=DOKOPOP
+%KEY2=PDIC
+%KEY3=$WIN32
+%KEY4=#APP
+%KEY5=#EDU
+
+****************** UPDATE \93à\97e **************************************
+<*UPDATE.TXT
+##EOF
+******************** DokoPop! \82Ì\95Ï\8dX\97\9a\97ð ****************************
+##<*HISTORY.TXT
+##>UPDATE.TXT
+
+>> Ver.2.00 <<
+  \81E\95\8e\9a\94F\8e¯\82É\82æ\82è\81A\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82ª\82Å\82«\82é\82Æ\82±\82ë\82ª\91\9d\82¦\82½
+  \81E\83}\83E\83X\82Ì\92\86\89\9b\83{\83^\83\93\82Ö\82Ì\91Î\89\9e
+
+>> Ver.1.23 <<
+  \81EDDE\82Å\91\97\90M\82·\82é\83f\81[\83^\82Ì\8c`\8e®\82ª\90³\82µ\82­\8ew\92è\82³\82ê\82Ä\82¢\82È\82©\82Á\82½(CF_TEXT->CF_UNICODETEXT)
+
+>> Ver.1.22 <<
+  \81E\83N\83\8a\83b\83N\82·\82é\91Î\8fÛ\82Ì\83E\83B\83\93\83h\83E\82ª\94ñUnicode\82Å\82 \82é\8fê\8d\87\93®\8dì\82µ\82È\82©\82Á\82½
+
+>> Ver.1.21 <<
+  \81E\8e«\8f\91\83O\83\8b\81[\83v\82Ì\91I\91ð\82ª\90³\82µ\82­\93®\8dì\82µ\82È\82¢\96â\91è\82ð\8fC\90³
+
+>> Ver.1.20 <<
+  \81EPDIC/Unicode Ver.5.0.x\82É\91Î\89\9e
+
+>> Ver.1.15 <<
+  \81EPDIC/Unicode Ver.0.83\82É\91Î\89\9e
+  \81Edialog\82Ì\8fo\82é\8fê\8f\8a\82ðDesktopCenter\81¨ScreenCenter (\83}\83\8b\83`\83\82\83j\83^\91Î\89\9e)
+
+>> Ver.1.14 <<
+  \81EDokoPop!\82É\8aÖ\82µ\82Ä\82Í\92Ê\8fí\82Ì\83o\81[\83W\83\87\83\93\94Ô\8d\86\82ð\95t\82¯\82é\82±\82Æ\82É\82µ\82½
+    - DokoPop!\82Í\83À\94Å\82Æ\90³\8e®\94Å\82Ì\8eÀ\8dÛ\93I\82È\88á\82¢\82ª\96³\82¢\82½\82ß
+    - DokoPop!\82Í\83I\81[\83v\83\93\83\\81[\83X\82Å\82 \82è\81APDIC\96{\91Ì\82Æ\82Í\95Ê\94z\95z\82Å\82 \82é\82½\82ß\81A
+      PDIC\96{\91Ì\82Æ\93¯\8aú\82·\82é\83À\94Å\82Æ\8c¾\82¤\93K\93\96\82È\8bæ\90Ø\82è\82ª\96³\82¢\82½\82ß
+  \81E\83o\81[\83W\83\87\83\93\94Ô\8d\86\82Ífor Win32\94Å\82Æ\8b¤\92Ê\89»\81i\83\\81[\83X\83R\81[\83h\82ª\93¯\82\82½\82ß\81j
+  * \95\82Ì\8dÅ\8cã\82Ì\92P\8cê\82ª\83q\83b\83g\82µ\82È\82©\82Á\82½\81iDokoPop!\82Ì\8dÅ\90V\94Å\82ª\95K\97v\81j
+    \81y\8c´\88ö\81z
+  \81@\8eæ\93¾\82µ\82½\95\8e\9a\97ñ\82Ì\8dÅ\8cã\82É\83S\83~\82ª\95t\91®\82µ\82½\82±\82Æ\82É\82æ\82è\81A\82»\82ê\82ðPDIC\82ª\92Ê\8fí\82Ì\83e\83L\83X\83g
+  \81@\82Æ\94F\8e¯\82µ\82Ä\82µ\82Ü\82¢\81A\95\82Ì\8dÅ\8cã\82Ì\83s\83\8a\83I\83h\82ª\92P\8cê\92\86\82Ì\95\8e\9a\97ñ\82Æ\82µ\82Ä\8f\88\97\9d\82³\82ê\82½\82½\82ß\81B
+
+>> Ver.0.10 <<
+\81E\8dÅ\8f\89\82Ì\8cö\8aJ
+##EOF
+****************** \8e©\8cÈ\8fÐ\89î ******************************************
+##<*PROB.TXT
+##EOF
+
+##<*INTRO.TXT
+\81@DokoPop! - \82Ç\82±\83|\83b\83v\81\82Í\81ACtrl+\83}\83E\83X\89E\83N\83\8a\83b\83N\82Å\81A
+\81@\83}\83E\83X\83J\81[\83\\83\8b\88Ê\92u\82Ì\89p\92P\8cê\81E\89p\8fn\8cê\82ð\8c\9f\8dõ\82µ\81A\83|\83b\83v\83A\83b\83v\95\\8e¦\82µ\82Ü\82·\81B
+
+\81@\82Ç\82±\83|\83b\83v\81\82Í PDIC/Unicode\82ÌDDE\8b@\94\\82ð\97\98\97p\82µ\82Ä\82¢\82Ü\82·\81B
+\81@\95Ê\93rPDIC/Unicode\82ð\93ü\8eè\82µ\82Ä\89º\82³\82¢\81B
+
+\81@PDIC/Unicode \82Ì\93ü\8eè\90æ(\95K\90{)\81F
+  http://pdic.la.coocan.jp/
+
+\81@\83\\81[\83X\83t\83@\83C\83\8b\81F
+  http://dokopop.sourceforge.jp/
+##EOF
+
+##<DKPUu.TXT
+========================================================================
+\81y\83\83\83g\96¼\81z  \82Ç\82±\83|\83b\83v\81I Ver.%VERSION%
+\81y\93o  \98^  \96¼\81z\81@%INSTALLER%
+\81y\83o\83C\83g  \90\94\81z  <FILESIZE:%INSTALLER%> Bytes
+\81y\8c\9f\8dõ  \83L\81[\81z\81@1:%KEY1% 2:%KEY2% 3:%KEY3% 4:%KEY4% 5:%KEY5%
+\81y\92\98\8dì\8c   \8eÒ\81z\81@\82È\82µ
+\81y\8cf  \8dÚ  \8eÒ\81z\81@DokoPop Project
+\81y\91Î\89\9e  \8b@\8eí\81z\81@MS-Windows Vista/7/8/8.1/10
+\81y\93®\8dì  \8am\94F\81z\81@IBM PC/AT\8cÝ\8a·\8b@,7/8/8.1/10
+\81y\8cf  \8dÚ  \93ú\81z\81@%DATE%
+\81y\8dì\90¬  \95û\96@\81z\81@%INSTALLER% \82ð\8eÀ\8ds\82·\82é
+\81y¿Ìijª±\8eí\95Ê\81z\81@\83t\83\8a\81[\83E\83F\83A
+\81y\93]\8dÚ  \8fð\8c\8f\81z  \93]\8dÚ\8e©\97R
+========================================================================
+\81y\83\\83t\83g\8fÐ\89î\81z
+
+##>INTRO.TXT
+
+##>UPDATE.TXT
+
+\8c»\8dÝ\82Ì\96â\91è\93_
+
+##>PROB.TXT
+
+========================================================================
+\83_\83E\83\93\83\8d\81[\83h\83t\83@\83C\83\8b\96¼\82Í\81y%INSTALLER%\81z\82Å\82·\81B
+##EOF
+
+<DKPU.TXT
+=============================================
+      \82Ç\82±\83|\83b\83v\81I/Unicode    Ver.%VERSION%
+=============================================
+\8fÐ\89î ---------------------------------------------------------
+
+\81@\81u\82Ç\82±\83|\83b\83v\81I/Unicode\81v\82Í\81APersonal Dictionary/Unicode\94Å(\88È\89ºPDIC)
+\81@\82Æ\98A\8cg\82µ\82Ä\81A\83}\83E\83X\83N\83\8a\83b\83N\82É\82æ\82Á\82Ä\83}\83E\83X\88Ê\92u\82Ì\92P\8cê\82ð\8c\9f\8dõ\81A\93ú\96{\8cê\96ó\82È
+\81@\82Ç\82ð\83|\83b\83v\83A\83b\83v\83E\83B\83\93\83h\83E\82É\82æ\82Á\82Ä\95\\8e¦\82·\82é\83\\83t\83g\83E\83F\83A\82Å\82·\81B
+\81@Unicode\82É\91Î\89\9e\82µ\82Ä\82¢\82Ü\82·\81B
+
+\93®\8dì\8am\94FOS ---------------------------------------------------
+
+\81@Windows7/8/8.1/10
+
\81¦Windows2000/XP\82Å\8eg\97p\82·\82é\82±\82Æ\82à\89Â\94\\82Å\82·\82ª\81A\95\8e\9a\94F\8e¯\82ð\97\98\97p\82µ\82½\82¢\8fê\8d\87\81A\90Ý\92è\82ª\95K\97v\82Å\82·\81B\81i\81¨\95\8e\9a\94F\8e¯\82Ì\8fê\8f\8a)
+
+\8f\80\94õ ---------------------------------------------------------
+
+\81@%INSTALLER%\82ð\82»\82Ì\82Ü\82Ü\8eÀ\8ds\82µ\82Ä\89º\82³\82¢\81B
+\81@\8e©\93®\93I\82É\83C\83\93\83X\83g\81[\83\8b\82³\82ê\82Ü\82·\81B
+\81@\83X\83^\81[\83g\83A\83b\83v\82É\93o\98^\82µ\82½\95û\82ª\95Ö\97\98\82Å\82·\81B(Windows\8bN\93®\8e\9e\82ÉDokoPop!\82à\8bN\93®)
+
+\81@\82Ç\82±\83|\83b\83v\81I\82É\82ÍPDIC/Unicode Ver.5.7.21\88È\8d\82ª\95K\97v\82Å\82·\81B
+  http://pdic.la.coocan.jp/
+  \82©\82ç\83_\83E\83\93\83\8d\81[\83h\82µ\82Ä\89º\82³\82¢\81B
+
+\8eg\97p\95û\96@ -----------------------------------------------------
+
+\81@DKPU.EXE\82ð\8bN\93®\82·\82é\82Æ\83^\83X\83N\83g\83\8c\83C\82É\8fí\92\93\82µ\82Ü\82·\81B(DP\82Æ\8f\91\82¢\82Ä\82 \82é\83A\83C\83R\83\93)
+\81@Ctrl\83L\81[\82ð\89\9f\82µ\82È\82ª\82ç\83}\83E\83X\82Ì\89E\83{\83^\83\93\82ð\83N\83\8a\83b\83N\82·\82é\82Æ\81A\83N\83\8a\83b\83N\82µ\82½\88Ê\92u\82Ì
+\81@\92P\8cê\82Ü\82½\82Í\8fn\8cê\82Ì\88Ó\96¡\82ð\95\\8e¦\82µ\82Ü\82·\81B
+
+  \81y\92\8d\88Ó\81zPDIC\96{\91Ì\82Í\95K\82¸\8e«\8f\91\83O\83\8b\81[\83v\82ð\83I\81[\83v\83\93\82µ\82½\8fó\91Ô\82É\82µ\82Ä\82¨\82¢\82Ä\82­\82¾\82³\82¢\81B
+          \82Â\82Ü\82è\81A\92Ê\8fí\82Ì\8c\9f\8dõ(WORD\97\93\93ü\97Í\81j\82ª\82Å\82«\82é\8fó\91Ô\82É\82µ\82Ä\82¨\82¢\82Ä\82­\82¾\82³\82¢\81B
+          (\83\81\83j\83\85\81[\82Ì File | \8e«\8f\91\83O\83\8b\81[\83v\83I\81[\83v\83\93)
+          \8e«\8f\91\95Ï\8a·\92\86\82È\82Ç\81A\92Ê\8fí\82Ì\8c\9f\8dõ\82ª\82Å\82«\82È\82¢\8fó\91Ô\82Å\82Í\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82Í
+          \82Å\82«\82Ü\82¹\82ñ\81B
+
+  \81y\92\8d\88Ó\81zMS-Word\82Å\82Í Ctrl+\89E\83N\83\8a\83b\83\82ª\83J\83b\83g\81\95\83y\81[\83X\83g\82É\8a\84\82è\93\96\82Ä\82ç\82ê\82Ä\82¢\82é
+          \82½\82ß\81A\82¤\82Ü\82­\93®\8dì\82µ\82È\82¢\82Æ\82«\82ª\82 \82è\82Ü\82·\81B
+          \81i\81u\82Í\82\82ß\82É\91I\91ð\82µ\82Ä\82­\82¾\82³\82¢\81v\82È\82Ç\82Æ\8fo\82Ä\82­\82é\81j
+          \82à\82µ\82±\82Ì\96â\91è\82ð\89ñ\94ð\82µ\82½\82¢\8fê\8d\87\82Í\81A\8e\9f\82Ì\81u\82¿\82å\82Á\82Æ\95Ö\97\98\82È\8eg\97p\95û\96@\81v
+          \82É\82 \82é\82æ\82¤\82É\81A\81u\89E\83N\83\8a\83b\83N\82¾\82¯\82Å\83|\83b\83v\83A\83b\83v\81v\82É\82·\82é\82©\81A
+          \8e\9f\82Ì\82æ\82¤\82É\90Ý\92è\82ð\8ds\82Á\82Ä\82­\82¾\82³\82¢\81B
+          DokoPop!\82Ì\83^\83X\83N\83g\83\8c\83C\82Ì\83\81\83j\83\85\81[\82©\82ç\81A[\90Ý\92è...]\82ð\91I\82Ñ\81A
+          \81u\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\81v\82©\82ç\81A\83|\83b\83v\83A\83b\83v\82ð\82³\82¹\82é\82Æ\82«\82Ì\91g\82Ý\8d\87\82í\82¹\82ð
+          \91I\82ñ\82Å\82­\82¾\82³\82¢\81B
+          Alt + \89E\83N\83\8a\83b\83\82Å\82 \82ê\82Î\96â\91è\82È\82¢\82æ\82¤\82Å\82·\81B
+
+\82¿\82å\82Á\82Æ\95Ö\97\98\82È\8eg\97p\95û\96@ ---------------------------------------
+
+\81@\81uCtrl + \89E\83N\83\8a\83b\83N\81v\82Í\82í\82¸\82ç\82í\82µ\82¢\81I\81I
+\81@\82Æ\82¢\82¤\90l\82É\82Í\81A
+
+\81@\81u\89E\83N\83\8a\83b\83N\82¾\82¯\82Å\83|\83b\83v\83A\83b\83v\81v
+
+\81@\82Æ\82¢\82¤\95û\96@\82à\82 \82è\82Ü\82·\81B
+\81@Ctrl + Alt + \89E\83N\83\8a\83b\83\82ÅON/OFF\82Ì\90Ø\82è\91Ö\82¦\82ª\82Å\82«\82Ü\82·\81B
+\81@\81i\90Ø\82è\91Ö\82¦\8e\9e\82É\83\81\83b\83Z\81[\83W\82ª\8fo\82Ü\82·)
+
+\81@\83q\83\93\83g\81F\81u\89E\83N\83\8a\83b\83N\82¾\82¯\81v\82É\82µ\82½\8fê\8d\87\81A\81uCtrl + \89E\83N\83\8a\83b\83N\81v\82ð\82·\82é\82Æ\81A
+\81@\81@\81@\81@\81@\92Ê\8fí\82Ì\89E\83N\83\8a\83b\83N\83\81\83j\83\85\81[\82ª\8fo\82Ä\82«\82Ü\82·\81B
+\81@\81@\81@\81@\81@\82¿\82å\82¤\82Ç\81uCtrl\81v\82ª\8bt\93]\82·\82é\8a´\82\82É\82È\82è\82Ü\82·\81B
+
+\83\81\83j\83\85\81[ -----------------------------------------------------
+
+\81@\83^\83X\83N\83g\83\8c\83C\82ÌDokoPop!\83A\83C\83R\83\93\82ð\89E\83N\83\8a\83b\83N\82·\82é\82Æ\83\81\83j\83\85\81[\82ª\8c»\82ê\82Ü\82·\81B
+
+\81@\8e«\8f\91\83O\83\8b\81[\83v         - PDIC\82Ì\8e«\8f\91\83O\83\8b\81[\83v\82Ì\95Ï\8dX\82ð\8ds\82¢\82Ü\82·
+\81@\89E\83N\83\8a\83b\83N\8c\9f\8dõ       - \83}\83E\83X\82Ì\89E\83N\83\8a\83b\83N\82¾\82¯\82Å\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82ð\8ds\82¢\82Ü\82·
+\81@\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\97L\8cø - \8c\9f\8dõ\82ð\97L\8cø\81^\96³\8cø\82É\82µ\82Ü\82·
+\81@\90Ý\92è                 - \8ae\8eí\90Ý\92è\82ð\8ds\82¢\82Ü\82·
+\81@\90à\96¾\8f\91\82ð\95\\8e¦         - \82±\82Ì\83t\83@\83C\83\8b\82ð\95\\8e¦\82µ\82Ü\82·
+\81@\83o\81[\83W\83\87\83\93           - version\95\\8e¦
+\81@\8fI\97¹                 - \82Ç\82±\83|\83b\83v\81I\82Ì\8fI\97¹
+
+\90Ý\92è ---------------------------------------------------------
+
+  \83^\83X\83N\83g\83\8c\83C\82Ì\89E\83N\83\8a\83b\83N\82Å\8fo\82Ä\82«\82½\83\81\83j\83\85\81[\82Ì\81u\90Ý\92è\81v\82Å\82·\81B
+
+  \81¡\8bN\93®\8e\9e\82É\83X\83v\83\89\83b\83V\83\85\82ð\95\\8e¦\82·\82é
+    \8bN\93®\8e\9e\82Ì\89æ\96Ê\92\86\89\9b\82É\8fo\82Ä\82­\82é\83E\83B\83\93\83h\83E\82Ì
+    \95\\8e¦\82ð\97L\8cø\81^\96³\8cø\82É\82µ\82Ü\82·\81B
+
+    \81\9a\8bN\93®\8e\9e\82Ì\83X\83v\83\89\83b\83V\83\85\83r\83b\83g\83}\83b\83v\82ð\83J\83X\83^\83}\83C\83Y\81\9a
+    DKPU.EXE\82ª\82 \82é\83t\83H\83\8b\83_\81[\82É DKPU.BMP \82Æ\82¢\82¤\83t\83@\83C\83\8b\82ª\82 \82é\82Æ\81A
+    \82»\82Ì\83r\83b\83g\83}\83b\83v\82ð\8bN\93®\8e\9e\82Æ\83o\81[\83W\83\87\83\93...\82Ì\82Æ\82«\82É\95\\8e¦\82µ\82Ü\82·\81B
+
+  \81¡\8e«\8f\91\83O\83\8b\81[\83v\82ð\8ew\92è\82·\82é
+    \82±\82±\82ð\83`\83F\83b\83N\82·\82é\82Æ\81A\83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82ð\8ds\82¤\82Æ\82«\82É
+    \82±\82±\82Å\8ew\92è\82µ\82½\8e«\8f\91\83O\83\8b\81[\83v\82ð\8eg\97p\82µ\82Ü\82·\81B
+    PDIC\96{\91Ì\82Å\82Ì\8e«\8f\91\83O\83\8b\81[\83v\82Ì\91I\91ð\82ª\95Ï\8dX\82³\82ê\82Ü\82·\81B
+
+  \81¡\83|\83b\83v\83A\83b\83v\8c\9f\8dõ - \83|\83b\83v\83A\83b\83v\8c\9f\8dõ\82ð\8ds\82¤\83}\83E\83X\82Æ\83L\81[\82Ì\91g\82Ý\8d\87\82í\82¹\82ð\8ew\92è\82µ\82Ü\82·\81B
+
+  \81¡\89E\83N\83\8a\83b\83N\8c\9f\8dõON/OFF
+    \89E\83N\83\8a\83b\83N\8c\9f\8dõ\82Ì\97L\8cø\81E\96³\8cø\82ð\90Ø\82è\91Ö\82¦\82é\83}\83E\83X\82Æ\83L\81[\82Ì\91g\82Ý\8d\87\82í\82¹\82Å\82·\81B
+
+  \81¡\89p\90\94\8e\9a\82Ì\82Ý\8c\9f\8dõ\82·\82é
+    \93ú\96{\8cê\81E\89p\90\94\8e\9a\8d¬\8dÝ\82Ì\95\8fÍ\82ª\82 \82Á\82½\8fê\8d\87\81A\93ú\96{\8cê\82ð\96³\8e\8b\82µ\82Ä\8c\9f\8dõ\82ð\8ds\82¢\82Ü\82·\81B
+    \8d¬\8dÝ\95\8fÍ\82Å\82Í ON \82É\82µ\82½\82Ù\82¤\82ª\83q\83b\83g\82µ\82â\82·\82­\82È\82è\82Ü\82·\81B
+    \82Ü\82½\81A\83t\83\89\83\93\83X\8cê\81A\83h\83C\83c\8cê\82Ì\82æ\82¤\82È\83E\83\80\83\89\83E\83g\81E\83A\83N\83T\83\93\82È\82Ç\82ð
+    \8aÜ\82Þ\95\8fÍ\82Å\82Í\82±\82±\82ð OFF \82É\82µ\82È\82¢\82Æ\82¤\82Ü\82­\93®\8dì\82µ\82È\82¢\8fê\8d\87\82ª\82 \82è\82Ü\82·\81B
+
+  \81¡\94F\8e¯\83\82\81[\83h\82Ì\90Ý\92è
+    \81E\95\8e\9a\94F\8e¯\81{\95\8e\9a\92\8a\8fo
+    \81E\95\8e\9a\94F\8e¯\82Ì\82Ý
+    \81E\95\8e\9a\92\8a\8fo\82Ì\82Ý
+    \92Ê\8fí\88ê\94Ô\8fã\82Ì\90Ý\92è\82ª\82¢\82¢\82Æ\8ev\82¢\82Ü\82·\82ª\81A\83|\83b\83v\83A\83b\83v\82µ\82È\82¢\81A\83A\83v\83\8a\82ª\97\8e\82¿\82é\81A\82È\82Ç\82Ì\8fê\8d\87\82Í
+    \90Ý\92è\82ð\95Ï\8dX\82·\82é\82Æ\82¤\82Ü\82­\82¢\82­\82æ\82¤\82É\82È\82é\82©\82à\82µ\82ê\82Ü\82¹\82ñ\81B
+    \81¦DokoPop! Ver.1\82Í\81u\95\8e\9a\92\8a\8fo\82Ì\82Ý\81v\82Æ\93¯\82\93®\8dì\82ð\82µ\82Ü\82·
+
+  \81¡\95\8e\9a\94F\8e¯\82Ì\8fê\8f\8a - \8fã\8b\89\8eÒ\8cü\82¯
+    MODI\82ð\83C\83\93\83X\83g\81[\83\8b\82Å\82«\82È\82¢\8fê\8d\87\82É\81A\91¼\82ÌPC\82É\82 \82éAMODI\82ð\97\98\97p\82·\82é\82±\82Æ\82ÅMODI\82ð\97\98\97p\89Â\94\\82É\82µ\82Ü\82·\81B
+    \8fê\8f\8a\82Æ\82µ\82Ä\81A
+    %TEMP%\amodi
+    \82ð\8ew\92è\82µ\82Ü\82·\81B
+    \97á\81F
+    \\server\temp\amodi
+    \81¦\83t\83@\83C\83\8b\8b¤\97L\8co\97R\82Å\97\98\97p\82µ\82Ü\82·\81B
+
+  \81¡64\83r\83b\83g\83t\83b\83N\82ð\8eg\97p\82·\82é
+    64bitWindows\82Å\82¤\82Ü\82­\83q\83b\83g\82µ\82È\82¢\8fê\8d\87\82É\82±\82±\82ð\83`\83F\83b\83N\82·\82é\82Æ\93®\8dì\82·\82é\82©\82à\82µ\82ê\82Ü\82¹\82ñ\81B
+
+\8c¾\8cê\94»\92èDLL --------------------------------------------------
+
+\81@DokoPop!/Unicode\82Å\82Í\81A\8c\9f\8dõ\91Î\8fÛ\82Ì\92P\8cê\82ð\90Ø\82è\8fo\82·\8dÛ\82É\81A\91Î\8fÛ\8c¾\8cê\82ª
+\81@\89¢\95Ä\8cn\82Ì\8c¾\8cê - \82±\82±\82Å\82Í\92P\8cê\82Ì\8bæ\90Ø\82è\82É\94¼\8ap\83X\83y\81[\83X\82ð\8eg\82¤\8c¾\8cê\82Æ\82¢\82¤\88Ó\96¡\82Å
+\81@\92è\8b` - \82ð\91O\92ñ\82Æ\82µ\82Ä\88µ\82Á\82Ä\82¢\82Ü\82·\81B
+\81@\82µ\82©\82µ\81A\89¢\95Ä\8cn\88È\8aO\82Ì\8c¾\8cê\81A\97á\82¦\82Î\93ú\96{\8cê\82Ì\82æ\82¤\82É\92P\8cê\82Ì\8bæ\90Ø\82è\82Í\93ú\96{\8cê\82ð
+\81@\97\9d\89ð\82Å\82«\82é\90l\82É\82µ\82©\82í\82©\82è\82Ü\82¹\82ñ\81B\93\96\91R\81A\83R\83\93\83s\83\85\81[\83^\81[\82É\82à\92P\8cê\82Ì\8bæ\90Ø\82è\82ð
+\81@\8aÈ\92P\82É\97\9d\89ð\82³\82¹\82é\82±\82Æ\82Í\82Å\82«\82Ü\82¹\82ñ\81B
+\81@\81i\93ú\96{\8cê\93ü\97Í\82Å\95\90ß\82Ì\8bæ\90Ø\82è\82ð\82Æ\82«\82Ç\82«\8aÔ\88á\82¦\82é\82æ\82¤\82É\81j
+\81@\82³\82ç\82É\81AUnicode\82Å\88µ\82¦\82é\8c¾\8cê\82É\82Í\93ú\96{\8cê\82Ì\82æ\82¤\82È\8c¾\8cê\82ª\90\94\91½\82­\82 \82è\81A
+\81@\8ae\8c¾\8cê\82Ì\95\96@\82ð\95×\8b­\82µ\81A\91g\82Ý\8d\9e\82Þ\95K\97v\82ª\82 \82è\82Ü\82·\81B
+
+\81@\82±\82Ì\82½\82ß\82Ì\8aJ\94­\8fî\95ñ\82ð\82±\82¿\82ç\82Å\8cö\8aJ\82µ\82Ä\82¢\82Ü\82·\81B
+\81@http://pdic.la.coocan.jp/unicode/langproc.html
+
+\82»\82Ì\91¼ -------------------------------------------------------
+
+\81@\8dÄ\97\98\97p\81E\8dÄ\94z\95z\81E\89ü\95Ï\82È\82Ç\82Í\8e©\97R\82Å\82·\81B
+\81@\82±\82Ì\83\\83t\83g\83E\83F\83A\82É\82æ\82é\91¹\8aQ\82Í\88ê\90Ø\82»\82Ì\90Ó\94C\82ð\95\89\82¢\82Ü\82¹\82ñ\81B
+
+\81@\82±\82Ìprogram\82Í\81Aopen source\82Å\82 \82éDCHook\82Ìsample program\82Å\82·\81B
+\81@\83\\81[\83X\83t\83@\83C\83\8b\82Í\81A
+\81@http://dokopop.sourceforge.jp/
+\81@\82É\82 \82è\82Ü\82·\81B
+
+\81@PDIC/Unicode\82Í
+\81@http://pdic.la.coocan.jp/unicode/
+
+\97\9a\97ð ---------------------------------------------------------
+
+##>HISTORY.TXT
+
+--------------------------------------------------------------
+##EOF
+
+****************** \83p\83b\83P\81[\83W\8dì\90¬\97p.BAT\83t\83@\83C\83\8b *******************************
+<MKU.BAT
+@echo off
+echo/
+echo \8a®\91S\94Å\83p\83b\83P\81[\83W\82ð\8dì\90¬\82µ\82Ü\82·
+echo/
+echo \81¡\8am\94F\8e\96\8d\80
+echo \81E./dchooktest/dchooktest.exe\82ð\8f\80\94õ(USE_UNICODE defined)
+echo \81E\83o\81[\83W\83\87\83\93\94Ô\8d\86\81F.bpr\82ÆUtil.cpp(StrVersion, VersionValue)\82Ì\97¼\95û\82ª\95K\97v
+echo \81ERelease Build?
+echo \81EVisualStudio2008\82Åbuild\82µ\82½\82©\81H for W2K
+pause
+set TZ=JST-9
+
+echo/
+echo Copy the binary to the ind directory.
+echo/
+pause
+
+make copy_bin
+
+rem touch -d%FDATE% -t%FTIME% -c ind\DKPU.EXE ind\DKPUHK.DLL
+
+rem dkpu.iss\82Ì\8dX\90V
+perl change_iss.pl ind\dkpu.iss Setup AppVerName "DokoPop! %VERSION%" > ind\dkpu.iss.new
+del ind\dkpu.iss.old
+ren ind\dkpu.iss dkpu.iss.old
+ren ind\dkpu.iss.new dkpu.iss
+
+rem Installer \82Ì\8eÀ\8ds
+make buildis
+
+echo/
+echo Press Enter key after installer made.
+echo/
+pause
+
+copy ind\Output\setup.EXE %INSTALLER%
+dir %INSTALLER%
+
+rem lha32 a %INSTALLER% DKPU.TXT DKPU.EXE DKPUHK.DLL
+ren %INSTALLER% %INSTALLER%
+rem touch -d%FDATE% -t%FTIME% -c %INSTALLER%
+
+echo/
+echo \83\\81[\83X\83t\83@\83C\83\8b\82ðzip\82µ\82Ü\82·
+echo/
+pause
+
+make zip_src
+copy src.zip src-%VERSION%.zip
+rem copy src-%VERSION%.zip zip
+
+echo/
+echo \8cö\8aJ\97p\83t\83@\83C\83\8b\82ð\8dX\90V\82µ\82Ü\82·
+echo/
+rem pause
+
+perl -S -i.bak filestamp.pl DKPUu.TXT
+del DKPUu.TXT.bak
+
+echo/
+echo Web\97p\82Ì\83t\83@\83C\83\8b\82ð\8dX\90V\82µ\82Ü\82·
+echo/
+pause
+
+rem copy %INSTALLER% %HTML%
+rem del %HTML%DKPU%OLDVER%.EXE
+copy %INSTALLER% %SAKURA%
+del %SAKURA%DKPU%OLDVER%.EXE
+
+rem echo [del] >> %HTML%ftp.ctl
+rem echo DKPU%OLDVER%.EXE >> %HTML%ftp.ctl
+rem echo [include] >> %HTML%ftp.ctl
+rem echo %INSTALLER% >> %HTML%ftp.ctl
+
+##EOF
+
+<<@%VARFILE%,DU_
+
diff --git a/mktpl.bat b/mktpl.bat
new file mode 100644 (file)
index 0000000..9167f02
--- /dev/null
+++ b/mktpl.bat
@@ -0,0 +1,2 @@
+@echo off
+Perl -S mktpl.pl dchook.tpl
diff --git a/mktplu.bat b/mktplu.bat
new file mode 100644 (file)
index 0000000..04034c1
--- /dev/null
@@ -0,0 +1,2 @@
+@echo off
+Perl -S mktpl.pl dchooku.tpl