diff --git a/dlls/uiautomationcore/uia_com_client.c b/dlls/uiautomationcore/uia_com_client.c
index 19540b19dc0356f1de27d6549dc90fc298c7f3ad..8f8d5d0170e5cc96ab7937eb74891b0529124f7b 100644
--- a/dlls/uiautomationcore/uia_com_client.c
+++ b/dlls/uiautomationcore/uia_com_client.c
@@ -958,6 +958,12 @@ struct uia_com_event {
     struct uia_event_handler_map_entry *handler_map;
 };
 
+HRESULT uia_com_win_event_callback(DWORD event_id, HWND hwnd, LONG obj_id, LONG child_id, DWORD thread_id, DWORD event_time)
+{
+    FIXME("%ld, %p, %ld, %ld, %ld, %ld: stub\n", event_id, hwnd, obj_id, child_id, thread_id, event_time);
+    return S_OK;
+}
+
 static HRESULT uia_event_handlers_add_handler(IUnknown *handler_iface, SAFEARRAY *runtime_id, int event_id,
         struct uia_com_event *event)
 {
@@ -3311,6 +3317,9 @@ static HRESULT uia_add_com_event_handler(IUIAutomation6 *iface, EVENTID event_id
     if (FAILED(hr))
         goto exit;
 
+    if (!uia_clientside_event_start_event_thread((struct uia_event *)com_event->event))
+        WARN("Failed to start event thread, WinEvents may not be delivered.\n");
+
     hr = uia_event_handlers_add_handler(handler_unk, runtime_id, event_id, com_event);
 
 exit:
diff --git a/dlls/uiautomationcore/uia_event.c b/dlls/uiautomationcore/uia_event.c
index 395b20e0537a249cce891a67741a3883df1b66d4..0008b543808ca00c2c2d683d3ca5ac2547a10ec8 100644
--- a/dlls/uiautomationcore/uia_event.c
+++ b/dlls/uiautomationcore/uia_event.c
@@ -78,7 +78,6 @@ static BOOL CALLBACK uia_win_event_enum_top_level_hwnds(HWND hwnd, LPARAM lparam
     return TRUE;
 }
 
-static BOOL uia_clientside_event_start_event_thread(struct uia_event *event);
 HRESULT uia_event_add_win_event_hwnd(struct uia_event *event, HWND hwnd)
 {
     if (!uia_clientside_event_start_event_thread(event))
@@ -844,6 +843,11 @@ static void uia_event_thread_process_queue(struct list *event_queue)
         {
             struct uia_queue_win_event *win_event = (struct uia_queue_win_event *)event;
 
+            hr = uia_com_win_event_callback(win_event->event_id, win_event->hwnd, win_event->obj_id, win_event->child_id,
+                    win_event->thread_id, win_event->event_time);
+            if (FAILED(hr))
+                WARN("uia_com_win_event_callback failed with hr %#lx\n", hr);
+
             hr = uia_event_for_each(win_event_to_uia_event_id(win_event->event_id), uia_win_event_for_each_callback,
                     (void *)win_event, TRUE);
             break;
@@ -990,7 +994,7 @@ static void uia_stop_event_thread(void)
     LeaveCriticalSection(&event_thread_cs);
 }
 
-static BOOL uia_clientside_event_start_event_thread(struct uia_event *event)
+BOOL uia_clientside_event_start_event_thread(struct uia_event *event)
 {
     if (!event->u.clientside.event_thread_started)
         event->u.clientside.event_thread_started = uia_start_event_thread();
diff --git a/dlls/uiautomationcore/uia_private.h b/dlls/uiautomationcore/uia_private.h
index 8a750bf3ae1e35ecceb171cbec1d51e47f282c7b..358a0c95217a14a7016cfaffa8b0308a5c3e8c57 100644
--- a/dlls/uiautomationcore/uia_private.h
+++ b/dlls/uiautomationcore/uia_private.h
@@ -223,10 +223,13 @@ HRESULT uia_condition_check(HUIANODE node, struct UiaCondition *condition) DECLS
 BOOL uia_condition_matched(HRESULT hr) DECLSPEC_HIDDEN;
 
 /* uia_com_client.c */
+HRESULT uia_com_win_event_callback(DWORD event_id, HWND hwnd, LONG obj_id, LONG child_id, DWORD thread_id,
+        DWORD event_time) DECLSPEC_HIDDEN;
 HRESULT create_uia_iface(IUnknown **iface, BOOL is_cui8) DECLSPEC_HIDDEN;
 
 /* uia_event.c */
 HRESULT uia_event_add_win_event_hwnd(struct uia_event *event, HWND hwnd) DECLSPEC_HIDDEN;
+BOOL uia_clientside_event_start_event_thread(struct uia_event *event) DECLSPEC_HIDDEN;
 HRESULT create_serverside_uia_event(struct uia_event **out_event, LONG process_id, LONG event_cookie) DECLSPEC_HIDDEN;
 HRESULT uia_event_add_provider_event_adviser(IRawElementProviderAdviseEvents *advise_events,
         struct uia_event *event) DECLSPEC_HIDDEN;