u9012021
一般會員
發表:21 回覆:19 積分:23 註冊:2005-01-18
發送簡訊給我
|
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
發送簡訊給我
|
您好!
小弟這裡有的功能是:取得指定視窗執行緒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
發送簡訊給我
|
感謝大大的回應~不過你的方式步是我所需要的~ 跟你說的不一樣~你寫的方式應該是在同一個執行檔內不同的視窗控制 而我需要的是兩個不同的執行檔~也就是兩個.EXE檔各有不同的視窗 我需要的是由外部控制這兩個執行檔的視窗可以最小化的功能
|
u9012021
一般會員
發表:21 回覆:19 積分:23 註冊:2005-01-18
發送簡訊給我
|
引言:
您好!
小弟這裡有的功能是:取得指定視窗執行緒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
感謝大大的指導~~可以用了~~謝謝你唷^^
|