📄 filemon.c
字号:
char *secondsPtr;
FILETIME localTime;
SYSTEMTIME systemTime;
int msIndex;
// Split line into columns
itemcnt = Split( line, '\t', items );
if ( itemcnt == 0 )
return FALSE;
// Determine row number for request
if ( *items[0] ) {
// Its a new request. Put at end.
row = 0x7FFFFFFF;
} else {
// Its a status. Locate its associated request.
lvI.mask = LVIF_PARAM;
lvI.iSubItem = 0;
for ( row = ListView_GetItemCount(hWndList) - 1; row >= 0; --row ) {
lvI.iItem = row;
if ( ListView_GetItem( hWndList, &lvI ) && (DWORD)lvI.lParam == seq )
break;
}
if ( row == -1 )
// No request associated with status.
return FALSE;
}
// Sequence number if a new item
if ( *items[0] ) {
_stprintf( msgbuf, _T("%d"), seq );
lvI.mask = LVIF_TEXT | LVIF_PARAM;
lvI.iItem = row;
lvI.iSubItem = 0;
lvI.pszText = msgbuf;
lvI.cchTextMax = lstrlen( lvI.pszText ) + 1;
lvI.lParam = seq;
row = ListView_InsertItem( hWndList, &lvI );
if ( row == -1 ) {
_stprintf( msgbuf, _T("Error adding item %d to list view"), seq );
MessageBox( hWndList, msgbuf, APPNAME, MB_OK|MB_ICONERROR );
return FALSE;
}
LastRow = row;
}
if( !TimeIsDuration ) {
// no timestamp for completions
if( dateTime ) {
if( IsNT ) {
FileTimeToLocalFileTime( (PFILETIME) &dateTime, &localTime );
FileTimeToSystemTime( &localTime, &systemTime );
} else {
DosDateTimeToFileTime( (WORD) (dateTime >> 48), (WORD) (dateTime >> 32), &localTime );
FileTimeToSystemTime( &localTime, &systemTime );
systemTime.wSecond += ((WORD) dateTime) / 1000;
systemTime.wMilliseconds = ((WORD) dateTime) % 1000;
}
GetTimeFormat( LOCALE_USER_DEFAULT, 0,
&systemTime, NULL, timeBuf, 64 );
if( ShowMs ) {
secondsPtr = strrchr( timeBuf, ':');
msIndex = (DWORD) (secondsPtr - timeBuf);
while( timeBuf[msIndex] && timeBuf[msIndex] != ' ') msIndex++;
strcpy( timeSub, &timeBuf[msIndex] );
timeBuf[ msIndex ] = 0;
sprintf( msgbuf, "%s.%03d%s", timeBuf, systemTime.wMilliseconds, timeSub );
} else {
strcpy( msgbuf, timeBuf );
}
ListView_SetItemText( hWndList, row, 1, msgbuf );
}
} else {
if( IsNT ) {
elapsed = ((float) perfTime)/(float)PerfFrequency.QuadPart;
sprintf( msgbuf, "%10.8f", elapsed );
} else {
sprintf( msgbuf, "%10.8f", (float) perfTime * 0.8 / 1e6);
}
ListView_SetItemText( hWndList, row, 1, msgbuf );
}
// Process name
if ( itemcnt>0 && *items[0] ) {
ListView_SetItemText( hWndList, row, 2, items[0] );
}
// Request type
if ( itemcnt>1 && *items[1] ) {
ListView_SetItemText( hWndList, row, 3, items[1] );
}
// Path
if ( itemcnt>2 && *items[2] ) {
ListView_SetItemText( hWndList, row, 4, items[2] );
}
// Result
if ( itemcnt>4 && *items[4] ) {
ListView_SetItemText( hWndList, row, 5, items[4] );
}
// Additional
if ( itemcnt>3 && *items[3] ) {
ListView_SetItemText( hWndList, row, 6, items[3] );
}
return TRUE;
}
/******************************************************************************
*
* FUNCTION: UpdateStatistics
*
* PURPOSE: Clear the statistics window and refill it with the current
* contents of the statistics buffer. Does not refresh the
* buffer from the device driver.
*
******************************************************************************/
void UpdateStatistics( HWND hWnd, HWND hList, BOOL Clear )
{
PENTRY ptr;
BOOLEAN itemsAdded = FALSE;
int totitems, i;
// Just return if nothing to do
if ( !Clear && StatsLen < sizeof(int)+2 )
return;
// post hourglass icon
if( !IsNT ) {
hSaveCursor = SetCursor(hHourGlass);
SendMessage(hList, WM_SETREDRAW, FALSE, 0);
}
// Start with empty list
if( Clear ) {
if( IsNT ) {
ListView_DeleteAllItems( hList );
} else {
// Win9x listview clear (or delete) is *very* slow
Deleting = TRUE;
totitems = ListView_GetItemCount( hList );
for(i = 0; i < totitems; i++) {
ListView_DeleteItem( hList, 0 );
}
Deleting = FALSE;
}
LastRow = 0;
}
// Add all List items from Stats[] data
for ( ptr = (void *)Stats; (char *)ptr < min(Stats+StatsLen,Stats + sizeof (Stats)); ) {
// Add to list
size_t len = strlen(ptr->text);
itemsAdded |= ListAppend( hList, ptr->seq, ptr->perftime.QuadPart,
ptr->datetime.QuadPart, ptr->text );
if( IsNT ) {
len += 4; len &= 0xFFFFFFFC; // +1 for null-terminator +3 for 32bit alignment
ptr = (void *)(ptr->text + len);
} else
ptr = (void *)(ptr->text + len + 1);
}
// Empty the buffer
StatsLen = 0;
// only do stuff if we added stuff
if( itemsAdded ) {
// limit number of lines saved
if (MaxLines) {
SendMessage(hList, WM_SETREDRAW, FALSE, 0);
while ( LastRow > MaxLines ) {
ListView_DeleteItem ( hList, 0 );
LastRow--;
}
SendMessage(hList, WM_SETREDRAW, TRUE, 0);
}
// Scroll so newly added items are visible
if ( Autoscroll ) {
if( hBalloon ) DestroyWindow( hBalloon );
ListView_EnsureVisible( hList, ListView_GetItemCount(hList)-1, FALSE );
}
}
if( !IsNT) {
SendMessage(hList, WM_SETREDRAW, TRUE, 0);
InvalidateRect( hList, NULL, FALSE );
SetCursor( hSaveCursor );
}
}
/****************************************************************************
*
* FUNCTION: CalcStringEllipsis
*
* PURPOSE: Determines if an item will fit in a listview row, and if
* not, attaches the appropriate number of '.' to a truncated
* version.
*
****************************************************************************/
BOOL WINAPI CalcStringEllipsis (HDC hdc,
LPTSTR szString,
int cchMax,
UINT uColWidth)
{
static TCHAR szEllipsis3[] = TEXT("...");
static TCHAR szEllipsis2[] = TEXT("..");
static TCHAR szEllipsis1[] = TEXT(".");
SIZE sizeString;
SIZE sizeEllipsis3, sizeEllipsis2, sizeEllipsis1;
int cbString;
LPTSTR lpszTemp;
// Adjust the column width to take into account the edges
uColWidth -= 4;
// Allocate a string for us to work with. This way we can mangle the
// string and still preserve the return value
lpszTemp = (LPTSTR)HeapAlloc (GetProcessHeap(), HEAP_ZERO_MEMORY, cchMax);
if (!lpszTemp) return FALSE;
lstrcpy (lpszTemp, szString);
// Get the width of the string in pixels
cbString = lstrlen(lpszTemp);
if (!GetTextExtentPoint32 (hdc, lpszTemp, cbString, &sizeString)) {
HeapFree (GetProcessHeap(), 0, (LPVOID)lpszTemp);
return FALSE;
}
// If the width of the string is greater than the column width shave
// the string and add the ellipsis
if ((ULONG)sizeString.cx > uColWidth) {
if (!GetTextExtentPoint32 (hdc,
szEllipsis3,
lstrlen(szEllipsis3),
&sizeEllipsis3)) {
HeapFree (GetProcessHeap(), 0, (LPVOID)lpszTemp);
return FALSE;
}
if (!GetTextExtentPoint32 (hdc,
szEllipsis2,
lstrlen(szEllipsis2),
&sizeEllipsis2)) {
HeapFree (GetProcessHeap(), 0, (LPVOID)lpszTemp);
return FALSE;
}
if (!GetTextExtentPoint32 (hdc,
szEllipsis1,
lstrlen(szEllipsis1),
&sizeEllipsis1)) {
HeapFree (GetProcessHeap(), 0, (LPVOID)lpszTemp);
return FALSE;
}
while (cbString > 0) {
lpszTemp[--cbString] = 0;
if (!GetTextExtentPoint32 (hdc, lpszTemp, cbString, &sizeString)) {
HeapFree (GetProcessHeap(), 0, (LPVOID)lpszTemp);
return FALSE;
}
if ((ULONG)(sizeString.cx + DOTOFFSET + sizeEllipsis3.cx) <= uColWidth) {
break;
}
}
lpszTemp[0] = szString[0];
if((ULONG)(sizeString.cx + DOTOFFSET + sizeEllipsis3.cx) <= uColWidth) {
lstrcat (lpszTemp, szEllipsis3);
} else if((ULONG)(sizeString.cx + DOTOFFSET + sizeEllipsis2.cx) <= uColWidth) {
lstrcat (lpszTemp, szEllipsis2);
} else if((ULONG)(sizeString.cx + DOTOFFSET + sizeEllipsis1.cx) <= uColWidth) {
lstrcat (lpszTemp, szEllipsis1);
} else {
lpszTemp[0] = szString[0];
}
lstrcpy (szString, lpszTemp);
HeapFree (GetProcessHeap(), 0, (LPVOID)lpszTemp);
return TRUE;
} else {
HeapFree (GetProcessHeap(), 0, (LPVOID)lpszTemp);
return TRUE;
}
HeapFree (GetProcessHeap(), 0, (LPVOID)lpszTemp);
return FALSE;
}
/****************************************************************************
*
* FUNCTION: DrawItemColumn
*
* PURPOSE: Draws text to the listview.
*
****************************************************************************/
void WINAPI DrawItemColumn (HDC hdc, LPTSTR szText, LPRECT prcClip)
{
TCHAR szString[MAXITEMLENGTH];
// Check to see if the string fits in the clip rect. If not, truncate
// the string and add "...".
lstrcpy(szString, szText);
CalcStringEllipsis (hdc, szString, sizeof( szString ), prcClip->right - prcClip->left);
ExtTextOut (hdc,
prcClip->left + 2,
prcClip->top + 1,
ETO_CLIPPED | ETO_OPAQUE,
prcClip,
szString,
lstrlen(szString),
NULL);
}
/****************************************************************************
*
* FUNCTION: DrawListViewItem
*
* PURPOSE: Handles a request from Windows to draw one of the lines
* in the listview window.
*
****************************************************************************/
void DrawListViewItem(LPDRAWITEMSTRUCT lpDrawItem)
{
TCHAR colString[NUMCOLUMNS][MAXITEMLENGTH];
BOOLEAN highlight = FALSE;
LV_ITEM lvi;
RECT rcClip;
int iColumn;
DWORD width, leftOffset;
UINT uiFlags = ILD_TRANSPARENT;
// Get the item image to be displayed
lvi.mask = LVIF_IMAGE | LVIF_STATE;
lvi.iItem = lpDrawItem->itemID;
lvi.iSubItem = 0;
ListView_GetItem(lpDrawItem->hwndItem, &lvi);
// Get the column text and see if there is a highlight
for( iColumn = 0; iColumn < NUMCOLUMNS; iColumn++ ) {
colString[iColumn][0] = 0;
ListView_GetItemText( hWndList, lpDrawItem->itemID,
iColumn, colString[iColumn],
MAXITEMLENGTH);
if( !highlight && iColumn != 0) {
highlight = MatchWithHighlightPattern( colString[iColumn] );
}
}
// Check to see if this item is selected
if (lpDrawItem->itemState & ODS_SELECTED) {
// Set the text background and foreground colors
SetTextColor(lpDrawItem->hDC, GetSysColor(COLOR_HIGHLIGHTTEXT));
SetBkColor(lpDrawItem->hDC, GetSysColor(COLOR_HIGHLIGHT));
// Also add the ILD_BLEND50 so the images come out selected
uiFlags |= ILD_BLEND50;
} else {
// Set the text background and foreground colors to the standard window
// colors
if( highlight ) {
SetTextColor(lpDrawItem->hDC, HighlightFg );
SetBkColor(lpDrawItem->hDC, HighlightBg );
} else {
SetTextColor(lpDrawItem->hDC, GetSysColor(COLOR_WINDOWTEXT));
SetBkColor(lpDrawItem->hDC, GetSysColor(COLOR_WINDOW));
}
}
// Set up the new clipping rect for the first column text and draw it
leftOffset = 0;
for( iColumn = 0; iColumn< NUMCOLUMNS; iColumn++ ) {
width = ListView_GetColumnWidth( hWndList, iColumn );
rcClip.left = lpDrawItem->rcItem.left + leftOffset;
rcClip.right = lpDrawItem->rcItem.left + leftOffset + width;
rcClip.top = lpDrawItem->rcItem.top;
rcClip.bottom = lpDrawItem->rcItem.bottom;
DrawItemColumn(lpDrawItem->hDC, colString[iColumn], &rcClip);
leftOffset += width;
}
// If we changed the colors for the selected item, undo it
if (lpDrawItem->itemState & ODS_SELECTED) {
// Set the text background and foreground colors
SetTextColor(lpDrawItem->hDC, GetSysColor(COLOR_WINDOWTEXT));
SetBkColor(lpDrawItem->hDC, GetSysColor(COLOR_WINDOW));
}
// If the item is focused, now draw a focus rect around the entire row
if (lpDrawItem->itemState & ODS_FOCUS)
{
// Adjust the left edge to exclude the image
rcClip = lpDrawItem->rcItem;
// Draw the focus rect
DrawFocusRect(lpDrawItem->hDC, &rcClip);
}
}
/****************************************************************************
*
* FUNCTION: ListViewSubclass(HWND,UINT,WPARAM)
*
* PURPOSE: Subclasses the listview so that we can do tooltips
*
****************************************************************************/
LRESULT CALLBACK ListViewSubclass(HWND hWnd, UINT uMsg, WPARAM wParam,
LPARAM lParam)
{
ITEM_CLICK itemClick;
LVHITTESTINFO hitItem;
static initTrack = FALSE;
POINT hitPoint, topleftPoint, bottomrightPoint;
RECT listRect;
static POINTS mousePosition;
if( !initTrack ) {
SetTimer( hWnd, 2, BALLOONDELAY, NULL );
initTrack = TRUE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -