[NTUSER] Improve NtUserQueryWindow (#3915)

- Improve NtUserQueryWindow function.
- Add IMC structure.
- Modify THREADINFO structure.
CORE-11700
This commit is contained in:
Katayama Hirofumi MZ 2021-08-21 07:31:10 +09:00 committed by GitHub
parent d78e9fbb45
commit 10c9aa067f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 37 additions and 8 deletions

View file

@ -187,6 +187,14 @@ typedef struct _THRDESKHEAD
PVOID pSelf;
} THRDESKHEAD, *PTHRDESKHEAD;
typedef struct tagIMC
{
THRDESKHEAD head;
struct tagIMC *pImcNext;
ULONG_PTR dwClientImcData;
HWND hImeWnd;
} IMC, *PIMC;
typedef struct _PROCDESKHEAD
{
HEAD;

View file

@ -75,6 +75,8 @@ typedef struct _W32THREAD
PVOID pUMPDObj;
} W32THREAD, *PW32THREAD;
struct tagIMC;
#ifdef __cplusplus
typedef struct _THREADINFO : _W32THREAD
{
@ -126,6 +128,10 @@ typedef struct _THREADINFO
INT iCursorLevel;
/* Last message cursor position */
POINT ptLast;
/* Input context-related */
struct _WND* spwndDefaultIme;
struct tagIMC* spDefaultImc;
HKL hklPrev;
INT cEnterCount;
/* Queue of messages posted to the queue. */

View file

@ -3932,8 +3932,9 @@ NtUserQueryWindow(HWND hWnd, DWORD Index)
#define GWLP_CONSOLE_LEADER_PID 0
#define GWLP_CONSOLE_LEADER_TID 4
PWND pWnd;
DWORD_PTR Result;
PWND pWnd, pwndActive;
PTHREADINFO pti, ptiActive;
DECLARE_RETURN(UINT);
TRACE("Enter NtUserQueryWindow\n");
@ -3996,19 +3997,33 @@ NtUserQueryWindow(HWND hWnd, DWORD Index)
Result = (pWnd->head.pti->MessageQueue == gpqForeground);
break;
case QUERY_WINDOW_DEFAULT_IME:
ERR("QUERY_WINDOW_DEFAULT_IME: FIXME\n");
Result = 0;
case QUERY_WINDOW_DEFAULT_IME: /* default IME window */
if (pWnd->head.pti->spwndDefaultIme)
Result = (DWORD_PTR)UserHMGetHandle(pWnd->head.pti->spwndDefaultIme);
else
Result = 0;
break;
case QUERY_WINDOW_DEFAULT_ICONTEXT:
ERR("QUERY_WINDOW_DEFAULT_ICONTEXT: FIXME\n");
Result = 0;
case QUERY_WINDOW_DEFAULT_ICONTEXT: /* default input context handle */
if (pWnd->head.pti->spDefaultImc)
Result = (DWORD_PTR)UserHMGetHandle(pWnd->head.pti->spDefaultImc);
else
Result = 0;
break;
case QUERY_WINDOW_ACTIVE_IME:
ERR("QUERY_WINDOW_ACTIVE_IME: FIXME\n");
Result = 0;
if (gpqForeground && gpqForeground->spwndActive)
{
pwndActive = gpqForeground->spwndActive;
pti = PsGetCurrentThreadWin32Thread();
if (pti->rpdesk == pwndActive->head.rpdesk)
{
ptiActive = pwndActive->head.pti;
if (ptiActive->spwndDefaultIme)
Result = (DWORD_PTR)UserHMGetHandle(ptiActive->spwndDefaultIme);
}
}
break;
default: