CreateProcessでのウィンドウサイズの指定方法

このQ&Aのポイント
  • CreateProcessを使用してプログラムを実行する際に、表示されるウィンドウのサイズを指定する方法について教えてください。
  • 具体的なウィンドウのサイズを指定したい場合、CreateProcessの引数でサイズを指定することができます。
  • しかし、質問者のプログラムではうまくいかないようです。他の方法を知っている方は教えていただきたいです。
回答を見る
  • ベストアンサー

CreateProcessでのウィンドウサイズの指定方法

CreateProcessでプログラムを実行するようなプログラムを作成した際に表示されるウィンドウサイズを最大化したり最小化したりするのではなく、ある大きさにしたいのですが、うまくいかないのでご存知の方教えてください。 BOOL testProgram; STARTUPINFO si; PROCESS_INFORMATION pi; memset(&si,0,sizeof(STARTUPINFO)); si.cb = sizeof(STARTUPINFO); si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_SHOWDEFAULT; si.dwXSize = 500;  si.dwYSize = 400; // 例えばこんな風にサイズを指定したいのです testProgram = CreateProcess( NULL, "**.exe", // ここには具体的なものが入ります。 NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi ); if(testProgram!=TRUE)return FALSE; WaitForSingleObject(pi.hProcess,INFINITE); CloseHandle(pi.hProcess); このようなプログラムを書いてみたのですがうまくいきません。(プログラムは抜粋です) 何かいい方法ご存知の方教えていただけないでしょうか? よろしくお願いします。

noname#6694
noname#6694

質問者が選んだベストアンサー

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

とりあえず、si.dwFlagsにSTARTF_USESIZEが足りない。 あと、呼び出したアプリがCreateWindowExでウィンドウを作成する際にCW_USEDEFAULTが指定されているウィンドウのみです。 STARTF_USESIZEを追加してもだめでしたら、WaitForSingleObjectを呼ぶ前に、起動したアプリが持つウィンドウをFindWindowかなんかで探してウィンドウハンドルを取得し、それに対してMoveWindowとかSetWindowPosをするしかないでしょう。

noname#6694
質問者

お礼

MoveWindowやSetWindowPosを使った方法で考えてみようと思います。 ありがとうございました。

noname#6694
質問者

補足

早速アドバイスありがとうございます。 si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESIZE; ではやはりうまくいきませんでした。 呼び出したアプリのほうで起動してからサイズと位置を調整しているのかなと思ったりもします。 FindWindowでウィンドウハンドルを取得してSetWindowPosをする方法も考えてみます。

