- Implement ReplyMessage and kernel support for InSendMessage and GetMessageTime.

svn path=/trunk/; revision=40820
This commit is contained in:
James Tabor 2009-05-06 18:49:53 +00:00
parent b107dc759a
commit 9a36bd47a2
5 changed files with 33 additions and 10 deletions

View file

@ -1071,6 +1071,7 @@ GetMessageTime(VOID)
{ {
PUSER32_THREAD_DATA ThreadData = User32GetThreadData(); PUSER32_THREAD_DATA ThreadData = User32GetThreadData();
return(ThreadData->LastMessage.time); return(ThreadData->LastMessage.time);
// return NtUserGetThreadState(THREADSTATE_GETMESSAGETIME);
} }
@ -1090,8 +1091,7 @@ InSendMessage(VOID)
return TRUE; return TRUE;
} }
} }
return FALSE; return(NtUserGetThreadState(THREADSTATE_INSENDMESSAGE) != ISMEX_NOSEND);
/* return(NtUserGetThreadState(THREADSTATE_INSENDMESSAGE) != ISMEX_NOSEND);*/
} }
@ -1105,23 +1105,22 @@ InSendMessageEx(
{ {
PCLIENTTHREADINFO pcti = GetWin32ClientInfo()->pClientThreadInfo; PCLIENTTHREADINFO pcti = GetWin32ClientInfo()->pClientThreadInfo;
// FIXME("ISMEX %x\n",pcti); // FIXME("ISMEX %x\n",pcti);
if (pcti && !(pcti->CTI_flags & CTI_INSENDMESSAGE)) return ISMEX_NOSEND; if (pcti && !(pcti->CTI_flags & CTI_INSENDMESSAGE))
return ISMEX_NOSEND;
else else
/* return NtUserGetThreadState(THREADSTATE_INSENDMESSAGE); */ return NtUserGetThreadState(THREADSTATE_INSENDMESSAGE);
return 0;
} }
/* /*
* @unimplemented * @implemented
*/ */
BOOL BOOL
WINAPI WINAPI
ReplyMessage( ReplyMessage(
LRESULT lResult) LRESULT lResult)
{ {
UNIMPLEMENTED; return NtUserCallOneParam(lResult, ONEPARAM_ROUTINE_REPLYMESSAGE);
return FALSE;
} }

View file

@ -1721,7 +1721,8 @@ enum ThreadStateRoutines
THREADSTATE_ACTIVEWINDOW, THREADSTATE_ACTIVEWINDOW,
THREADSTATE_CAPTUREWINDOW, THREADSTATE_CAPTUREWINDOW,
THREADSTATE_PROGMANWINDOW, THREADSTATE_PROGMANWINDOW,
THREADSTATE_TASKMANWINDOW THREADSTATE_TASKMANWINDOW,
THREADSTATE_GETMESSAGETIME
}; };
DWORD DWORD

View file

@ -38,6 +38,7 @@ typedef struct _THREADINFO
PDESKTOPINFO pDeskInfo; PDESKTOPINFO pDeskInfo;
PCLIENTINFO pClientInfo; PCLIENTINFO pClientInfo;
FLONG TIF_flags; FLONG TIF_flags;
LONG timeLast;
HANDLE hDesktop; HANDLE hDesktop;
UINT cPaintsReady; /* Count of paints pending. */ UINT cPaintsReady; /* Count of paints pending. */
UINT cTimersReady; /* Count of timers pending. */ UINT cTimersReady; /* Count of timers pending. */

View file

@ -1359,7 +1359,7 @@ UserPostMessage(HWND Wnd,
IntGetCursorLocation(pti->Desktop->WindowStation, IntGetCursorLocation(pti->Desktop->WindowStation,
&KernelModeMsg.pt); &KernelModeMsg.pt);
KeQueryTickCount(&LargeTickCount); KeQueryTickCount(&LargeTickCount);
KernelModeMsg.time = MsqCalculateMessageTime(&LargeTickCount); pti->timeLast = KernelModeMsg.time = MsqCalculateMessageTime(&LargeTickCount);
MsqPostMessage(Window->MessageQueue, &KernelModeMsg, MsqPostMessage(Window->MessageQueue, &KernelModeMsg,
NULL != MsgMemoryEntry && 0 != KernelModeMsg.lParam, NULL != MsgMemoryEntry && 0 != KernelModeMsg.lParam,
QS_POSTMESSAGE); QS_POSTMESSAGE);

View file

@ -96,6 +96,28 @@ NtUserGetThreadState(
RETURN( (DWORD)GetW32ThreadInfo()->pDeskInfo->hTaskManWindow); RETURN( (DWORD)GetW32ThreadInfo()->pDeskInfo->hTaskManWindow);
case THREADSTATE_ACTIVEWINDOW: case THREADSTATE_ACTIVEWINDOW:
RETURN ( (DWORD)UserGetActiveWindow()); RETURN ( (DWORD)UserGetActiveWindow());
case THREADSTATE_INSENDMESSAGE:
{
DWORD Ret = ISMEX_NOSEND;
PUSER_MESSAGE_QUEUE MessageQueue =
((PTHREADINFO)PsGetCurrentThreadWin32Thread())->MessageQueue;
DPRINT1("THREADSTATE_INSENDMESSAGE\n");
if (!IsListEmpty(&MessageQueue->SentMessagesListHead))
{
Ret = ISMEX_SEND;
}
else if (!IsListEmpty(&MessageQueue->NotifyMessagesListHead))
{
/* FIXME Need to set message flag when in callback mode with notify */
Ret = ISMEX_NOTIFY;
}
/* FIXME Need to set message flag if replied to or ReplyMessage */
RETURN( Ret);
}
case THREADSTATE_GETMESSAGETIME:
/* FIXME Needs more work! */
RETURN( ((PTHREADINFO)PsGetCurrentThreadWin32Thread())->timeLast);
} }
RETURN( 0); RETURN( 0);