請各位前輩高手指教一下,我找到了一個程式,可以在按鈕按下時,把焦點設到記事本上面去,但是我想改寫成按鈕按下時,不管上一個視窗是word記事本還是網頁,都能把焦點重設回去,我己經試著改了幾十次,可是出盡各種方式,連編譯都沒辦法,老是得到一大堆錯誤的訊息回報,所以我把可以執行的原始程或貼上來,請各位前輩高手幫我改一下。
#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;
}
//-------------------------------------------------------------------------