• 締切済み

タスクバーやタスクマネージャーのタスク欄に表示されない

ボタンのクリックやLANでデータを受信すると、次の画面へ遷移する(又は最初の画面へ戻る)プログラムを作成しているのですが、最初のダイアログを ShowWindow(SW_HIDE) している為、タスクバーやタスクマネージャーのタスク欄に表示されず、他のウインドウがアクティブになると、ALT+Tabキーでしかそのウインドウを前に出せません。 VC++を始めて5ヶ月で得た知識や自分力量を考えて、以下のように作成したのですが、何か良い方法はないでしょうか? (1)最初のダイアログの OnInitDialog() で画面を制御するスレッド(以降、画面制御)とLANデータを受信するスレッドを生成 (2)画面制御は、最初の画面をモーダレスで表示(Create) (3)最初のダイアログを ShowWindow(SW_HIDE) で不可視にする。 (4)最初の画面は、あるボタンがクリックされると画面制御にPostMessage()で通知し、画面を閉じる。 (5)画面制御は、2番目の画面を同様にモーダレスで表示(Create) ※LANデータを受信した場合は、画面制御へメッセージキューでデータを渡し、必要に応じてその時表示している画面へ別のメッセージキューでデータを渡しています。 ※あとは、ボタンクリックやLANデータの受信で次の画面へ遷移したり、最初の画面へ戻る。(表示される画面は常に1つ) Windows XP Pro SP3 Visual C++ 6.0 SP6 他の人の回答に、親ウインドウを不可視にすると、タスクバーに表示されないというような事が書いてありましたが、何か良い方法はないものでしょうか? どなたか助言をお願いします。

みんなの回答

  • Yanch
  • ベストアンサー率50% (114/225)
回答No.2

>メインウインドウを、SW_MINIMIZEにするという助言を試してみました。 >タスクバーには当然ながら表示されますが、それをクリックすると、メインウインドウも当然のように表示されてしまいます。(メインウインドウは表示したくないのです) メインウィンドウの表示周りのイベントを何か工夫して処理してあげれば、 メインウィンドウ自体は表示せずに タスクバー上は表示できると思いますが、 画面制御をしているダイアログをモーダレスにしている理由の方が気になってきました。 もし、ダイアログを最上面に表示したいだけの理由でしたら、 モーダレスダイアログをやめて、最上面表示のスタイルを設定した ウィンドウにする方が簡単かもしれません。

taka077
質問者

お礼

回答、ありがとうございます。 画面制御をしているのは、ユーザインターフェーススレッド用ウインドウで、CreateEXにより親ウインドウと完全に切り離したオーバーラップウインドウです。(この部分は他人が作成した物をそのまま使用しているので、詳しくは説明出来ません。) モーダレスにしたのは8個の画面で、ボタンが操作されたりLANデータを受信した時、PostMessage()やメッセージキューで画面を遷移させるので、モーダレスの方が都合が良いと判断しました。 >メインウィンドウの表示周りのイベントを何か工夫して処理してあげれば、 とは、タスクバーのアイコン?がクリックされた時、メインウインドウは何もせず、その時表示されている画面が最上位にくるようにするという事でしょうか?

  • Yanch
  • ベストアンサー率50% (114/225)
回答No.1

メインウィンドウを、SW_HIDE せずに、SW_MINIMIZE に してみては如何でしょう。

taka077
質問者

お礼

回答、ありがとうございます。何故か、回答メールが届いてなく、気付きませんでした。 メインウインドウを、SW_MINIMIZEにするという助言を試してみました。 タスクバーには当然ながら表示されますが、それをクリックすると、メインウインドウも当然のように表示されてしまいます。(メインウインドウは表示したくないのです) 表示は、画面制御により制御されているモーダレスの画面だけでして...。 おまけに、Alt+Tabキーを押した時のリストには、モーダレスの画面とメインウインドウの2つが別々に表示されてしまいます。

