• 締切済み

SendMessage関数がうまく動作しません

 いろんなWindowsのアプリケーションの設定を、プログラムから自動実行するようにしたく、テストでWinodowsのメモ帳の設定を一部自動設定するソースコードを書いてみたのですが、どうもうまくいきません。 実行して、メッセージを表示することはできるのですが、メモ帳のページ設定ウィンドウのエディットコントロールに、目的のテキストが入力されません。 コントロールのIDも、何度も確認したので、間違ってはいないと思うのですが、なぜ、目的のテキストが入力されないのでしょうか。 SendMessage関数の参考ページは、いろいろと調べてみまして、目的のことをするのであれば、以下で問題なと思うのですが、なぜか、うまくいきません。 もし、お分かりの方がいらっしゃったら、お知恵を拝借いただけないでしょうか。 ■ 開発&実行環境 Windows XP XP3 32bit c++ ■ 動作  Winodowsのメモ帳のページ設定ウィンドウが開いているときに、フッター(F)のエディットコントロール のテキストを既定のものに置き換える。 ■ ソースコード /* 取りあえず、よく利用しそうなものをインクルード */ #include <windows.h> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <commctrl.h> #include <tchar.h> DWORD dwSleepTime = 3000; DWORD dwSleepTime1 = 1000; DWORD dwSleepTime2 = 5000; void SendKeysC( BYTE bVk // 仮想キーコード ) { // キーの押し下げをシミュレートする。 keybd_event( bVk, MapVirtualKey(bVk, 0), KEYEVENTF_EXTENDEDKEY | 0, 0 ); // キーの解放をシミュレートする。 keybd_event( bVk, MapVirtualKey(bVk, 0), KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0); } void SendKeysExC( BYTE bVk1, // 仮想キーコード BYTE bVk2 // 仮想キーコード ) { // キーの押し下げをシミュレートする。 keybd_event( bVk1, MapVirtualKey(bVk1, 0), KEYEVENTF_EXTENDEDKEY | 0, 0 ); // キーの押し下げをシミュレートする。 keybd_event( bVk2, MapVirtualKey(bVk2, 0), KEYEVENTF_EXTENDEDKEY | 0, 0 ); // キーの解放をシミュレートする。 keybd_event( bVk2, MapVirtualKey(bVk2, 0), KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0); // キーの解放をシミュレートする。 keybd_event( bVk1, MapVirtualKey(bVk1, 0), KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0); } int main(int argc, char *argv[]) { HWND hWnd1; HWND hWndTmp; char *sNum; LPCTSTR lpszText; lpszText = _T("サンプル"); sNum = "start"; MessageBox(NULL, "フォアグラウンドウィンドウを選択してある?", "OK", MB_OK); hWnd1 = GetForegroundWindow(); Sleep(dwSleepTime); SendKeysC(0X09); Sleep(dwSleepTime); //メモ帳のページ設定ウィンドウのフッター(F)のエディットコントロール hWndTmp = NULL; hWndTmp = GetDlgItem(hWnd1, 122); SendKeysExC(0X10, 0X09); Sleep(dwSleepTime); ::SendMessage(hWndTmp,WM_SETTEXT,0,(LPARAM)"test"); Sleep(dwSleepTime); return 0; }

みんなの回答

回答No.1

MessageBox の OK ボタンをクリックした時点で MessageBox を表示したアプリケーションがフォアグラウンドになるのでは? FindWindか何か別の方法でターゲットのウィンドウのウィンドウハンドルを取得した方がいいと思います。

kindr
質問者

お礼

ご回答ありがとうございます。 また、お礼に大変遅れてしまい申し訳ありません。 私もその可能性を考えて、ご指摘のような方法で ウィンドウタイトルを取得して、フォアグランドが どのウィンドウになっているか、確認したのですが 目的のウィンドウがフォアグラウンドになっておりました。 それに、エディットボックスでないコントロールのウィンド ウテキストは取得できたので、フォアグラウンドに関しては 問題ないかと思います。 私は、まだ、勉強不足なところもあるかと思いますので 継続して調べて行こうと思います。 貴重なお時間を使って、アドバイスいただき 誠にありがとうございました。

関連するQ&A