home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1998 September / VPR9809B.ISO / APUPDATE / VC / Tx300d / TX300D.LZH / APPCTRL.C < prev    next >
Text File  |  1996-03-22  |  5KB  |  237 lines

  1. // WZ EDITOR 標準TLL
  2. // Windowsアプリコントロール
  3. // Copyright 1995-96 TY
  4.  
  5. //{###Windowsアプリコントロール}
  6. // 他のWindowsアプリをコントロールする関数群です
  7. // WZ32では、WindowsAPI:GetFocusの仕様がWin16から変更されたため、
  8. // WZ16でGetFocusをつかって実装されていたAPIが使えません。
  9. // WZ32では、他アプリコントロールは、OLEオートメーションを用いて行うことができるように
  10. // したいと考えています。
  11.  
  12. // WZ32:ジャーナルプレイバックでは駄目か?漢字入力もプレイバックできるのか?
  13.  
  14. #include <windows.h>
  15.  
  16. extern "tx" {
  17. void WINAPI PostVirtualKeyEvent(BYTE bVirtKey,BOOL fUp);
  18. }
  19.  
  20. //
  21. //    Application control library
  22. //
  23.  
  24.  
  25. #if 0
  26. // 「コンパイル中」ダイアログを消す。
  27. // 消さないとこのダイアログにキーが送られてしまうことがある
  28. void apcInit(void)
  29. {
  30.     txcCloseDialog();
  31. }
  32. #endif
  33.  
  34. BOOL TXAPI apIsFocus(mchar *str)
  35. {
  36. // strのキャプションを持つwindowがfocusを持っているかどうか調べます。
  37. // キャプション名の先頭がstrと一致するwindowを対象とします。
  38. // WZ32では使えません
  39.     HWND hwnd = GetFocus();
  40.     mchar buff[CCHAPPNAME];
  41.     
  42.     hwnd = GetParent(hwnd);
  43.     GetWindowText(hwnd,buff,cchof(buff));
  44. //information("%s",buff);
  45.     if (!memcmp(buff,str,strlen(str))) {
  46.         return TRUE;
  47.     }
  48.     return FALSE;
  49. }
  50.  
  51. BOOL TXAPI apPushButton(mchar *str)
  52. {
  53. // strのボタンをクリックします。
  54. // ボタン名の先頭がstrと一致するボタンをクリックします。
  55. // WZ32では使えません
  56.     HWND _hwnd = GetFocus();
  57.     int len = strlen(str);
  58.     HWND hwnd = _hwnd;
  59.     BOOL fPrev = TRUE;
  60.     
  61.     while(1) {
  62.         while(1) {
  63.             {
  64.                 mchar buff[CCHAPPNAME];
  65.                 
  66.                 GetWindowText(hwnd,buff,cchof(buff));
  67.                 if (!memcmp(buff,str,len)) {
  68.                     PostMessage(hwnd,WM_LBUTTONDOWN,0,0);
  69.                     PostMessage(hwnd,WM_LBUTTONUP,0,0);
  70.                     sleep(0);
  71. //                    information("%s",buff);
  72.                     return TRUE;
  73.                 }
  74.             }
  75.             if (fPrev) {
  76.                 hwnd = GetWindow(hwnd,GW_HWNDPREV);
  77.                 if (hwnd == NULL) {
  78.                     hwnd = _hwnd;
  79.                     fPrev = FALSE;
  80.                 }
  81.             }
  82.             if (!fPrev) {
  83.                 hwnd = GetWindow(hwnd,GW_HWNDNEXT);
  84.                 if (!hwnd) break;
  85.             }
  86.         }
  87.         // 親へ移動して検索を続ける
  88.         hwnd = _hwnd = GetParent(_hwnd);
  89.         if (!hwnd) break;
  90.     }
  91.     return FALSE;
  92. }
  93.  
  94. HWND TXAPI apSearchWindow(mchar *caption)
  95. {
  96. // captionのキャプション名を持つウィンドウを探してハンドルを返します。
  97. // キャプション名の先頭がcaptionと一致するかどうか、
  98. // 大文字・小文字の区別なしで調べます
  99.     HWND hwnd = GetWindow(GetDesktopWindow(),GW_CHILD);
  100.     
  101.     while(1) {
  102.         {
  103.             mchar buff[CCHAPPNAME];
  104.             
  105.             GetWindowText(hwnd,buff,cchof(buff));
  106. //            information("%s,%s",buff,caption);
  107.             if (!strnicmp(buff,caption,strlen(caption))) {
  108.                 return hwnd;
  109.             }
  110.         }
  111.         hwnd = GetWindow(hwnd,GW_HWNDNEXT);
  112.         if (!hwnd) return NULL;
  113.     }
  114. }
  115.  
  116. #if 0
  117. static HWND wndSearchFocus(HWND hwnd)
  118. {
  119.     while(1) {
  120.         if (HideCaret(hwnd)) {
  121.             ShowCaret(hwnd);
  122.             return hwnd;
  123.         }
  124.         {
  125.             HWND hwndChild = GetWindow(hwnd,GW_CHILD);
  126.             if (hwndChild) {
  127.                 HWND hwnd = wndSearchFocus(hwndChild);
  128.                 if (hwnd) return hwnd;
  129.             }
  130.         }
  131.         hwnd = GetWindow(hwnd,GW_HWNDNEXT);
  132.         if (!hwnd) return NULL;
  133.     }
  134. }
  135. #endif
  136.  
  137. #ifdef __FLAT__
  138. static HWND GetFocus32(void)
  139. {
  140.     return GetForegroundWindow();
  141. }
  142. #endif
  143.  
  144. void TXAPI apPostStr(mchar *str)
  145. {
  146. // フォーカスを持っているウィンドウに文字列strを入力します。
  147. // strをWM_CHARで送ります。
  148. // WZ32では使えません
  149. #ifdef __FLAT__
  150.     HWND hwnd = GetFocus32();
  151. #else
  152.     HWND hwnd = GetFocus();
  153. #endif
  154.     mchar *p = str;
  155.     
  156.     #if 1//1.00E
  157.     sleep(0);
  158.     #endif
  159.     while(1) {
  160.         mchar c = *p++;
  161.         if (c == 0) break;
  162.         if (iskanji(c) && *p) {
  163.             //1.00C CPU負荷軽減に伴い修正
  164.             //漢字の1バイト目と2バイト目の間でsleepすると、駄目だった
  165.             PostMessage(hwnd,WM_CHAR,c,1);
  166.             PostMessage(hwnd,WM_CHAR,*p++,1);
  167.             sleep(0);
  168.         } else {
  169.     #if 1//1.00E 漢字を送ると文字バケすることがあった
  170.             PostMessage(hwnd,WM_CHAR,c,1);
  171.             sleep(0);
  172.     #else
  173.             while(!PostMessage(hwnd,WM_CHAR,c,1)) sleep(0);
  174.     #endif
  175.         }
  176.     }
  177.     sleep(0);
  178. }
  179.  
  180. void TXAPI apPostSysKey(int vk)
  181. {
  182. // フォーカスを持っているウィンドウに仮想キーvkをAltが同時に押されたとして送ります。
  183. //1.01A WZ32でも使えるようになりました
  184. #if 1
  185.     PostVirtualKeyEvent(VK_MENU,0);
  186.     sleep(100);
  187.     PostVirtualKeyEvent(vk,0);
  188.     sleep(100);
  189.     PostVirtualKeyEvent(vk,1);
  190.     sleep(100);
  191.     PostVirtualKeyEvent(VK_MENU,1);
  192.     sleep(100);
  193. #else
  194.     HWND hwnd = GetFocus();
  195.     while(!PostMessage(hwnd,WM_SYSKEYDOWN,vk,0x20000000|1)) sleep(500);
  196.     while(!PostMessage(hwnd,WM_SYSKEYUP,vk,0x80000000|0x20000000|1)) sleep(500);
  197. #endif
  198. }
  199.  
  200. void TXAPI apPostCtrlKey(int vk)
  201. {
  202. // フォーカスを持っているウィンドウに仮想キーvkをCtrlが同時に押されたとして送ります。
  203. //1.00Fで追加
  204. //1.01A WZ32でも使えるようになりました
  205. #if 1
  206.     PostVirtualKeyEvent(VK_CONTROL,0);
  207.     sleep(100);
  208.     PostVirtualKeyEvent(vk,0);
  209.     sleep(100);
  210.     PostVirtualKeyEvent(vk,1);
  211.     sleep(100);
  212.     PostVirtualKeyEvent(VK_CONTROL,1);
  213.     sleep(100);
  214. #else
  215.     HWND hwnd = GetFocus();
  216.     while(!PostMessage(hwnd,WM_SYSKEYDOWN,vk,0x20000000|1)) sleep(500);
  217.     while(!PostMessage(hwnd,WM_SYSKEYUP,vk,0x80000000|0x20000000|1)) sleep(500);
  218. #endif
  219. }
  220.  
  221. void TXAPI apPostKey(int vk)
  222. {
  223. // フォーカスを持っているウィンドウに仮想キーvkを送ります。
  224. //1.01A WZ32でも使えるようになりました
  225. #if 1
  226.     PostVirtualKeyEvent(vk,0);
  227.     sleep(100);
  228.     PostVirtualKeyEvent(vk,1);
  229.     sleep(100);
  230. #else
  231.     HWND hwnd = GetFocus();
  232.     while(!PostMessage(hwnd,WM_KEYDOWN,vk,1)) sleep(0);
  233.     while(!PostMessage(hwnd,WM_KEYUP,vk,0x80000000|1)) sleep(0);
  234. #endif
  235. }
  236.  
  237.