[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; PVOID pSelf;
} THRDESKHEAD, *PTHRDESKHEAD; } THRDESKHEAD, *PTHRDESKHEAD;
typedef struct tagIMC
{
THRDESKHEAD head;
struct tagIMC *pImcNext;
ULONG_PTR dwClientImcData;
HWND hImeWnd;
} IMC, *PIMC;
typedef struct _PROCDESKHEAD typedef struct _PROCDESKHEAD
{ {
HEAD; HEAD;

View file

@ -75,6 +75,8 @@ typedef struct _W32THREAD
PVOID pUMPDObj; PVOID pUMPDObj;
} W32THREAD, *PW32THREAD; } W32THREAD, *PW32THREAD;
struct tagIMC;
#ifdef __cplusplus #ifdef __cplusplus
typedef struct _THREADINFO : _W32THREAD typedef struct _THREADINFO : _W32THREAD
{ {
@ -126,6 +128,10 @@ typedef struct _THREADINFO
INT iCursorLevel; INT iCursorLevel;
/* Last message cursor position */ /* Last message cursor position */
POINT ptLast; POINT ptLast;
/* Input context-related */
struct _WND* spwndDefaultIme;
struct tagIMC* spDefaultImc;
HKL hklPrev;
INT cEnterCount; INT cEnterCount;
/* Queue of messages posted to the queue. */ /* 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_PID 0
#define GWLP_CONSOLE_LEADER_TID 4 #define GWLP_CONSOLE_LEADER_TID 4
PWND pWnd;
DWORD_PTR Result; DWORD_PTR Result;
PWND pWnd, pwndActive;
PTHREADINFO pti, ptiActive;
DECLARE_RETURN(UINT); DECLARE_RETURN(UINT);
TRACE("Enter NtUserQueryWindow\n"); TRACE("Enter NtUserQueryWindow\n");
@ -3996,19 +3997,33 @@ NtUserQueryWindow(HWND hWnd, DWORD Index)
Result = (pWnd->head.pti->MessageQueue == gpqForeground); Result = (pWnd->head.pti->MessageQueue == gpqForeground);
break; break;
case QUERY_WINDOW_DEFAULT_IME: case QUERY_WINDOW_DEFAULT_IME: /* default IME window */
ERR("QUERY_WINDOW_DEFAULT_IME: FIXME\n"); if (pWnd->head.pti->spwndDefaultIme)
Result = 0; Result = (DWORD_PTR)UserHMGetHandle(pWnd->head.pti->spwndDefaultIme);
else
Result = 0;
break; break;
case QUERY_WINDOW_DEFAULT_ICONTEXT: case QUERY_WINDOW_DEFAULT_ICONTEXT: /* default input context handle */
ERR("QUERY_WINDOW_DEFAULT_ICONTEXT: FIXME\n"); if (pWnd->head.pti->spDefaultImc)
Result = 0; Result = (DWORD_PTR)UserHMGetHandle(pWnd->head.pti->spDefaultImc);
else
Result = 0;
break; break;
case QUERY_WINDOW_ACTIVE_IME: case QUERY_WINDOW_ACTIVE_IME:
ERR("QUERY_WINDOW_ACTIVE_IME: FIXME\n");
Result = 0; 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; break;
default: default: