• ベストアンサー

CreateProcess API でセカンダリモニタに初期表示するには?

CreateProcess API でプログラムを実行する時に、引数STARTUPINFO構造体の中で、初期表示位置としてセカンダリモニタ上の座標を指定しても、プライマリモニタ上に表示されてしまいます。 どのようにすればセカンダリモニタに初期表示することができるのでしょうか?

  • mm44
  • お礼率68% (15/22)

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

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

こんなの見つけました。 http://www.catch22.net/tuts/undoc01.asp #私はマルチモニタ環境が無いんで試せませんが・・・

参考URL:
http://www.catch22.net/tuts/undoc01.asp
mm44
質問者

お礼

参考URLの方法でセカンダリモニタに表示できました! webも調べていたのですが、英語が苦手なので英語ページはパスしてました(^^; ありがとうございました! ------------- 参考URLの内容 CreateProcessAPIをコールする際にSTARTUPINFO構造体のメンバdwFlagsに0x400(STARTF_MONITOR)を指定し、hStdOutputメンバに表示したいモニタのハンドルを代入しておくとそのモニタに表示できるというものです。 STARTF_MONITORを指定した場合、STARTF_USESTDHANDLESは無視されます。 ------------- 私がテストしたところ、STARTF_USEPOSITIONフラグと併用して任意のモニタの任意の場所に表示することができました。この際、指定する座標はモニタ内の相対座標ではなく、すべてのモニタを含めた絶対座標でした。 なので、今回のプログラムは、CreateProcessの直前にMonitorFromPointで表示予定位置からモニタハンドルを取得し(モニタの存在確認も兼ねる)、その座標をSTARTUPINFO構造体に引き渡す形で実装することにしました。

その他の回答 (1)

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

プライマリのモニタなら指定した座標にちゃんと表示できるEXEを起動してますか? これができないEXEならウィンドウ表示後に動かすしかありません。

mm44
質問者

補足

プライマリモニタ内なら指定した座標に表示されています。 プライマリモニタの右隣にセカンダリモニタを配置しているのですが、セカンダリモニタ内の座標を指定しても、プライマリモニタ内の右端に表示されてしまいます。

関連するQ&A

  • PowerPointのスライドをセカンダリモニタに表示

    こんにちは。PowerPoint2003を使用しております。スライドショーをセカンダリモニターで実行することは可能でしょうか?可能な場合その設定などご存知の方が居ればお教え願いたく。 NotePCを使用しており、プロジェクタ等をセカンダリモニタとして接続して、PowerPointでスライドショーを実施することが多いです。 手元のNotePCでPowerPointのメイン画面を表示しながら、スライドショーをセカンダリモニタ(この場合プロジェクタ)に表示したいのですが、スライドショーを実行するとプライマリ(即ちNotePCの液晶)に表示されます。 モニタをプライマリ・セカンダリを入れ替える以外で、実現方法があれば、お教えいただくと助かります。

  • CreateProcess

    さっそくですが… <MS-DOS上で動作するEXE> test.exeを実行する    ↓ データ(文字列)を入力し,Enterを押すと 実行結果が表示されます。 ------------------------------------------- このようなtest.exeがある時, 1)test.txtにデータ(文字列)を入れておきます。 2)実行後,結果を入れるr.txtを作っておきます。 そこで,DOS上で↓このように動かしました。 C:\ ~ \ ~ >test.exe <test.txt >r.txt 以上のことを(環境:BorlandC++Builder6,Windows2000) API関数のCreateProcessを使って動かすことは 可能なのでしょうか??というのは, 現在,CreateProcessでtest.exeを 呼び出すことはできたのですが, どうしても" <test.txt >r.txt "という部分を 入れると引数が渡らないのです。 CreateProcessのpszApplicationNameやpszCommandLine 引数あたりでいろいろ試したのですが,できません。 もし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); このようなプログラムを書いてみたのですがうまくいきません。(プログラムは抜粋です) 何かいい方法ご存知の方教えていただけないでしょうか? よろしくお願いします。

  • 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););//タスクトレイから出す。 }

  • デュアルモニター化したが、セカンダリに映像が写らない

    グラフィックボードをGeForce9600gtに替えたところ、 DVI-D端子が2つあったので、空いているモニタを使って デュアルモニタ化を試みましたが、 セカンダリに指定したモニタに映像が写りません。 画面の設定はできており、 マウスでセカンダリ側に移動もできているようです。 (メインモニタの外に移動していると認識できたため) セカンダリに指定したモニタの電源を入れても、 「信号なし」と表示されるだけです。 最悪、現状でのデュアルモニターは不可能でも構いませんが、 何が原因でセカンダリのモニタに映像が写らないのかが知りたいです。 どなたかご教示願います。

  • GoogleMapのAPIで初期の地図の表示

    GoogleMapのAPIで初期の地図の表示をしたいです。 初期の位置をDBから取ってきてその情報を元に表示したいです。 いろいろやってみましたがうまくいきません。 PHP4.4とDBはDB2です。 教えてください。 よろしくお願いします。

  • セカンダリモニタをプライマリモニタにしたら...

    OSはウィンドウズ2000です。 モニタは一つですが、モニタドライバはオンボードグラフィックチップ用と外付けPCIグラフィックボード用の2つがあります。 モニタは1個の状態で外付けグラフィックボード用ドライバをプライマリモニタに指定しました。 動作を確認したのでオンボードドライバに戻したいのですが、画面のプロパティが表示されません。 このような状態で画面のプロパティを外付けグラフィック用ドライバで表示されているモニタ側に 表示させる方法はありますか? スタートメニューやタスクバーが無いのでパソコンを終了させる方法もわからず困っています。

  • 画面プロパティの表示位置変更について

    マルチモニターを使用しています。 Excelやインターネット画面等は、プライマリーモニター、セカンダリーモニターに関らず移動した位置に変更できますが、画面プロパティ等コンパネの各項目やエラー表示は、プライマリーモニターに移動しても再表示するとセカンダリーモニターに戻ってしまいます。 設定方法があればどなたか教えて下さい。 よろしくお願い致します。

  • デュアルディスプレイ・最大化時にどちらのモニタに表示するか

    環境 vista32bit クローンじゃない表示方法(名前がわかりません) デュアルディスプレイ初心者です。 メーラーなりブラウザなり起動したとき、 どちらのモニタに最大化表示するかってことは どうやって決めるのでしょうか? セカンダリモニタにメーラー、 プライマリモニタにブラウザ ってことをしたいのですが、 ブラウザ(firefox)をちょっと邪魔なので セカンダリモニタに移動し、最大化したら、 今後一切まずセカンダリモニタで表示されるようになりました。 なので一端「元に戻す」をしてドラッグして プライマリモニタに移動し、そこで最大化しなければなりません。 他のソフトも同様です。 オプション設定などで別のダイアログが開いたときも、 元のソフトはプライマリモニタで表示しているのに、 そのダイアログはセカンダリモニタの一番遠いところに表示されたりして 微妙に困っています。 ソフトを起動したとき、いきなり希望のモニタに最大化表示させるためにはどのようにしたらいいのでしょうか? 検索してもデュアルディスプレイのやり方以上の情報にたどり着けませんでした。 どなたか教えて下さい。

  • セカンダリモニタが横うつりになってしまった。

    HPのDX2000というデスクトップを使っています。 これは、モニタを2つ接続できるものですが、なぜか、横矢印キーを押した際、セカンダリモニタの縦横が入れ替わって、横向きに表示されるようになってしまいました。つまり、本来右側にくるべきものが、上側に来て、顔を90度回して見ないといけなくなってしまいました。 プライマリの方は大丈夫です。 すべてをシャットダウンして、再起動しましたが、直りません。 コントロールパネルの画面の中でそれらしい設定を探したのですが、見当たりません。 直す方法を知っている方、是非、教えてください。