home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 1999 March
/
VPR9903A.BIN
/
APUPDATE
/
VC
/
Tx300d
/
TX300D.LZH
/
APPCTRL.C
< prev
next >
Wrap
Text File
|
1996-03-22
|
5KB
|
237 lines
// WZ EDITOR 標準TLL
// Windowsアプリコントロール
// Copyright 1995-96 TY
//{###Windowsアプリコントロール}
// 他のWindowsアプリをコントロールする関数群です
// WZ32では、WindowsAPI:GetFocusの仕様がWin16から変更されたため、
// WZ16でGetFocusをつかって実装されていたAPIが使えません。
// WZ32では、他アプリコントロールは、OLEオートメーションを用いて行うことができるように
// したいと考えています。
// WZ32:ジャーナルプレイバックでは駄目か?漢字入力もプレイバックできるのか?
#include <windows.h>
extern "tx" {
void WINAPI PostVirtualKeyEvent(BYTE bVirtKey,BOOL fUp);
}
//
// Application control library
//
#if 0
// 「コンパイル中」ダイアログを消す。
// 消さないとこのダイアログにキーが送られてしまうことがある
void apcInit(void)
{
txcCloseDialog();
}
#endif
BOOL TXAPI apIsFocus(mchar *str)
{
// strのキャプションを持つwindowがfocusを持っているかどうか調べます。
// キャプション名の先頭がstrと一致するwindowを対象とします。
// WZ32では使えません
HWND hwnd = GetFocus();
mchar buff[CCHAPPNAME];
hwnd = GetParent(hwnd);
GetWindowText(hwnd,buff,cchof(buff));
//information("%s",buff);
if (!memcmp(buff,str,strlen(str))) {
return TRUE;
}
return FALSE;
}
BOOL TXAPI apPushButton(mchar *str)
{
// strのボタンをクリックします。
// ボタン名の先頭がstrと一致するボタンをクリックします。
// WZ32では使えません
HWND _hwnd = GetFocus();
int len = strlen(str);
HWND hwnd = _hwnd;
BOOL fPrev = TRUE;
while(1) {
while(1) {
{
mchar buff[CCHAPPNAME];
GetWindowText(hwnd,buff,cchof(buff));
if (!memcmp(buff,str,len)) {
PostMessage(hwnd,WM_LBUTTONDOWN,0,0);
PostMessage(hwnd,WM_LBUTTONUP,0,0);
sleep(0);
// information("%s",buff);
return TRUE;
}
}
if (fPrev) {
hwnd = GetWindow(hwnd,GW_HWNDPREV);
if (hwnd == NULL) {
hwnd = _hwnd;
fPrev = FALSE;
}
}
if (!fPrev) {
hwnd = GetWindow(hwnd,GW_HWNDNEXT);
if (!hwnd) break;
}
}
// 親へ移動して検索を続ける
hwnd = _hwnd = GetParent(_hwnd);
if (!hwnd) break;
}
return FALSE;
}
HWND TXAPI apSearchWindow(mchar *caption)
{
// captionのキャプション名を持つウィンドウを探してハンドルを返します。
// キャプション名の先頭がcaptionと一致するかどうか、
// 大文字・小文字の区別なしで調べます
HWND hwnd = GetWindow(GetDesktopWindow(),GW_CHILD);
while(1) {
{
mchar buff[CCHAPPNAME];
GetWindowText(hwnd,buff,cchof(buff));
// information("%s,%s",buff,caption);
if (!strnicmp(buff,caption,strlen(caption))) {
return hwnd;
}
}
hwnd = GetWindow(hwnd,GW_HWNDNEXT);
if (!hwnd) return NULL;
}
}
#if 0
static HWND wndSearchFocus(HWND hwnd)
{
while(1) {
if (HideCaret(hwnd)) {
ShowCaret(hwnd);
return hwnd;
}
{
HWND hwndChild = GetWindow(hwnd,GW_CHILD);
if (hwndChild) {
HWND hwnd = wndSearchFocus(hwndChild);
if (hwnd) return hwnd;
}
}
hwnd = GetWindow(hwnd,GW_HWNDNEXT);
if (!hwnd) return NULL;
}
}
#endif
#ifdef __FLAT__
static HWND GetFocus32(void)
{
return GetForegroundWindow();
}
#endif
void TXAPI apPostStr(mchar *str)
{
// フォーカスを持っているウィンドウに文字列strを入力します。
// strをWM_CHARで送ります。
// WZ32では使えません
#ifdef __FLAT__
HWND hwnd = GetFocus32();
#else
HWND hwnd = GetFocus();
#endif
mchar *p = str;
#if 1//1.00E
sleep(0);
#endif
while(1) {
mchar c = *p++;
if (c == 0) break;
if (iskanji(c) && *p) {
//1.00C CPU負荷軽減に伴い修正
//漢字の1バイト目と2バイト目の間でsleepすると、駄目だった
PostMessage(hwnd,WM_CHAR,c,1);
PostMessage(hwnd,WM_CHAR,*p++,1);
sleep(0);
} else {
#if 1//1.00E 漢字を送ると文字バケすることがあった
PostMessage(hwnd,WM_CHAR,c,1);
sleep(0);
#else
while(!PostMessage(hwnd,WM_CHAR,c,1)) sleep(0);
#endif
}
}
sleep(0);
}
void TXAPI apPostSysKey(int vk)
{
// フォーカスを持っているウィンドウに仮想キーvkをAltが同時に押されたとして送ります。
//1.01A WZ32でも使えるようになりました
#if 1
PostVirtualKeyEvent(VK_MENU,0);
sleep(100);
PostVirtualKeyEvent(vk,0);
sleep(100);
PostVirtualKeyEvent(vk,1);
sleep(100);
PostVirtualKeyEvent(VK_MENU,1);
sleep(100);
#else
HWND hwnd = GetFocus();
while(!PostMessage(hwnd,WM_SYSKEYDOWN,vk,0x20000000|1)) sleep(500);
while(!PostMessage(hwnd,WM_SYSKEYUP,vk,0x80000000|0x20000000|1)) sleep(500);
#endif
}
void TXAPI apPostCtrlKey(int vk)
{
// フォーカスを持っているウィンドウに仮想キーvkをCtrlが同時に押されたとして送ります。
//1.00Fで追加
//1.01A WZ32でも使えるようになりました
#if 1
PostVirtualKeyEvent(VK_CONTROL,0);
sleep(100);
PostVirtualKeyEvent(vk,0);
sleep(100);
PostVirtualKeyEvent(vk,1);
sleep(100);
PostVirtualKeyEvent(VK_CONTROL,1);
sleep(100);
#else
HWND hwnd = GetFocus();
while(!PostMessage(hwnd,WM_SYSKEYDOWN,vk,0x20000000|1)) sleep(500);
while(!PostMessage(hwnd,WM_SYSKEYUP,vk,0x80000000|0x20000000|1)) sleep(500);
#endif
}
void TXAPI apPostKey(int vk)
{
// フォーカスを持っているウィンドウに仮想キーvkを送ります。
//1.01A WZ32でも使えるようになりました
#if 1
PostVirtualKeyEvent(vk,0);
sleep(100);
PostVirtualKeyEvent(vk,1);
sleep(100);
#else
HWND hwnd = GetFocus();
while(!PostMessage(hwnd,WM_KEYDOWN,vk,1)) sleep(0);
while(!PostMessage(hwnd,WM_KEYUP,vk,0x80000000|1)) sleep(0);
#endif
}