関連するQ&A

  • CreateProcess関数について

    ■CreateProcess関数で実行フアイル(.exe)を呼ぶプログラムを作成しています。 ■CreateProcess関数はプロセスを作成すると直に呼出側に戻って来るが、起動したプログラムの実行結果ではない。 ■その様な事を踏まえてプログラム下記にコーテイングしました(概要) ■「呼び出し側」も「呼び出される」もCD-ROM内に有ります。 ■問題はCreateProcess関数で呼んでから、実際に画像が表示されるまでに、時間が掛かる事です。、 ■「質 問」「やりたい事」 CreateProcess関数で呼んでから、実行画面が表示される時間の間に 「その旨のなんだかのメッセージを表示したい」 例えば、Webでのダウンロードやインストールの時の様な... この様な事を、実現するのはどの様にしますか、宜しくお願いします。 STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory(&si,sizeof(si)); si.cb=sizeof(si); ZeroMemory(&pi,sizeof(pi)); if(CreateProcess(NULL,(LPTSTR)cmdline,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi)){ CloseHandle(pi.hThread); //CD-ROMから直ぐ表示出来ない場合に備えて //この間で表示に時間を要している事をメッセージ出来ないか? ShowWindow(hWnd,SW_MINIMIZE);//タスクトレイに入れる。 WaitForSingleObject(pi.hProcess,INFINITE); CloseHandle(pi.hProcess); ShowWindow(hWnd,SW_RESTORE););//タスクトレイから出す。 }

  • CreateProcessの制御について

    今回exeから別exe(or bat)を起動させる処理を作成しようとしているのですが、 呼び出した後(今回であればnotepad.exe)5秒程度砂時計マークがでる状態になるのです。(バッチでも同じ) なにか原因があるのでしょうか。また、対処方があれば教えてください。 【前提】 ・本体exeにウィンドウは必要なし ・バッチの場合はcmd.exeは非表示 【環境】 ・XP SP2 でコンパイル。 bcc32 5.5.1 と VB6 ・実行はXP SP2 とWin2000 双方で同様の結果 【ソース】 #include<windows.h> int WINAPI WinMain(HINSTANCE hInstance ,HINSTANCE hPrevInstance , PSTR lpCmdLine ,int nCmdShow ) { PROCESS_INFORMATION pi; STARTUPINFO si; ZeroMemory(&si,sizeof(si)); si.cb=sizeof(si); CreateProcess(NULL,"notepad.exe",NULL,NULL,FALSE,CREATE_NO_WINDOW|NORMAL_PRIORITY_CLASS, NULL,NULL,&si,&pi); CloseHandle(pi.hThread); WaitForSingleObject(pi.hProcess,INFINITE); CloseHandle(pi.hProcess); return 0; }

  • CreateProcessでアプリが終了しない

    ちょっとした変換ツールを作ろうと思い、ダイアログベースの MFCアプリケーションを作成しました。 OKボタンが押された時にCreateProcess()で子プロセスを 起動して、終了したら結果表示して親プロセスも終了する 様にしようと思ったのですが、結果表示までは正常に 実行されるのですが、親プロセスが終了しません。 恐らくCreateProcess()に渡す引数が悪いのだと思うのですが、 どなたかわかる方がいらしたらご教示願います。 void CMscGenSelectorDlg::OnBnClickedOk() {   STARTUPINFO si;   PROCESS_INFORMATION pi;   ZeroMemory( &si, sizeof si );   si.cb = sizeof si;   ZeroMemory( &pi, sizeof pi );   // 子プロセス起動   CreateProcess(     NULL,                // モジュール名     _T("mscgen.exe -Tpng hoge.msc"),  // コマンドライン     NULL,                // セキュリティ記述子     NULL,                // セキュリティ記述子     FALSE,               // ハンドルの継承オプション     0,                 // 作成のフラグ     NULL,                // 新しい環境ブロック     NULL,                // カレントディレクトリ名     &si,                // スタートアップ情報     &pi);                // プロセス情報   // 子プロセス終了待ち   WaitForSingleObject( pi.hProcess, INFINITE );   CloseHandle( pi.hProcess );   CloseHandle( pi.hThread );   // シーケンスチャート表示   ShellExecute( NULL, _T("open"), _T("hoge.png"), NULL, NULL, SW_SHOW );   // 終了   OnOK(); }

  • アプリケーション起動について

    ひろと申します。 クライアントからサーバの共有フォルダにある、他のアプリケーションを オプション付きで起動させるプログラムをVC++で作成したのですが、 クライアントがNTだとうまくいきません。 たとえば、サーバ上にあるapp.exeを「app.exe /i」のような感じで 起動すると、クライアントがwin98の場合はアプリケーションが 表示されるのですが、NTから起動させようとすると、 アプリケーションは表示されません。 また、オプションを外すとアプリケーションは NTでも表示されます。 APIは、WinExec,ShellExecuteEx,CreateProcessで試したのですが 同じ結果でした。 CreateProcess は以下のように設定してます。 ------------------------------------------------------------------ STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory(&si, sizeof(STARTUPINFO)); ZeroMemory(&pi, sizeof(PROCESS_INFORMATION)); si.cb = sizeof(STARTUPINFO); si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_SHOWNORMAL; CreateProcess(NULL, "serverpath\\app.exe /i", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); プロセスの起動は成功していうようです。 クライアントがNTの場合、他に必要な設定があるのでしょうか? よろしくお願いします。

  • CreateProcessでの実行ファイルの操作について

    VC++ 6.0 Win98 カレントディレクトリに実行ファイルをいれておいて、szCommand[]="eee"とすると(eeeは実行ファイルです。)実行してくれるのですが、相対パスや絶対パスを使うと実行をしてくれません。 CreateProcessでは、相対パスや絶対パスは使えないのでしょうか? ちなみにコマンドラインから直接(相対パスや絶対パスを使用して)に打つと実行ファイルが動作します。 あと、リダイレクトも使えないのでしょうか?(動作しなかったので・・) STARTUPINFO si; ZeroMemory(&si,sizeof(STARTUPINFO)); si.cb=sizeof(STARTUPINFO); si.dwFlags=STARTF_USESTDHANDLES; si.hStdOutput=hFile; si.hStdError=hFile; char szCommand[]= "C:\\\"My Documents\"\\nannka\\VC++\\Ten3\\eee"; PROCESS_INFORMATION pi; CreateProcess( NULL, szCommand,//コマンド //NULL, NULL,NULL, TRUE, 0, NULL,NULL, &si,&pi ); よろしくお願いします。

  • VC++6.0からIEの起動ができない

    つぎのようなCodeを書きましたが、コメント行のようなnotepad.exeを指定すると起動できるのですがブラウザIE(iexplore.exe)を指定すると起動しません。  省略 STARTUPINFO si; PROCESS_INFORMATION pi; char buf[256]; LPTSTR lpCommandLine; strcpy(lpCommandLine,"iexplore.exe d:\\data\\update.html");  //strcpy(lpCommandLine,"notepad.exe d:\\data\\update.html");  //  strcpy(buf,lpCommandLine); ZeroMemory( &si, sizeof( STARTUPINFO )); si.cb = sizeof( STARTUPINFO ); si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_SHOWNORMAL; BOOL t=CreateProcess( NULL, lpCommandLine, // コマンドライン文字列 NULL,NULL,FALSE, 0, NULL, NULL, &si, &pi)) // //起動したプロセスの終了を待たない場合 CloseHandle(pi.hThread); CloseHandle(pi.hProcess); :  省略 なを、「スタート」メニューの「ファイル名を指定して実行」に「iexplore.exe d:\data\update.html」を指定すれば起動します。 以上です。よろしくお願いします。

  • CreateProcessでEXEを起動させると残像が残る

    お世話になります。 VC++ 6.0 MFC で開発しております。 A.exeから、B.exeを起動しています。 A.exeの(画面上の)上にB.exeが表示されるのですが、 そのB.exeを動かすと白い残像みたいな跡がでます。 そのB.exeの残像みたいなのを出さないようにしたいのですがどのようにすればよいでしょうか ※B.exeを起動している間は、A.exeを操作できないようにしたいのです。 ***********実際のソースです。******** PROCESS_INFORMATION pi; STARTUPINFO si; ZeroMemory(&si,sizeof(si)); si.cb=sizeof(si);   int kekka = CreateProcess(Pass,CommandChar,NULL,NULL,TRUE,NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&pi); if(kekka==0) { CString str; str.Format("起動することはできません。); AfxMessageBox(str, MB_OK, 0); } else { WaitForSingleObject(pi.hProcess,INFINITE); } PeekMessage()とかを使えばいいとか聞いたのですが、まったくわからない状態です。 大変お手数ですが具体的に教えていただければ大変ありがたいです。 なにとぞよろしくお願いします。

  • 外部アプリケーションの呼び出し方

    現在VC++で環境ウィンドウズ2000でプログラミングを行っています。 メニュー画面上のボタンをクリックすると外部のアプリケーションを呼び出し作業したいと思っています。関数CreateProcessを使うとできるということまではわかったのですが、どうもうまくいきません。 下記のプログラムはメモ帳を呼び出すものでこれはうまくできました。 STARTUPINFO sin; PROCESS_INFORMATION pin; ZeroMemory( &sin, sizeof( STARTUPINFO ) ); ZeroMemory( &pin, sizeof( PROCESS_INFORMATION ) ); sin.cb = sizeof( STARTUPINFO ); sin.dwFlags = STARTF_USESHOWWINDOW; sin.wShowWindow = SW_SHOWNORMAL; if ( !CreateProcess( NULL, _T("notepad.exe C:\\foo.txt), NULL, NULL, FALSE, 0, NULL, NULL, &sin, &pin ) ) { // 起動失敗 } } 実際はデスクトップに置いてあるアプリケーションを呼び出したいと思っています。自分ではアプリケーション名の書き方等が間違っているのではないかと思っていろいろ試したのですが、どうもうまくいきません。 初心者で説明も不十分な点もあると思いますがどうかよろしくお願い致します。

  • 【C++】セマフォとプロセスの使い方

    【C++】セマフォとプロセスの使い方 WindowsXPでVC++2008コンパイラを使用して、 プロセスとセマフォについて勉強しています。 外部プログラム(今回は電卓として)を5つ立ち上げるのですが、 同時に立ち上げるのは2つまでとしたい場合、どのように組むのでしょうか。 http://nienie.com/~masapico/api_CreateSemaphore.html こちらにスレッドを使用したセマフォを使ったサンプルがあるのでが、 プロセスを使うとなると、うまく書けません。 ご指導頂けませんでしょうか。 ===現在まで書いたソース=== (5つのプロセスをつくるループも実装していませんが、、、) #include<windows.h> #include<stdio.h> #include<tchar.h> HANDLE g_hSemaphre; void main(){ BOOL bRet; STARTUPINFO si; PROCESS_INFORMATION pi; //Semaphoreオブジェクト g_hSemaphre = CreateSemaphore(NULL,2,2,NULL); bRet = CreateProcess(_T("C:\\WINDOWS\\system32\\calc.exe"), _T(""), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); //プロセス終了 WaitForSingleObject(pi.hProcess,INFINITE); //後処理(プロセス開放) ReleaseSemaphore(g_hSemaphre,1,NULL); //スレッドとプロセスを閉じる。 CloseHandle(pi.hThread); CloseHandle(pi.hProcess); //Semaphoreオブジェクト CloseHandle(g_hSemaphre); }

  • CreateProcessでうまくexeファイルの起動ができません。

    Win32APIでファイルを読み込むプログラムとCreateProcessによる別に作った、OpenCVの2値化動画像の特徴点抽出をして得られた特徴点の座標を保存するプログラムを起動させるプログラムなのですが、起動はできても特徴点の座標取得ができません。外部起動せずにOpenCVのプログラムを動かすと座標がテキストファイルに保存されます。原因が分からないので、分かる方どなたかご教授願います。 環境はWindowsXP Visual C++ 2008 Express Editionです。 以下がWindowsプログラミングのソースの一部です。 LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { STARTUPINFO si; PROCESS_INFORMATION pi; DWORD dwExCode; FILE *fp; errno_t err; TCHAR buf[10]; TCHAR *temp; TCHAR cmdstr[] = _T("C:\\Documents and Settings\\m22015\\My Documents\\Visual Studio 2008\\Projects\\capflow\\Debug\\capflow.exe"); switch(msg){ case WM_CREATE: ZeroMemory(&si, sizeof(si)); ZeroMemory(&pi, sizeof(pi)); si.cb = sizeof(si); if(!CreateProcess(NULL, cmdstr, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS,NULL, NULL, &si, &pi)){ MessageBox(hWnd, TEXT("Can't open capflow.exe"), TEXT("Error"), MB_OK); } while(1){ Sleep(100); GetExitCodeProcess(pi.hProcess, &dwExCode); if(dwExCode == STILL_ACTIVE){ continue; }else{ MessageBox(hWnd, TEXT("Finish"), TEXT("Complete"), MB_OK); break; } } CloseHandle(pi.hProcess); WaitForSingleObject(pi.hProcess, INFINITE); CloseHandle(pi.hThread); break; case WM_KEYUP: switch(LOWORD(wParam)){ case VK_RETURN: err = _tfopen_s(&fp, TEXT("C:\\Documents and Settings\\m22015\\My Documents\\Visual Studio 2008\\Projects\\capflow\\Debug\\Corner.txt"), TEXT("r+")); if(err != 0) break; temp = (TCHAR*)malloc(_tcsclen(buf)+1); if(temp == NULL){ MessageBox(hWnd, TEXT("Can't secure of memory"), TEXT("Error"), MB_OK); break; } while(_fgetts(buf, 10, fp) != NULL){ _tcstok(buf, TEXT("\n")); _tcscpy(temp, buf); MessageBox(hWnd, temp, TEXT("Indication"), MB_OK); } free(temp); fclose(fp); break; } break; case WM_CLOSE: DestroyWindow(hWnd); break; case WM_DESTROY: PostQuitMessage(0); break; default: return (DefWindowProc(hWnd, msg, wParam, lParam)); } return 0; }

専門家に質問してみよう