📄 regmon.c
字号:
if( ctx.itemPosition.right > rect.right + 11 ) {
return -1;
}
// Move and resize window
if( ctx.itemPosition.left - 5 + rect.right + 10 >
GetSystemMetrics(SM_CXFULLSCREEN) ) {
ctx.itemPosition.left = GetSystemMetrics(SM_CXFULLSCREEN) -
(rect.right+10);
}
MoveWindow( hDlg,
ctx.itemPosition.left+3, ctx.itemPosition.top,
rect.right + 6,
rect.bottom + 1,
TRUE );
// Adjust rectangle so text is centered
rect.left += 2;
rect.right += 2;
rect.top -= 1;
rect.bottom += 0;
// make it so this window doesn't get the focus
ShowWindow( hDlg, SW_SHOWNOACTIVATE );
break;
case WM_LBUTTONDBLCLK:
case WM_RBUTTONDBLCLK:
case WM_MBUTTONDBLCLK:
case WM_LBUTTONDOWN:
case WM_RBUTTONDOWN:
case WM_MBUTTONDOWN:
case WM_LBUTTONUP:
case WM_RBUTTONUP:
case WM_MBUTTONUP:
pts = MAKEPOINTS( lParam );
pt.x = (LONG) pts.x;
pt.y = (LONG) pts.y;
ClientToScreen( hDlg, &pt );
// pass this through to the listview
if( ScreenToClient( hWndList, &pt )) {
if( message == WM_LBUTTONDOWN ) {
// see if its a double click
newclicktime = GetTickCount();
if( pt.x == lastclickpt.x && pt.y == lastclickpt.y &&
newclicktime - lastclicktime < 300 ) {
message = WM_LBUTTONDBLCLK;
}
lastclicktime = newclicktime;
lastclickpt = pt;
}
PostMessage( hWndList, message, wParam, (SHORT) pt.y<<16 | (SHORT) pt.x );
}
break;
case WM_PAINT:
hdc = GetDC( hDlg );
// Set colors
SetTextColor( hdc, 0x00000000 );
SetBkMode( hdc, TRANSPARENT );
SelectObject( hdc, hfont );
DrawText( hdc, ctx.itemText, -1, &rect,
DT_NOCLIP|DT_LEFT|DT_NOPREFIX|DT_WORDBREAK );
break;
case WM_DESTROY:
hBalloon = NULL;
break;
case WM_CLOSE:
DestroyWindow( hDlg );
break;
}
return DefWindowProc( hDlg, message, wParam, lParam );
}
/******************************************************************************
*
* FUNCTION: FindInListview:
*
* PURPOSE: Searches for a string in the listview. Note: its okay if
* items are being added to the list view or the list view
* is cleared while this search is in progress - the effect
* is harmless.
*
*****************************************************************************/
BOOLEAN FindInListview(HWND hWnd, LPFINDREPLACE FindInfo )
{
int currentItem;
DWORD i;
int subitem, numItems;
TCHAR fieldtext[256];
BOOLEAN match = FALSE;
TCHAR errmsg[256];
BOOLEAN goUp;
// get the search direction
goUp = ((FindInfo->Flags & FR_DOWN) == FR_DOWN);
// initialize stuff
if( !(numItems = ListView_GetItemCount( hWndList ))) {
MessageBox( hWnd, _T("No items to search"), _T("Regmon"),
MB_OK|MB_ICONWARNING );
SetForegroundWindow( hWndFind );
return FALSE;
}
// find the item with the focus
currentItem = ListView_GetNextItem( hWndList, 0, LVNI_SELECTED );
// if no current item, start at the top or the bottom
if( currentItem == -1 ) {
if( goUp )
currentItem = 0;
else {
if( PrevMatch ) {
sprintf(errmsg, _T("Cannot find string \"%s\""), FindInfo->lpstrFindWhat );
MessageBox( hWnd, errmsg, _T("Regmon"), MB_OK|MB_ICONWARNING );
SetForegroundWindow( hWndFind );
return FALSE;
}
currentItem = numItems;
}
}
// if we're continuing a search, start with the next item
if( PrevMatch && !strcmp( FindString, PrevMatchString ) ) {
if( goUp ) currentItem++;
else currentItem--;
if( (!goUp && currentItem < 0) ||
(goUp && currentItem >= numItems )) {
sprintf(errmsg, _T("Cannot find string \"%s\""), FindInfo->lpstrFindWhat );
MessageBox( hWnd, errmsg, _T("Regmon"), MB_OK|MB_ICONWARNING );
SetForegroundWindow( hWndFind );
return FALSE;
}
}
// loop through each item looking for the string
while( 1 ) {
// get the item text
for( subitem = 0; subitem < NUMCOLUMNS; subitem++ ) {
fieldtext[0] = 0;
ListView_GetItemText( hWndList, currentItem, subitem, fieldtext, MAX_PATH );
// make sure enought string for a match
if( strlen( fieldtext ) < strlen( FindInfo->lpstrFindWhat ))
continue;
// do a scan all the way through for the substring
if( FindInfo->Flags & FR_WHOLEWORD ) {
i = 0;
while( fieldtext[i] ) {
while( fieldtext[i] && fieldtext[i] != ' ' ) i++;
if( FindInfo->Flags & FR_MATCHCASE )
match = !strcmp( fieldtext, FindInfo->lpstrFindWhat );
else
match = !stricmp( fieldtext, FindInfo->lpstrFindWhat );
if( match) break;
i++;
}
} else {
for( i = 0; i < strlen( fieldtext ) - strlen(FindInfo->lpstrFindWhat)+1; i++ ) {
if( FindInfo->Flags & FR_MATCHCASE )
match = !strncmp( &fieldtext[i], FindInfo->lpstrFindWhat,
strlen(FindInfo->lpstrFindWhat) );
else
match = !strnicmp( &fieldtext[i], FindInfo->lpstrFindWhat,
strlen(FindInfo->lpstrFindWhat) );
if( match ) break;
}
}
if( match ) {
strcpy( PrevMatchString, FindInfo->lpstrFindWhat );
PrevMatch = TRUE;
ListView_SetItemState( hWndList, currentItem,
LVIS_SELECTED|LVIS_FOCUSED,
LVIS_SELECTED|LVIS_FOCUSED );
ListView_EnsureVisible( hWndList, currentItem, FALSE );
SetFocus( hWndList );
return TRUE;
}
}
currentItem = currentItem + (goUp ? 1:-1);
if( !currentItem || currentItem == numItems+1 ) {
// end of the road
break;
}
}
sprintf(errmsg, _T("Cannot find string \"%s\""), FindInfo->lpstrFindWhat );
MessageBox( hWnd, errmsg, _T("Regmon"), MB_OK|MB_ICONWARNING );
SetForegroundWindow( hWndFind );
return FALSE;
}
/******************************************************************************
*
* FUNCTION: PopFindDialog:
*
* PURPOSE: Calls the find message dialog box.
*
*****************************************************************************/
void PopFindDialog(HWND hWnd)
{
strcpy( FindString, PrevMatchString );
FindTextInfo.lStructSize = sizeof( FindTextInfo );
FindTextInfo.hwndOwner = hWnd;
FindTextInfo.hInstance = (HANDLE)hInst;
FindTextInfo.lpstrFindWhat = FindString;
FindTextInfo.lpstrReplaceWith = NULL;
FindTextInfo.wFindWhatLen = sizeof(FindString);
FindTextInfo.wReplaceWithLen = 0;
FindTextInfo.lCustData = 0;
FindTextInfo.Flags = FindFlags;
FindTextInfo.lpfnHook = (LPFRHOOKPROC)(FARPROC)NULL;
FindTextInfo.lpTemplateName = NULL;
if ((hWndFind = FindText(&FindTextInfo)) == NULL)
MessageBox( hWnd, _T("Unable to create Find dialog"), _T("Regmon"), MB_OK|MB_ICONERROR );
}
/******************************************************************************
*
* FUNCTION: Get_Position_Settings
*
* PURPOSE: Reads the Registry to get the last-set window position.
*
******************************************************************************/
VOID Get_Position_Settings()
{
HKEY hKey;
DWORD ParamSize;
POSITION_SETTINGS regPositionInfo;
// Fist, set the default settings
PositionInfo.top = CW_USEDEFAULT;
PositionInfo.left = CW_USEDEFAULT;
PositionInfo.width = CW_USEDEFAULT;
PositionInfo.height = CW_USEDEFAULT;
PositionInfo.maximized = FALSE;
PositionInfo.ontop = FALSE;
// set the default listview widths
PositionInfo.column[0] = 35;
PositionInfo.column[1] = 90;
PositionInfo.column[2] = 130;
PositionInfo.column[3] = 200;
PositionInfo.column[4] = 70;
PositionInfo.column[5] = 150;
// Initialize the filter
sprintf( PositionInfo.filter.processfilter, "*" );
strcpy( PositionInfo.filter.processexclude, "" );
sprintf( PositionInfo.filter.pathfilter, "*" );
sprintf( PositionInfo.filter.excludefilter, "" );
PositionInfo.filter.logsuccess = TRUE;
PositionInfo.filter.logerror = TRUE;
PositionInfo.filter.logreads = TRUE;
PositionInfo.filter.logwrites = TRUE;
// set the default history depth (infinite)
PositionInfo.historydepth = 0;
// first, get the last-entered params from the registry
RegCreateKey(HKEY_CURRENT_USER,
_T("Software\\Systems Internals\\Regmon"),
&hKey );
// get the params and ignore errors
ParamSize = sizeof( PositionInfo );
RegQueryValueEx( hKey,_T("Settings"), NULL, NULL, (LPBYTE) ®PositionInfo,
&ParamSize );
RegCloseKey( hKey );
// only use the registry settings if the version matches
if( regPositionInfo.posversion == POSVERSION ) PositionInfo = regPositionInfo;
// extract the history depth
MaxLines = PositionInfo.historydepth;
OnTop = PositionInfo.ontop;
// initialize filter
FilterDefinition = PositionInfo.filter;
}
/******************************************************************************
*
* FUNCTION: Save_Position_Settings
*
* PURPOSE: Saves the current window settings to the Registry.
*
******************************************************************************/
VOID Save_Position_Settings( HWND hWnd )
{
RECT rc;
int i;
HKEY hKey;
// set version #
PositionInfo.posversion = POSVERSION;
// get the position of the main window
GetWindowRect( hWnd, &rc );
if( !IsIconic( hWnd )) {
PositionInfo.left = rc.left;
PositionInfo.top = rc.top;
PositionInfo.width = rc.right - rc.left;
PositionInfo.height = rc.bottom - rc.top;
}
PositionInfo.maximized = IsZoomed( hWnd );
PositionInfo.ontop = OnTop;
// get the widths of the listview columns
for( i = 0; i < NUMCOLUMNS; i++ ) {
PositionInfo.column[i] = ListView_GetColumnWidth( hWndList, i );
}
// get the history depth
PositionInfo.historydepth = MaxLines;
// save filters
PositionInfo.filter = FilterDefinition;
// save connection info to registry
RegOpenKey(HKEY_CURRENT_USER,
_T("Software\\Systems Internals\\Regmon"),
&hKey );
RegSetValueEx( hKey, _T("Settings"), 0, REG_BINARY, (LPBYTE) &PositionInfo,
sizeof( PositionInfo ) );
RegCloseKey( hKey );
}
/******************************************************************************
*
* FUNCTION: Split
*
* PURPOSE: Split a delimited line into components
*
******************************************************************************/
int Split( char * line, char delimiter, char * items[] )
{
int cnt = 0;
for (;;) {
// Add prefix to list of components
items[cnt++] = line;
// Check for more components
line = strchr( line, delimiter );
if ( line == NULL )
return cnt;
// Terminate previous component and move to next
*line++ = '\0';
}
}
/******************************************************************************
*
* FUNCTION: ListAppend
*
* PURPOSE: Add a new line to List window
*
******************************************************************************/
BOOL List_Append( HWND hWndList, DWORD seq, char * line )
{
LV_ITEM lvI; // list view item structure
int row;
char * items[20];
int itemcnt = 0;
// 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] ) {
wsprintf( 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 ) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -