Posted on 一月 21, 2008 by brain
在上一篇文章中我們提到可以利用 SendMessage 方式主動關閉程式
那如果我今天想要關閉的程式非自己撰寫的 要怎麼作呢?
運用的技巧是透過取得該程式的 Window Caption 再來取得其 handle
在已知其 Caption 時可以透過於 OnTimer 函示中 加入如下程式來定時檢查並關閉
假設我們要關閉之程式為 “foobar v0.9.5 “
HWND hfoobar = ::FindWindow(NULL, "foobar2000 v0.9.5");
if (hfoobar)
{
::SendMessage( hfoobar, WM_SYSCOMMAND, SC_CLOSE, 0 );
}
但如果今日 軟體改版 (ex: foobar v0.9.6) 時 是否程式就沒有用了呢 !?
存放在: 非關分類 | 屬於此標籤: C++, SendMessage, Windows | 張貼留言 »
Posted on 一月 21, 2008 by brain
之前提到可以利用 SendMessage() 的方式來主動與視窗程式溝通
假設今天情境需求為 希望能定期檢查程式中某函數值 如果 FALSE 則主動關閉程式
那應該要如何實作呢 !?
產生 OnTimer() 函示 -> 定期 Polling
如果 Polling 結果為非 -> 關閉程式
假設需要關閉的是主程式 第一步一樣先取得其視窗 Handle
接著送出訊息告知關閉 ! 如下…
HWND hCloseWindow = this->GetSafeHwnd();
::SendMessage(hCloseWindow, WM_CLOSE, 0, 0);
(關閉所需送出之 MSG 為 WM_CLOSE)
如此即可定時檢查程式內某參數/函數 !!
–
更新 2008/01/21
雖然上述方式依舊可以成功 但正確用法應如下所示…
::SendMessage(hWnd, WM_SYSCOMMAND, SC_CLOSE, NULL);
可以參考 MSDN中有關 WM_SYSCOMMAND 的 class member 用法 [連結]
存放在: 技術相關 | 屬於此標籤: C++, SendMessage | 張貼留言 »
Posted on 一月 16, 2008 by brain
之前提過 PostMessage 的用法 其實 SendMessage 的用法也滿類似的
先看看他的定義:
LRESULT SendMessage(HWND hWnd, UINT Msg,WPARAM wParam, LPARAM lParam);
hWnd – handle of destination window
Msg – message to send
wParam – first variable
lParam – second variable
宣告跟 PostMessage 也滿類似的 差別僅在於回傳值的不同
PostMessage 是 BOOL 而 SendMessage 則是 LRESULT
故 SendMessage 用於需要即時得知處理結果的情況下
而 PostMessage則是將處理送出 不在意立即結果
下面兩篇網誌 有查到一些使用時機與用法 可以參考… [1]、[2]
存放在: 非關分類 | 屬於此標籤: Auto Complete, C++, SendMessage | 張貼留言 »