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;
}
補足
遅れてすみません。返答ありがとうございます。ソースを載せようかと思いましたがこの文字数じゃ載せきれないこともあって細かい内容を控えてました。 ピンの配置をしていないところに出力がありました。これが一番意味分かりませんでした。 回路はキャンセルだけ非同期で記述しています。 チャタリングはナシでやっていました。 チャタリングを入れたところ動作を確認することができました。 tadysさんの言うような形でデバックしたところ動作が把握できました。 ありがとうございます。