- 締切済み
Windowsフォームアプリケーションを表示するには?
Visual C++のコンソールアプリケーションで数字をキーボードから入力するプログラムを作成しました。このプログラムは実行するとコマンドプロンプトが開かれてキーボード値の入力待ち状態になるのですが、ここでコマンドプロンプトではなく、このプログラムとは別に作成したWindowsフォームアプリケーションが開かれキーボード値の入力待ち状態になるというプログラムを作成したいのですが、こういったことは可能でしょうか?また可能ならばどのようなやり方があるか教えていただきたいです。宜しくお願いします。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- machongola
- ベストアンサー率60% (434/720)
こんばんは。回答が着かない様ですので。 (1)CLRのコンソールだと、恐ろしく簡単見たいです(事例はC#など見たいですが、参考に成ります)。 http://dobon.net/vb/dotnet/process/openfile.html http://msdn.microsoft.com/ja-jp/magazine/cc163417.aspx int main(array<System::String ^> ^args) { Diagnostics::Process^ process = Diagnostics::Process::Start("QandA.exe"); process->WaitForExit(); return 0; } (2)一応Win32の方でお話しすると、コンソールアプリからウィンドウを開きたい場合は非常に簡単で、其のままウィンドウやモーダルダイアログを開けば良いだけだです。 LRESULT CALLBACK WinProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { //決まり文句 } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { //決まり文句 } //WinMainに転送すればコンソールと一緒にウィンドウが開ける int main(void) { return ::WinMain(::GetModuleHandle(NULL), 0, 0, SW_SHOW); } (3)コンソールアプリから他のフォームアプリを開くならば、CreateProcess()APIとスレッドを回転させて待機すれば、先ずは達成出来ます。 #include<windows.h> #include<stdio.h> #include<process.h> //ウィンドウハンドル検索用 struct PAIR { HWND wndProcess; DWORD processID; }; //スレッド間データ struct DATA { union { unsigned long ulThread;//スレッドハンドル HANDLE hThread; }; HWND wndProcess;//開いたプロセスのウィンドウハンドル PROCESS_INFORMATION pi; }; //スレッド関数 void __cdecl Thread(void* p) { DATA* pdata = (DATA*)p; //開いたプロセスのウィンドウが閉じるまで while(::IsWindow(pdata->wndProcess)) { //ココで何かする } ::printf("%s\n", "exit thread loop"); ::_endthread(); } //ウィンドウを列挙するコールバック BOOL CALLBACK EnumWindowsProc(HWND wndFound, LPARAM lParam) { DWORD processID = 0; PAIR* p = (PAIR*)lParam; //ウィンドウからプロセスIDを取る ::GetWindowThreadProcessId(wndFound, &processID); //開いたプロセスIDと照合する if(processID != p->processID) return TRUE; //プロセスIDが一致したのでウィンドウハンドルを捕獲する p->wndProcess = wndFound; return FALSE; } //プロセスIDからウィンドウハンドルを探す HWND FindWindowFromProcessID(DWORD processID) { PAIR pair = {NULL, processID}; ::EnumWindows(&::EnumWindowsProc, (LPARAM)&pair); return pair.wndProcess; } //メイン int main() { STARTUPINFO si = {sizeof(si)}; DATA data = {0}; //プロセスを開く if(!::CreateProcess(NULL, "QandA.exe", NULL, NULL, FALSE, 0, NULL, NULL, &si, &data.pi)) return 0; //0.5秒待つ ::Sleep(500); //プロセスIDからウィンドウハンドルを探す data.wndProcess = ::FindWindowFromProcessID(data.pi.dwProcessId); //見つかった if(data.wndProcess) { //スレッド開始 data.ulThread = ::_beginthread(&::Thread, 0, &data); //開いたプロセスが終了するまで待つ ::printf("%s\n", "wait for single object"); ::WaitForSingleObject(data.hThread, INFINITE); } else { ::printf("%s\n", "window handle not found"); } //開いたプロセスの後始末 ::CloseHandle(data.pi.hProcess); ::CloseHandle(data.pi.hThread); ::printf("%s\n", "exit app"); return 0; }