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

在其他視窗(其他應用程式)的標題列多一個button

尚未結案
ericssoneric
一般會員


發表:9
回覆:5
積分:2
註冊:2005-01-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-11-01 21:55:45 IP:140.123.xxx.xxx 未訂閱
例如,隨便一個視窗(例:檔案總館、msn)的標題列上會有『縮小』『放大』『關閉』的button,然後在旁邊多一個自訂的button。    已經看過這篇文章了,但似乎還是無解 http://delphi.ktop.com.tw/topic.php?topic_id=24032    我有一個VC的範例,但有看沒有懂,如下:
 
// WinPinApp.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
#include "resource.h"    HINSTANCE hInst;
HHOOK g_hHook = NULL;
HMODULE g_hModule;    typedef LRESULT(CALLBACK *HOOKKWINDOWPROC)(int, WPARAM, LPARAM);    _declspec(dllimport) BOOL WINAPI StartHook();
_declspec(dllimport) BOOL WINAPI StopHook();    int SetHook()
{
    LPVOID lpMsgBuf;
    int err;        HOOKKWINDOWPROC HookWndProc;
    g_hModule = LoadLibrary("WinPinDll.Dll");
    if(!g_hModule)
    {
        err= GetLastError();
        FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,NULL,err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),(LPTSTR) &lpMsgBuf, 0, NULL);
        MessageBox(NULL,(LPTSTR)lpMsgBuf, "GetLastError", MB_OK|MB_ICONERROR);
        LocalFree(lpMsgBuf);
        return 1;
    }        HookWndProc = (HOOKKWINDOWPROC)GetProcAddress(g_hModule,"HookWindowProc");
    if(!HookWndProc)
    {
       err= GetLastError();
       FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,NULL,err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),(LPTSTR) &lpMsgBuf, 0, NULL);
       MessageBox(NULL,(LPTSTR)lpMsgBuf, "GetLastError", MB_OK|MB_ICONERROR);
       LocalFree(lpMsgBuf);
       return 2;
    }        g_hHook = SetWindowsHookEx(WH_CALLWNDPROC,(HOOKKWINDOWPROC)HookWndProc,g_hModule,0);
    if(!g_hHook)
    {
        err= GetLastError();
        FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,NULL,err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),(LPTSTR) &lpMsgBuf, 0, NULL);
        MessageBox(NULL,(LPTSTR)lpMsgBuf, "GetLastError", MB_OK|MB_ICONERROR);
        LocalFree(lpMsgBuf);
        return 3;
     }         return 0;
}    int RemoveHook()
{
   if(g_hHook != NULL)
   {
        if(UnhookWindowsHookEx(g_hHook) != 0)
                g_hHook = NULL;
        FreeLibrary(g_hModule);
   }
   return 0;
}    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
   switch (message) 
   {
        case WM_COMMAND:
                break;
        case WM_DESTROY:
                PostQuitMessage(0);
                break;
        default:
                return DefWindowProc(hWnd, message, wParam, lParam);
   }
   return 0;
}    int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
   MSG msg;
   if(StartHook())
        return 0;
   while (GetMessage(&msg, NULL, 0, 0)) 
   {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
   }
   StopHook();
   return msg.wParam;
}    
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-11-03 08:20:25 IP:211.76.xxx.xxx 未訂閱
這篇文章 http://delphi.ktop.com.tw/topic.php?topic_id=24032 johnny.guo 的說法應該是可以作到,不過,應該是要了解 VC 才比較容易作, 因為攔到視窗 Handle 後也無法用 BCB/Delphi 的 VCL 直接去 paint, 應該是用 DC 等操作去 paint 要熟 VC 多一些會比較容易作到。    如果是我,我的作法是只在 Active 視窗的標題列顯示一個表單, 那個表單就只有一個 button,就類似一些桌面小工具,可以在 Active視窗上放一個美女或寵物一樣,這樣,只需要一個 Timer 每固定時間, 1. 找出目前前景 Active 視窗, 2. 找出該視窗的位置及長寬, 3. 算出這樣的視窗要顯示 button 表單的位置, 4. 把 button 表單移到該位置上 這個 button 表單必需要有 Always On Top 的屬性。 這樣,就可以作出類似的效果。    如果您說,那非 Active 視窗的標題列也想要有, 那就改一下以上的流程 1. 找出目前所有顯示中的視窗,並建立列表  如果與舊列表比對,有新視窗,則 new 一個 button 表單給它    如果與舊列表比對,有視窗不在了,則 delete 對應的 button 表單 2. 找出這些視窗目前的位置及長寬 3. 算出這些的視窗要顯示 button 表單的位置 4. 顯示 button 表單到對應視窗的位置上    我記得沒錯的話,Dr.Eye 應該是用類似的方法(我說的第一種),效果還不錯。    C# 初學者請多指教  < href="http://free.greenworld.com.tw/~dllee/" target="blank">吃軟也吃硬 dllee.ktop.com.tw dllee's sharespace Beckhoff Fieldbus VMASK
------
http://www.ViewMove.com
bugmans
高階會員


發表:95
回覆:322
積分:188
註冊:2003-04-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-05-04 18:55:10 IP:125.225.xxx.xxx 未訂閱
ericssoneric所提的vc範例出自這裡http://www.codeproject.com/KB/DLL/WinPin.aspx



另外補充其他範例

http://www.catch22.net/source/Global Titlebar Hook

Insert buttons into window titlebars on a global level (system-wide).

Handles XP Themes if available.

還附上如使用範例test.c,test2.c,我覺得這比codeproject的範例還容易了解



呼叫AddGlobalButton(hwnd, 12345, IDB_BITMAP1);新增按鈕,12345為button的command id

在訊息迴圈抓WM_COMMAND訊息,wParam參數是按鈕的command id

還有其他函式可以呼叫,詳細內容可以看globar.c

EnableGlobalButtons,EnableGlobalButtons,RemoveGlobalButton,DisableByName



還可發展為商業軟體

Actual Window Minimizer http://www.actualtools.com/windowminimizer/

4t Tray Minimizer Free http://www.4t-niagara.com/tray.html

toget說明http://toget.pchome.com.tw/intro/utility_desktop/utility_desktop_menu/18377.html


搜尋關鍵字:HCBT_ACTIVATE,HCBT_CREATEWND,SetWindowsHookEx,UnhookWindowsHookEx,WH_CBT
07.12.31補充
Iconizerhttp://www.codeproject.com/KB/shell/iconizer.aspx

可搭配Minimize any window to system tray using Windows Hook
http://www.codeproject.com/KB/system/MinimizedAnyWindowToTray.aspx
按下縮小的按鈕後將視窗縮小到trayicon
相關軟體
Notify Minimizer - 通通藏到系統欄裡
http://toget.pchome.com.tw/intro/utility_other/25463.html
編輯記錄
bugmans 重新編輯於 2007-05-04 19:03:26, 註解 無‧
bugmans 重新編輯於 2007-12-31 14:26:01, 註解 無‧
系統時間:2024-04-24 16:28:49
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!