実現したいこと
マルチタスクで起動した子タスクのアイコンをタスクバー上に表示させたくないのですが,実現方法はありますか?
###実現したい理由
ユーザー操作により,図2のようにExcelを使用することがあります.ですが,現状マルチタスクで起動しているためタスクバー上に親タスクを含め子タスクのアイコンが表示されています(図4参照).その際,ユーザーに子タスク(タスクバー上のアイコンで)を消されないようにしたいからです.Excelを閉じる方法は下記の二つです.
0. 「ファイル」→「終了」をクリック.
0. Excel右上の「×」アイコンをクリック.
アプリを起動すると親タスクが子タスクを立ち上げます.子タスクはタスクバー上に隠れる(wsMinimized)状態で起動するので,「Alt」+「Tab」で選択すると画面上に表示されます.ユーザーに子タスクを操作されないようにするには,シングルタスクにする方法以外ではないでしょうか?ご教授お願いいたします.
###実機のPCの種類&設定
【種類】
OS:Windows10 64bit
MS Office2016 Professionalインストール
【設定】
0. デスクトップモードでタスクバーを自動的に隠す:オン
0. 小さいタスクバーボタンを使う:オン
図2. 親タスクの「Excel起動」をクリックした時のスクリーンショット
図3. 「Alt」+「Tab」をクリックしたときのスクリーンショット
###下記ソースの開発環境
OS:Windows10 64bit
IDE:Embarcadero C++Builder10.2
###ソースコード
<Unit1.cpp>(親タスク)
C++
1//--------------------------------------------------------------------------- 2 3#include <vcl.h> 4#pragma hdrstop 5 6#include "Unit1.h" 7SHELLEXECUTEINFO GA_shell; 8//--------------------------------------------------------------------------- 9#pragma package(smart_init) 10#pragma resource "*.dfm" 11TForm1 *Form1; 12//--------------------------------------------------------------------------- 13__fastcall TForm1::TForm1(TComponent* Owner) 14 : TForm(Owner) 15{ 16 int ans = 0; 17 18 ans = taskWake(); 19} 20//--------------------------------------------------------------------------- 21int __fastcall TForm1::taskWake(void) 22{ 23 HWND hWnd; 24 SHELLEXECUTEINFO shell; 25 int ShellRtn; 26 27 ShellRtn = 0; 28 29 if( NULL == GA_shell.hProcess ) 30 { 31 32 GA_shell.cbSize = sizeof(shell); 33 GA_shell.hwnd = hWnd; 34 GA_shell.lpVerb = _T( "open" ); 35 GA_shell.lpFile = TEXT( "C:\C++Builder\SubTaskHide\BIN\SubTask1.exe" ); 36 GA_shell.lpParameters = NULL; 37 GA_shell.nShow = SW_SHOWNORMAL; 38 GA_shell.fMask = SEE_MASK_NOCLOSEPROCESS; 39 40 41 shell = GA_shell; 42 43 44 ShellRtn = ShellExecuteEx(&shell); 45 if( 0 != ShellRtn ) 46 { 47 GA_shell.hProcess = shell.hProcess; 48 } 49 } 50 else 51 { 52 ShellRtn = 1; 53 } 54 55 // ShellRtn(0/1=OK/NG); 56 return( ShellRtn ); 57} 58//--------------------------------------------------------------------------- 59void __fastcall TForm1::Button1Click(TObject *Sender) 60{ 61 UnicodeString FileName = L"C:\C++Builder\SubTaskHide\BIN\test.xlsx"; 62 Variant Excel = Variant::CreateObject("Excel.Application"); 63 Excel.OlePropertySet("Visible", true); 64 Variant Workbooks = Excel.OlePropertyGet("Workbooks"); 65 Variant Workbook = Workbooks.OleFunction("Open", WideString(FileName)); 66} 67//---------------------------------------------------------------------------
<Unit1.h>(親タスク)
C++
1//--------------------------------------------------------------------------- 2 3#ifndef Unit1H 4#define Unit1H 5//--------------------------------------------------------------------------- 6#include <System.Classes.hpp> 7#include <Vcl.Controls.hpp> 8#include <Vcl.StdCtrls.hpp> 9#include <Vcl.Forms.hpp> 10//--------------------------------------------------------------------------- 11class TForm1 : public TForm 12{ 13__published: // IDE で管理されるコンポーネント 14 TLabel *Label1; 15 TButton *Button1; 16 void __fastcall Button1Click(TObject *Sender); 17private: // ユーザー宣言 18public: // ユーザー宣言 19 __fastcall TForm1(TComponent* Owner); 20 int __fastcall taskWake(void); 21}; 22//--------------------------------------------------------------------------- 23extern PACKAGE TForm1 *Form1; 24//--------------------------------------------------------------------------- 25#endif
<Unit1.cpp>(子タスク)
C++
1//--------------------------------------------------------------------------- 2 3#include <vcl.h> 4#pragma hdrstop 5 6#include "Unit1.h" 7//--------------------------------------------------------------------------- 8#pragma package(smart_init) 9#pragma resource "*.dfm" 10TForm1 *Form1; 11//--------------------------------------------------------------------------- 12__fastcall TForm1::TForm1(TComponent* Owner) 13 : TForm(Owner) 14{ 15} 16//---------------------------------------------------------------------------
<Unit1.h>(子タスク)
C++
1//--------------------------------------------------------------------------- 2 3#ifndef Unit1H 4#define Unit1H 5//--------------------------------------------------------------------------- 6#include <System.Classes.hpp> 7#include <Vcl.Controls.hpp> 8#include <Vcl.StdCtrls.hpp> 9#include <Vcl.Forms.hpp> 10//--------------------------------------------------------------------------- 11class TForm1 : public TForm 12{ 13__published: // IDE で管理されるコンポーネント 14 TLabel *Label1; 15private: // ユーザー宣言 16public: // ユーザー宣言 17 __fastcall TForm1(TComponent* Owner); 18}; 19//--------------------------------------------------------------------------- 20extern PACKAGE TForm1 *Form1; 21//--------------------------------------------------------------------------- 22#endif
<TotalProject.cpp>
C++
1//--------------------------------------------------------------------------- 2 3#include <vcl.h> 4#pragma hdrstop 5#include <tchar.h> 6//--------------------------------------------------------------------------- 7USEFORM("Unit1.cpp", Form1); 8//--------------------------------------------------------------------------- 9int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int) 10{ 11 try 12 { 13 Application->Initialize(); 14 Application->MainFormOnTaskBar = true; 15 Application->CreateForm(__classid(TForm1), &Form1); 16 // ここに入れても親タスクおよび子タスクのアイコンは消えず. 17 SetWindowLong(Application->Handle, GWL_EXSTYLE, GetWindowLong(Application->Handle, GWL_EXSTYLE) | WS_EX_TOOLWINDOW); 18 Application->Run(); 19 } 20 catch (Exception &exception) 21 { 22 Application->ShowException(&exception); 23 } 24 catch (...) 25 { 26 try 27 { 28 throw Exception(""); 29 } 30 catch (Exception &exception) 31 { 32 Application->ShowException(&exception); 33 } 34 } 35 return 0; 36} 37//---------------------------------------------------------------------------
<Windows SDKにSetWindowLongを追加したソース>
C++
1//--------------------------------------------------------------------------- 2 3#include <vcl.h> 4#pragma hdrstop 5#include <tchar.h> 6//--------------------------------------------------------------------------- 7USEFORM("Unit1.cpp", Form1); 8//--------------------------------------------------------------------------- 9int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int) 10{ 11 try 12 { 13 Application->Initialize(); 14 Application->MainFormOnTaskBar = true; 15 Application->CreateForm(__classid(TForm1), &Form1); 16 // ここに入れても親タスクおよび子タスクのアイコンは消えず. 17 SetWindowLong(Application->Handle, GWL_EXSTYLE, GetWindowLong(Application->Handle, GWL_EXSTYLE) | WS_EX_TOOLWINDOW); 18 Application->Run(); 19 } 20 catch (Exception &exception) 21 { 22 Application->ShowException(&exception); 23 } 24 catch (...) 25 { 26 try 27 { 28 throw Exception(""); 29 } 30 catch (Exception &exception) 31 { 32 Application->ShowException(&exception); 33 } 34 } 35 return 0; 36} 37//---------------------------------------------------------------------------
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/05/26 06:34
2019/05/26 06:49
2019/05/26 08:06
2019/05/28 15:42