関連するQ&A

  • ダイアログの非表示が遅い

    ダイアログの非表示が遅い Windows CE上で動作するソフトを作成中で、約2cm×2cmほどのボタンだけのダイアログが1つ(メインのダイアログ)、約2cm×1cmほどのボタンだけのダイアログが3つあります。(ダイアログの大きさは、それぞれのボタンと同じサイズで、メイン以外はモーダレスです。) その中の1つを押すと、別の全画面サイズのダイアログを表示し、そのダイアログ上のボタンを押すと、元のボタンだけになるようにしています。 全て、メインのダイアログのOnInitDiarog()で生成しておき、ShowWindow(SW_SHOW)で表示し、ShowWindow(SW_HIDE)で非表示にしているのですが、全画面サイズのダイアログを非表示にする際、表示が消える前に、ボタンのダイアログが表示されてしまい、見た目がかなり悪いのです。 Windows CEは遅いと聞いた事はあるのですが、どうにか対処する方法はないのでしょうか? どなたか助言をお願い致します。 環境は以下の通りです。 ・Windows CE 5.0 ・Visual C++ 2005 ・MFCスマートデバイス 以上、よろしくお願いします。

  • タスクトレイのアイコンが消えてしまう。

    こんにちは。 今、タスクトレイに常駐するプログラムを作成しています。 プログラム起動するとすぐ、メインウインドウとタスクトレイにアイコンが 表示されます。 メインウインドウ右上の最小化ボタンまたは、終了ボタンを押すと メインウインドウが消えてタスクトレイのアイコンだけが残るように したいと考えています。 最小化ボタンの場合はWM_SIZEをキャッチして、ShowWindow(hwnd, SW_HIDE) で、メインウインドウだけ消え、タスクトレイのアイコンは残ります。 しかし、終了ボタンの場合は、WM_DESTROY をキャッチし、同じくShowWindow(hwnd, SW_HIDE) でメインウインドウを消しているのですが、メインウインドウだけでなく、 アイコンも消えてしまいます。アイコンを消さずに残すようにしたいのですが、 どうしたらよいでしょうか。WM_DESTROYでは、PostQuitMessage(0)はポストして おらず、最後にreturn 0;を返しています。 どうぞよろしくお願いします。 環境 BCC、WindowsXP、C言語、Win32 API

  • フォームの再表示について

    VC++初心者です。 ダイアログベースのアプリケーションをつくったんですが、その後ボタンクリックでモーダルダイアログを2つ順番に表示したいと思っています。 void CMFC_testDlg::OnBnClickedButton1() {   CmyDialog myDL;   ret1 = myDL.DoModal(); } で一つ目を表示 void CmyDialog::OnBnClickedOk() {   this->ShowWindow(SW_HIDE);   CmyDialog02 myDL02;   myDL02.DoModal(); } で一つ目を隠して、2つ目を表示 さらに2つ目のダイアログのボタンを押した時、2つ目を閉じて1つ目を再表示したいと思います。 void CmyDialog02::OnBnClickedOk() {   EndDialog(-1);   CmyDialog::ShowWindow(SW_SHOW); } と書いた所エラーになります。 どこがまずいんでしょうか。 エラーメッセージ:静的でないメンバ関数の呼び出しが正しくありません VBになれてしまっているため、C++の文法でどう書いていいのかわかりません。 どなたかお教えください。

  • タスクバーに2つ表示される。

    Windows C#で開発しております。 作ったアプリは、 最初にAというフォームを開き、A⇔B⇔C という画面遷移をします。 最初にAを表示したときは、タスクバーに1つ表示されますが、 Cを開いてBに戻ったら、タスクバーに2つ表示されてしまいます。 (添付参照) タスクバーには常に1つ表示されるようにしたいのですが、 どうすればよいでしょうか? つたない説明で恐縮ですが、どなたかご教授お願い致します。

  • ウィンドウ非表示のちらつきを無くすには

    <環境> WIN98 VC++6.0 MFC SDIにて 起動時に下記にてウィンドウを非表示にしていますが、最初に一瞬表示されてから、消えます。 何事も無かったかのように、こっそりと非表示にするにはどうすればよいですか? BOOL CAbcApp::InitInstance() { 省略 //m_pMainWnd->ShowWindow(SW_SHOW); m_pMainWnd->ShowWindow(SW_HIDE); m_pMainWnd->UpdateWindow(); return TRUE; }

  • タスクマネージャに表示するダイアログの変更

    開発環境: Visual Studio 2008 Pro 現在メインウィンドウのOnInitDialog()内から複数のダイアログを順次モーダル表示させ、 OnInitDialog()を抜ける時には自身のウィンドウに対してWM_CLOSEを送ることでアプリを 終了させるプログラムを作成しております。 ですがこのやり方だと、モーダル画面等で処理中にはタスクマネージャーにアプリケーションが 表示されません。 特定のダイアログに対してウィンドウスタイルを変更すれば解決できるかと思い、 (1)メインウィンドウのOnInitDialog()開始直後に自身のウィンドウスタイルからWS_EX_APPWINDOWを削除。 (2)代わりにメインウィンドウとして認識させたいダイアログに対してWS_EX_APPWINDOWを設定。 上記の処理を試してみましたが、タスクマネージャーに表示させることができませんでした。 必要な処理などに誤りがあるのでしょうか? もしご存知の方がいらっしゃいましたらどうかご教示いただけます様お願い致します。

  • ダイアログの表示、非表示の切り替えについて

    環境 WIN98 VC++6.0 MFC SDIにて 1.ポップアップメニューの”ダイアログ作成”をクリックすると、 void CMainFrame::OnKNew() { CInput dlg; int iID = dlg.DoModal(); } として、ダイアログを作成します。 2.次に、ダイアログのボタン押し下げにてダイアログを非表示にします。 void CInput::OnButton1() { ShowWindow(SW_HIDE); } このようなコードにおいて、非表示状態での”ダイアログ作成”クリックでは非表示から表示に切り替えることを実現するにはどのようにすれば良いのでしょうか? よろしくお願いいたします。

  • ダイアログの再表示について

    宜しくお願いします。 <環境> WIN98 VC++6.0 MFC  ダイアログのボタン押し下げでウィンドウを生成し、 生成後はダイアログを非表示にしています。 void CInput::OnButton1()//ウィンドウの生成 { UpdateData (TRUE); pWnd = new CMyWnd( this); pWnd->m_left=100; pWnd->m_top=100; m_pAryDlg.Add ( pWnd ); //m_pAryDlg2.Add ( &m_InputData ); pWnd->m_moji=m_InputData; pWnd->Kado_Create(this); ShowWindow(SW_HIDE); //ダイアログの非表示 } ウィンドウをダブルクリックすると、ダイアログが非表示から 表示になるように以下のコードを書きましたが、表示されません。 どのようにすれば表示されるようになりますか? void CMyWnd::OnLButtonDblClk(UINT nFlags, CPoint point)  //ウィンドウのダブルクリック { CInput* pInput = (CInput*)GetParent(); // CInputは親ダイアログのクラス pInput->ShowWindow(SW_SHOW); CWnd::OnLButtonDblClk(nFlags, point); }

  • タスクマネージャを起動する事が出来ない

    タスクマネージャを起動する事が出来ません。以下の方法を試しましたが駄目でした。 [ctl]+[alt]+[del]キーを押しても[プログラムの強制終了]ダイアログボックスは表示されますが、[Windowsのセキュリティ]ダイアログボックスが表示されないです。 [スタートボタン]→[ファイル名を指定して実行]→[名前]ボックスに"taskmgr"と入力→[OK]ボタンをクリックするの操作をしても、"taskmgrが見つかりません"と表示されます。 どのようにすれば起動できるのでしょうか。 OSはWindows2000です。

  • 非表示のメインウィンドウを表示させるには?

    環境 WIN98 VC++6.0 MFC SDIにて タスクトレイに常駐するアプリにおいて 1.起動時にメインウィンドウを非表示にしています。 2.起動時と同時にダイアログを表示しています。 int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { 略 dlg = new CInput(this); dlg->Create(IDD_DIALOG1); dlg->ShowWindow(SW_SHOW); return 0; } 3.このような場合に、ダイアログのボタン押し下げにて、メインウィンドウを表示させるには、どうすれば良いでしょうか? 以下のようにしてみましたが、不正な処理で落ちてしまいます。 void CInput::OnButton1() { CWnd* mywnd = (CWnd*)GetParent(); mywnd->ShowWindow(SW_SHOW); }