- make Shell Hook Messages really work in Windows

- comments for SHELL32's RegisterShellHook()

svn path=/trunk/; revision=14354
This commit is contained in:
Martin Fuchs 2005-03-27 19:57:26 +00:00
parent 0baf2d03b1
commit 03a5f16ed9
10 changed files with 56 additions and 8 deletions

View file

@ -436,7 +436,7 @@ LRESULT DesktopWindow::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
case WM_DESTROY:
///@todo use IShellBrowser::GetViewStateStream() and _pShellView->SaveViewState() to store view state
if (SetShellWindow)
SetShellWindow(0);
break;

View file

@ -736,7 +736,6 @@ MDIMainFrame::MDIMainFrame(HWND hwnd)
extraBtns.idCommand = ID_WEB_WINDOW;
SendMessage(_hextrabar, TB_INSERTBUTTON, INT_MAX, (LPARAM)&extraBtns);
#define W_VER_NT 0
if ((HIWORD(GetVersion())>>14) == W_VER_NT) {
// insert NT object namespace button
extraBtns.iString = SendMessage(_hextrabar, TB_ADDSTRING, 0, (LPARAM)TEXT("NT Obj\0"));

View file

@ -1952,7 +1952,6 @@ void StartMenuHandler::ShowLaunchDialog(HWND hwndOwner)
// Show "Run..." dialog
if (RunFileDlg) {
#ifndef _ROS_ /* FIXME: our shell32 always expects Ansi strings */
#define W_VER_NT 0
if ((HIWORD(GetVersion())>>14) == W_VER_NT) {
WCHAR wTitle[40], wText[256];

View file

@ -36,6 +36,16 @@ DynamicFct<BOOL (WINAPI*)(HWND hwnd)> g_SetTaskmanWindow(TEXT("user32"), "SetTas
DynamicFct<BOOL (WINAPI*)(HWND hwnd)> g_RegisterShellHookWindow(TEXT("user32"), "RegisterShellHookWindow");
DynamicFct<BOOL (WINAPI*)(HWND hwnd)> g_DeregisterShellHookWindow(TEXT("user32"), "DeregisterShellHookWindow");
/*
DynamicFct<BOOL (WINAPI*)(HWND hWnd, DWORD dwType)> g_RegisterShellHook(TEXT("shell32"), (LPCSTR)0xb5);
// constants for RegisterShellHook()
#define RSH_UNREGISTER 0
#define RSH_REGISTER 1
#define RSH_REGISTER_PROGMAN 2
#define RSH_REGISTER_TASKMAN 3
*/
TaskBarEntry::TaskBarEntry()
{
@ -59,13 +69,30 @@ TaskBarMap::~TaskBarMap()
TaskBar::TaskBar(HWND hwnd)
: super(hwnd),
WM_SHELLHOOK(RegisterWindowMessage(TEXT("SHELLHOOK")))
WM_SHELLHOOK(RegisterWindowMessage(WINMSG_SHELLHOOK))
{
_last_btn_width = 0;
_mmMetrics_org.cbSize = sizeof(MINIMIZEDMETRICS);
SystemParametersInfo(SPI_GETMINIMIZEDMETRICS, sizeof(_mmMetrics_org), &_mmMetrics_org, 0);
// configure the window manager to hide windows when they are minimized
// This is neccessary to enable shell hook messages.
if (!(_mmMetrics_org.iArrange & ARW_HIDE)) {
MINIMIZEDMETRICS _mmMetrics_new = _mmMetrics_org;
_mmMetrics_new.iArrange |= ARW_HIDE;
SystemParametersInfo(SPI_SETMINIMIZEDMETRICS, sizeof(_mmMetrics_new), &_mmMetrics_new, 0);
}
}
TaskBar::~TaskBar()
{
// if (g_RegisterShellHook)
// (*g_RegisterShellHook)(_hwnd, RSH_UNREGISTER);
if (g_DeregisterShellHookWindow)
(*g_DeregisterShellHookWindow)(_hwnd);
else
@ -73,6 +100,8 @@ TaskBar::~TaskBar()
if (g_SetTaskmanWindow)
(*g_SetTaskmanWindow)(0);
SystemParametersInfo(SPI_GETMINIMIZEDMETRICS, sizeof(_mmMetrics_org), &_mmMetrics_org, 0);
}
HWND TaskBar::Create(HWND hwndParent)
@ -105,7 +134,7 @@ LRESULT TaskBar::Init(LPCREATESTRUCT pcs)
_next_id = IDC_FIRST_APP;
// register ourselved as task manager window to make the following call to RegisterShellHookWindow working
// register the taskbar window as task manager window to make the following call to RegisterShellHookWindow working
if (g_SetTaskmanWindow)
(*g_SetTaskmanWindow)(_hwnd);
@ -118,6 +147,16 @@ LRESULT TaskBar::Init(LPCREATESTRUCT pcs)
SetTimer(_hwnd, 0, 200, NULL);
}
/* Alternatively we could use the RegisterShellHook() function in SHELL32, but this is not yet implemented in the WINE code.
if (g_RegisterShellHook) {
(*g_RegisterShellHook)(0, RSH_REGISTER);
if ((HIWORD(GetVersion())>>14) == W_VER_NT)
(*g_RegisterShellHook)(_hwnd, RSH_REGISTER_TASKMAN);
else
(*g_RegisterShellHook)(_hwnd, RSH_REGISTER);
}
*/
Refresh();
return 0;
@ -156,6 +195,10 @@ LRESULT TaskBar::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
case HSHELL_WINDOWDESTROYED:
case HSHELL_WINDOWACTIVATED:
case HSHELL_REDRAW:
#ifdef HSHELL_FLASH
case HSHELL_FLASH:
case HSHELL_RUDEAPPACTIVATED:
#endif
Refresh();
break;
}
@ -409,6 +452,7 @@ BOOL CALLBACK TaskBar::EnumWndProc(HWND hwnd, LPARAM lparam)
entry._fsState = btn.fsState;
#ifdef _ROS_ // now handled by activating the ARW_HIDE flag with SystemParametersInfo(SPI_SETMINIMIZEDMETRICS)
// move minimized windows out of sight
if (IsIconic(hwnd)) {
RECT rect;
@ -418,6 +462,7 @@ BOOL CALLBACK TaskBar::EnumWndProc(HWND hwnd, LPARAM lparam)
if (rect.bottom > 0)
SetWindowPos(hwnd, 0, -32000, -32000, 0, 0, SWP_NOSIZE|SWP_NOZORDER|SWP_NOACTIVATE);
}
#endif
}
return TRUE;

View file

@ -85,6 +85,7 @@ protected:
int _next_id;
WindowHandle _last_foreground_wnd;
int _last_btn_width;
MINIMIZEDMETRICS _mmMetrics_org;
const UINT WM_SHELLHOOK;

View file

@ -1,5 +1,5 @@
/*
* Copyright 2003, 2004 Martin Fuchs
* Copyright 2003, 2004, 2005 Martin Fuchs
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public

View file

@ -1,5 +1,5 @@
/*
* Copyright 2003, 2004 Martin Fuchs
* Copyright 2003, 2004, 2005 Martin Fuchs
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public

View file

@ -59,6 +59,8 @@
#define _MAX_PATH 260
#endif
#define W_VER_NT 0 // constant for HIWORD(GetVersion())>>14
#ifdef __cplusplus
extern "C" {

View file

@ -1,5 +1,5 @@
/*
* Copyright 2003, 2004 Martin Fuchs
* Copyright 2003, 2004, 2005 Martin Fuchs
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public

View file

@ -984,6 +984,8 @@ enum {TRAYBUTTON_LEFT=0, TRAYBUTTON_RIGHT, TRAYBUTTON_MIDDLE};
#define WINMSG_TASKBARCREATED TEXT("TaskbarCreated")
#define WINMSG_SHELLHOOK TEXT("SHELLHOOK")
struct TrayIcon
{