Add support for winevent hooks.
diff --git a/server/queue.c b/server/queue.c
index 0c9b23f..e5a5979 100644
--- a/server/queue.c
+++ b/server/queue.c
@@ -70,6 +70,8 @@
int y; /* y position */
unsigned int time; /* message time */
unsigned int info; /* extra info */
+ user_handle_t hook; /* winevent hook handle */
+ void *hook_proc; /* winevent hook proc address */
void *data; /* message data for sent messages */
unsigned int data_size; /* size of message data */
struct message_result *result; /* result in sender queue */
@@ -550,6 +552,8 @@
reply->y = msg->y;
reply->time = msg->time;
reply->info = msg->info;
+ reply->hook = msg->hook;
+ reply->hook_proc = msg->hook_proc;
if (msg->data) set_reply_data_ptr( msg->data, msg->data_size );
@@ -1296,6 +1300,45 @@
release_object( thread );
}
+/* post a win event */
+void post_win_event( struct thread *thread, unsigned int event,
+ user_handle_t win, unsigned int object_id,
+ unsigned int child_id, void *hook_proc,
+ const WCHAR *module, size_t module_size,
+ user_handle_t hook)
+{
+ struct message *msg;
+
+ if (thread->queue && (msg = mem_alloc( sizeof(*msg) )))
+ {
+ msg->type = MSG_WINEVENT;
+ msg->win = get_user_full_handle( win );
+ msg->msg = event;
+ msg->wparam = object_id;
+ msg->lparam = child_id;
+ msg->time = get_tick_count();
+ msg->x = 0;
+ msg->y = 0;
+ msg->info = get_thread_id( current );
+ msg->result = NULL;
+ msg->hook = hook;
+ msg->hook_proc = hook_proc;
+
+ if ((msg->data = malloc( module_size )))
+ {
+ msg->data_size = module_size;
+ memcpy( msg->data, module, module_size );
+
+ if (debug_level > 1)
+ fprintf( stderr, "post_win_event: tid %04x event %04x win %p object_id %d child_id %d\n",
+ get_thread_id(thread), event, win, object_id, child_id );
+ append_message( &thread->queue->msg_list[SEND_MESSAGE], msg );
+ set_queue_bits( thread->queue, QS_SENDMESSAGE );
+ }
+ else
+ free( msg );
+ }
+}
/* get the message queue of the current thread */
DECL_HANDLER(get_msg_queue)