全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1631
推到 Plurk!
推到 Facebook!

請問如何控制別的.exe執行檔視窗最小化

答題得分者是:cashyy
u9012021
一般會員


發表:21
回覆:19
積分:23
註冊:2005-01-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-05-27 00:43:47 IP:210.61.xxx.xxx 未訂閱
  AnsiString Project1Project = FilePath "Project1.exe";
  char *Project1 = Project1Project.c_str();
  ShellExecute(NULL,"open",Project1,NULL,NULL,SW_MINIMIZE);
 
以上是我的程式碼~~我用此ShellExecute去開啟Prohect1.exe的執行檔 並且使它開啟的時候作視窗最小化的動作~~可是執行時有呼叫出視窗~~ 不過並沒有作最小化的動作~~不知道有人是否有遇過這個問題??
cashyy
高階會員


發表:117
回覆:322
積分:212
註冊:2004-04-30

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-05-27 01:50:43 IP:211.74.xxx.xxx 未訂閱
您好! 小弟這裡有的功能是:取得指定視窗執行緒id! 提供類似的程式,雖然還要改啦!
  //---------------------------------------------------------------------------
#include 
#pragma hdrstop    #include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  //搜尋<記事本>有無開啟
  HWND hNpad = ::FindWindow(NULL, "未命名 - 記事本");
  //若<記事本>在開啟中,即帶到最前面
  if(::ShowWindow(hNpad,SW_SHOWNORMAL))
  {
    ::BringWindowToTop(hNpad);
  }
  else //若沒開啟,則開啟<記事本>
  {
    //取得Window目錄位置
    char WinDir[MAX_PATH];
    ::GetWindowsDirectory(WinDir, MAX_PATH);
    AnsiString sysdir = AnsiString(WinDir)   "\\Notepad.exe";
    //開啟<記事本>
    ::ShellExecute(NULL,"open",sysdir.c_str(),NULL,NULL,SW_SHOWNORMAL);
   //再次找到<記事本>視窗
   hNpad = ::FindWindow(NULL, "未命名 - 記事本");
  }
  //進行自訂函式
  if(VaultWindowThreadID(hNpad))
    Memo1->Text = "完成在不同執行緒行程間的視窗取得焦點。";
  else
    Memo1->Text = "請在開啟<記事本>後,再執行本程式。";
}
//---------------------------------------------------------------------------
//在不同執行緒行程間的視窗取得焦點
bool TForm1::VaultWindowThreadID(HWND hWnd)
{
bool Result;
DWORD fWinThreadID;
DWORD winThreadID;
//若傳入的視窗handle等同於現在最前面視窗handle
if(hWnd == ::GetForegroundWindow())
   Result = true;
else
   {//取得現在最前面視窗的執行緒代碼ID
   fWinThreadID =
      ::GetWindowThreadProcessId(::GetForegroundWindow(), NULL);
   //取得現在視窗的執行緒ID
   winThreadID = ::GetWindowThreadProcessId(hWnd, NULL);
   if(fWinThreadID != winThreadID)
      {//若兩者不同,則跳至現在執行緒的視窗,並移動至最前面
      ::AttachThreadInput(fWinThreadID, winThreadID, true);
      Result = ::SetForegroundWindow(hWnd);//true
      //再解開此二者不同執行緒的關聯
      ::AttachThreadInput(fWinThreadID, winThreadID, false);
      }
   else//若相同,則直接將此視窗提至最前面
      Result = ::SetForegroundWindow(hWnd);
   //顯現視窗至桌面上
   ::ShowWindow(hWnd, SW_RESTORE);
   return Result;
   }
return Result;
}
//---------------------------------------------------------------------------
可用ShowWindow(hWnd,SW_HIDE);//來隱藏 發表人 - cashyy 於 2005/05/27 02:20:45
u9012021
一般會員


發表:21
回覆:19
積分:23
註冊:2005-01-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-05-27 02:24:04 IP:210.61.xxx.xxx 未訂閱
感謝大大的回應~不過你的方式步是我所需要的~ 跟你說的不一樣~你寫的方式應該是在同一個執行檔內不同的視窗控制 而我需要的是兩個不同的執行檔~也就是兩個.EXE檔各有不同的視窗 我需要的是由外部控制這兩個執行檔的視窗可以最小化的功能
u9012021
一般會員


發表:21
回覆:19
積分:23
註冊:2005-01-18

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-05-27 03:58:54 IP:210.61.xxx.xxx 未訂閱
引言: 您好! 小弟這裡有的功能是:取得指定視窗執行緒id! 提供類似的程式,雖然還要改啦!
  //---------------------------------------------------------------------------
#include 
#pragma hdrstop    #include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  //搜尋<記事本>有無開啟
  HWND hNpad = ::FindWindow(NULL, "未命名 - 記事本");
  //若<記事本>在開啟中,即帶到最前面
  if(::ShowWindow(hNpad,SW_SHOWNORMAL))
  {
    ::BringWindowToTop(hNpad);
  }
  else //若沒開啟,則開啟<記事本>
  {
    //取得Window目錄位置
    char WinDir[MAX_PATH];
    ::GetWindowsDirectory(WinDir, MAX_PATH);
    AnsiString sysdir = AnsiString(WinDir)   "\\Notepad.exe";
    //開啟<記事本>
    ::ShellExecute(NULL,"open",sysdir.c_str(),NULL,NULL,SW_SHOWNORMAL);
   //再次找到<記事本>視窗
   hNpad = ::FindWindow(NULL, "未命名 - 記事本");
  }
  //進行自訂函式
  if(VaultWindowThreadID(hNpad))
    Memo1->Text = "完成在不同執行緒行程間的視窗取得焦點。";
  else
    Memo1->Text = "請在開啟<記事本>後,再執行本程式。";
}
//---------------------------------------------------------------------------
//在不同執行緒行程間的視窗取得焦點
bool TForm1::VaultWindowThreadID(HWND hWnd)
{
bool Result;
DWORD fWinThreadID;
DWORD winThreadID;
//若傳入的視窗handle等同於現在最前面視窗handle
if(hWnd == ::GetForegroundWindow())
   Result = true;
else
   {//取得現在最前面視窗的執行緒代碼ID
   fWinThreadID =
      ::GetWindowThreadProcessId(::GetForegroundWindow(), NULL);
   //取得現在視窗的執行緒ID
   winThreadID = ::GetWindowThreadProcessId(hWnd, NULL);
   if(fWinThreadID != winThreadID)
      {//若兩者不同,則跳至現在執行緒的視窗,並移動至最前面
      ::AttachThreadInput(fWinThreadID, winThreadID, true);
      Result = ::SetForegroundWindow(hWnd);//true
      //再解開此二者不同執行緒的關聯
      ::AttachThreadInput(fWinThreadID, winThreadID, false);
      }
   else//若相同,則直接將此視窗提至最前面
      Result = ::SetForegroundWindow(hWnd);
   //顯現視窗至桌面上
   ::ShowWindow(hWnd, SW_RESTORE);
   return Result;
   }
return Result;
}
//---------------------------------------------------------------------------
可用ShowWindow(hWnd,SW_HIDE);//來隱藏 發表人 - cashyy 於 2005/05/27 02:20:45
感謝大大的指導~~可以用了~~謝謝你唷^^
系統時間:2024-04-28 4:23:56
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!