2 * SHAppBarMessage implementation
4 * Copyright 2008 Vincent Povirk for CodeWeavers
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
34 #include "wine/debug.h"
35 #include "wine/unicode.h"
37 WINE_DEFAULT_DEBUG_CHANNEL(appbar
);
39 struct appbar_data_msg
/* platform-independent data */
42 UINT uCallbackMessage
;
52 struct appbar_data_msg abd
;
55 struct appbar_response
58 struct appbar_data_msg abd
;
61 /*************************************************************************
62 * SHAppBarMessage [SHELL32.@]
64 UINT_PTR WINAPI
SHAppBarMessage(DWORD msg
, PAPPBARDATA data
)
66 struct appbar_cmd command
;
67 struct appbar_response
* response
;
70 HWND appbarmsg_window
;
73 static const WCHAR classname
[] = {'W','i','n','e','A','p','p','B','a','r',0};
77 TRACE("msg=%d, data={cb=%d, hwnd=%p, callback=%x, edge=%d, rc=%s, lparam=%lx}\n",
78 msg
, data
->cbSize
, data
->hWnd
, data
->uCallbackMessage
, data
->uEdge
,
79 wine_dbgstr_rect(&data
->rc
), data
->lParam
);
81 if (data
->cbSize
< sizeof(APPBARDATA
))
83 WARN("data at %p is too small\n", data
);
87 command
.abd
.hWnd
= HandleToLong( data
->hWnd
);
88 command
.abd
.uCallbackMessage
= data
->uCallbackMessage
;
89 command
.abd
.uEdge
= data
->uEdge
;
90 command
.abd
.rc
= data
->rc
;
91 command
.abd
.lParam
= data
->lParam
;
93 return_map
= CreateFileMappingW(INVALID_HANDLE_VALUE
, 0, PAGE_READWRITE
, 0, sizeof(struct appbar_response
), NULL
);
94 if (return_map
== NULL
)
96 ERR("couldn't create file mapping\n");
99 command
.return_map
= HandleToUlong( return_map
);
101 command
.return_process
= GetCurrentProcessId();
103 appbarmsg_window
= FindWindowW(classname
, NULL
);
104 if (appbarmsg_window
== NULL
)
106 ERR("couldn't find appbar window\n");
107 CloseHandle(return_map
);
112 cds
.cbData
= sizeof(command
);
113 cds
.lpData
= &command
;
115 SendMessageTimeoutW(appbarmsg_window
, WM_COPYDATA
, (WPARAM
)data
->hWnd
, (LPARAM
)&cds
, SMTO_BLOCK
, INFINITE
, &msg_result
);
117 return_view
= MapViewOfFile(return_map
, FILE_MAP_READ
, 0, 0, sizeof(struct appbar_response
));
118 if (return_view
== NULL
)
120 ERR("MapViewOfFile failed\n");
121 CloseHandle(return_map
);
125 response
= return_view
;
127 ret
= response
->result
;
130 data
->hWnd
= UlongToHandle( response
->abd
.hWnd
);
131 data
->uCallbackMessage
= response
->abd
.uCallbackMessage
;
132 data
->uEdge
= response
->abd
.uEdge
;
133 data
->rc
= response
->abd
.rc
;
134 data
->lParam
= response
->abd
.lParam
;
136 UnmapViewOfFile(return_view
);
138 CloseHandle(return_map
);