试试这个程序<br>只有一个dpr文件<br>你编译看看<br><br>// Win Inspector by DeK_OiN<br><br><br>program WinInspector;<br><br>uses<br> Windows,<br> Messages, SysUtils;<br><br>{$R *.RES}<br><br>var<br> GroupBox1, Fuente, Handle, About, Instancia,<br> lcPosX, lcPosY, cPosX, cPosY, LabelHandle, eHandle,<br> wNLabel, wName, cWLabel, cWindow, IDLabel, eThreadID: Integer;<br> Clase: TWndClassA;<br> Mensaje: TMsg;<br><br>// Esta procedure ser?llamada cada 1 milisegundo por el Timer que creamos<br>// con SetTimer. Adem醩 de eso, esto es lo que le da una utilidad al prog
<br><br>procedure Timer;<br>var<br> cPos: TPoint;<br> hWnd: THandle;<br> wText: PChar;<br> WinClass: array[0..80] of Char;<br> stri:string;<br>begin<br> GetCursorPos(cPos); //Capturamos la posici髇 del cursor en la variabe cPos<br> SetWindowText(cPosX, PChar(IntToStr(cPos.X))); //Ponemos el X de la pos. del cursor en el edit,<br> //recuerda que estamos con la API y no podemos<br> //hacer Edit1.Text := X sino que tenemos que<br> //llamar a la API SetWindowText
<br><br><br><br><br><br> SetWindowText(cPosY, PChar(IntToStr(cPos.Y))); //Ponemos el Y de la pos. del cursor en el edit<br><br><br> SetWindowText(cposx,pchar( inttohex( GetPixel(GetDC(0),cpos.X,cpos.y) , 2)  
 
;<br><br><br><br>//trabajaremos con handle de la ventana que est?debajo del cursor del mouse<br> hWnd := WindowFromPoint(cPos);<br><br> SetWindowText(eHandle, PChar(IntToHex(hWnd, 2))); //Mostramos el handle en el edit, ya pasado a base<br> //16 (o sea, hexadecimal)<br><br> GetMem(wText, GetWindowTextLength(hWnd) + 1);<br> GetWindowText(hWnd, wText, GetWindowTextLength(hWnd) + 1); // extraemos el texto de la ventana que est?<br> // debajo del cursor<br> SetWindowText(wName, wText); // y lo mostramos en el edit<br><br> SetWindowText(eThreadID, PChar(IntToHex(GetWindowThreadProcessID(hWnd, nil), 8)));<br><br><br> GetClassName(hWnd, WinClass, SizeOf(WinClass)); // obtenemos el class de la ventana y lo metemos en la variable WinClass<br> SetWindowText(cWindow, WinClass); // mostramos el class obtenido en el edit<br><br>end;<br><br>// Procedure para salir nuestro programa sin dejar rastros en la memoria
<br><br>procedure Salir;<br>begin<br> DeleteObject(Fuente); //liberamos los recursos del sistema asociados a nuesta fuente<br> UnRegisterClass('DeKOiN', Instancia); //removemos el class de la memoria<br> ExitProcess(Instancia); //finalmente terminamos el proceso<br>end;<br><br>procedure MostrarAbout;<br>var<br> Parametros: TMsgBoxParams;<br>begin<br>// Definimos los par醡etros del MessageBoxIndirect<br> with Parametros do<br> begin<br> cbSize := SizeOf(Parametros);<br> hwndOwner := handle;<br> hInstance := Instancia;<br> lpszText := 'Mini-WinIdentifier by DeK_OiN' + #13#10 +<br> 'Programado en Delphi 5, usando solo la API de Windows, haciendo' + #13 +<br> 'el ejecutable de unos 45 kbs y comprimido con UPX de unos 23kbs
' + #13 + #13 +<br> 'Por cierto, queda a 45 kbs por que uso las SysUtils xD';<br> lpszCaption := 'Acerca de Mini-WinIdentifer';<br> dwStyle := MB_OK or MB_USERICON;<br> lpszIcon := 'MAINICON';<br> dwContextHelpId := 0;<br> lpfnMsgBoxCallback := nil;<br> dwLanguageId := LANG_NEUTRAL;<br> end;<br> MessageBoxIndirect(Parametros); //Finalmente lo mostramos<br>end;<br><br><br>// WindowProc, procesamos todos los WindowMessages que nos env韆n...<br><br>function WindowProc(hWnd, uMsg, wParam, lParam: Integer): Integer; stdcall;<br>begin<br>// Llamamos a la procedure por defecto de Windows, para tambi閚 procesar<br>// los dem醩 mensajes que nuestra aplicaci髇 reciba. As?garantizamos que<br>// TODOS los mensajes que nos env韊n sean procesados. Haz la prueba, quita<br>// esta l韓ea y ver醩 que ni siquiera el WM_PAINT se procesa
<br> Result := DefWindowProc(hWnd, uMsg, wParam, lParam);<br><br>//Ahora nos vamos a los mensajes m醩 espec韋icos<br> case uMsg of<br> WM_Destroy: Salir; //Si han presionado la X para salir<br> //llamamos a nuestra procedure para<br> //liberar los recursos del sistema<br> WM_TIMER: Timer; //Si nos mandan el mensaje WM_TIMER<br> //(el cual se mandar?cada 1 milisegundo -<br> //el interval del timer que creamos)<br> //ejecutamos nuestra procedure Timer;<br> WM_COMMAND: //Si nos mandan el WM_COMMAND<br> if lparam = About then //vemos si el lParam del mensaje = al<br> MostrarAbout; //handle del bot髇 About, y si lo es, es porque<br> //閟te fue presionado por lo tanto llamamos a<br> //nuestra procedure para mostrar los cr閐itos<br> end; //Terminamos con el CASE<br>end;<br><br>begin<br> Instancia := hInstance; //instancia del programa //本程序的唯一句柄<br><br><br>//la Win32Programmer's Reference
//建立字体<br> Fuente := CreateFont(<br> -12,<br> 0,<br> 0,<br> 0,<br> 400,<br> 0,<br> 0,<br> 0,<br> DEFAULT_CHARSET,<br> OUT_DEFAULT_PRECIS,<br> CLIP_DEFAULT_PRECIS,<br> DEFAULT_QUALITY, DEFAULT_PITCH +<br> FF_DONTCARE,<br> 'MS Sans Serif');<br><br>//Definimos las partes del class de la ventana para luego registrarlo...<br> with Clase do<br> begin<br> Style := CS_CLASSDC or CS_PARENTDC; //estilo<br> lpfnWndProc := @WindowProc; //apunta hacia nuestra funci髇 para procesar mensajes<br> hInstance := Instancia; //instancia de nuestra aplicaci髇<br> hIcon := LoadIcon(hInstance, 'MAINICON'); //el 韈ono<br> hbrBackGround := COLOR_BACKGROUND; //el color<br> lpszClassName := 'DeKOiN'; //el nombre<br> hCursor := LoadCursor(0, IDC_ARROW); //finalmente el cursor<br> end;<br><br> RegisterClass(Clase); //Registramos el class de nuestra ventana<br><br>//********************************************************************<br>//Comenzamos la creacion de la ventana y los controles de nuestro app<br>//********************************************************************<br><br>//Creamos la ventana principal<br> Handle := CreateWindowEx(//Handle := el handle de la ventana principal<br><br> WS_EX_WINDOWEDGE + //los estilos "extra"<br> WS_EX_TOPMOST, //de la ventana<br> 'DeKOiN', //nombre del class ( YA REGISTRADO ) de la ventana<br> 'WinInspector', //titulo de la ventana<br> WS_SYSMENU or //estilos de la ventana [Tiene los botones (Maximizar, Minimizar, Cerrar) en la titlebar]<br> WS_VISIBLE or // [Es visible]<br> WS_MINIMIZEBOX, // [Se puede minimizar]<br> 0, 0, // Queremos que la ventana aparezca en la esquina superior<br> // izquierda de la pantalla, por lo tanto le asociamos lo que<br> // normalmente ser韆n las propiedades "top" y "left" a 0<br> 179, 227, //dimensiones de la ventana [Ancho,Alto]<br> 0, 0, //mirar Win32 Programmer's reference
<br> Instancia, // instancia de nuestra aplicaci髇<br> nil //puntero a los datos de creaci髇 de la ventana<br> );<br><br><br>//Creamos el bot髇 de about<br> About := CreateWindow(<br><br> 'Button', //nombre del class<br> 'About', //texto del bot髇<br> WS_VISIBLE or //estilos<br> WS_CHILD, //por detalles mirar Win32 Programmer's Reference<br> 1, 160, // X , Y del control<br> 89, 41, //dimensiones [Width, Height]<br> handle, //handle de nuestra aplicaci髇<br> 0,<br> Instancia, //instancia de nuestra aplicaci髇<br> nil //puntero a los datos de creaci髇 del control<br> );<br><br>//Creamos un "panel" para que el prog tenga un mejor aspecto<br> GroupBox1 := CreateWindowEx(<br><br> WS_EX_STATICEDGE,<br> 'Static',<br> 'Posici髇 del cursor',<br> WS_VISIBLE +<br> WS_DLGFRAME +<br> WS_CHILD,<br> 3, 3,<br> 100, 65,<br> handle,<br> 0,<br> Instancia,<br> nil<br> );<br><br>//Creamos un editbox<br> cPosX := CreateWindowEx(<br><br> WS_EX_CLIENTEDGE, //este extended style es para que el edit tenga borde (sino nos queda flat)<br> 'Edit',<br> '', //texto del edit, lo dejamos vacio por ahora
<br> WS_VISIBLE +<br> WS_CHILD +<br> SS_LEFT, //alineaci髇 IZQUIERDA<br> 23, 19,<br> 74, 21,<br> Handle,<br> 0,<br> Instancia,<br> nil<br> );<br><br>//Creamos otro editbox<br> cPosY := CreateWindowEx(<br><br> WS_EX_CLIENTEDGE,<br> 'Edit',<br> '',<br> WS_VISIBLE +<br> WS_CHILD +<br> SS_LEFT,<br> 23, 42,<br> 74, 21,<br> Handle,<br> 0,<br> Instancia,<br> nil<br> );<br><br>//Creamos una label<br> lcPosX := CreateWindow(<br><br> 'Static',<br> 'X:',<br> WS_VISIBLE +<br> WS_CHILD +<br> SS_LEFT,<br> 8, 20,<br> 13, 13,<br> Handle,<br> 0,<br> Instancia,<br> nil<br> );<br><br>//Creamos otra label<br> lcPosY := CreateWindow(<br><br> 'Static',<br> 'Y:',<br> WS_VISIBLE +<br> WS_CHILD +<br> SS_LEFT,<br> 8, 42,<br> 13, 13,<br> Handle,<br> 0,<br> Instancia,<br> nil<br> );<br><br>//Y otra label<br> LabelHandle := CreateWindow(<br><br> 'Static',<br> 'Handle:',<br> WS_VISIBLE +<br> WS_CHILD,<br> 111, 6,<br> 37, 13,<br> Handle,<br> 0,<br> Instancia,<br> nil<br> );<br><br>//Otro edit m醩<br> eHandle := CreateWindowEx(<br><br> WS_EX_CLIENTEDGE,<br> 'Edit',<br> '',<br> WS_VISIBLE +<br> WS_CHILD +<br> SS_LEFT,<br> 111, 21,<br> 58, 21,<br> handle,<br> 0,<br> Instancia,<br> nil<br> );<br><br>//Label...<br> wNLabel := CreateWindow(<br><br> 'Static',<br> 'Texto de la ventana:',<br> WS_VISIBLE +<br> WS_CHILD,<br> 2, 78,<br> 108, 13,<br> Handle,<br> 0,<br> Instancia,<br> nil<br> );<br><br>//Edit...<br> wName := CreateWindowEx(<br><br> WS_EX_CLIENTEDGE,<br> 'Edit',<br> '',<br> WS_VISIBLE +<br> WS_CHILD +<br> SS_LEFT,<br> 2, 93,<br> 167, 21,<br> Handle,<br> 0,<br> Instancia,<br> nil<br> );<br><br>//Label...<br> cWLabel := CreateWindow(<br><br> 'Static',<br> 'Clase de la ventana:',<br> WS_VISIBLE +<br> WS_CHILD +<br> SS_LEFT,<br> 2, 118,<br> 97, 13,<br> Handle,<br> 0,<br> Instancia,<br> nil<br> );<br><br>//Edit...<br> cWindow := CreateWindowEx(<br><br> WS_EX_CLIENTEDGE,<br> 'Edit',<br> '',<br> WS_VISIBLE +<br> WS_CHILD +<br> SS_LEFT,<br> 2, 133,<br> 167, 21,<br> Handle,<br> 0,<br> Instancia,<br> nil<br> );<br><br>//Label...<br> IDLabel := CreateWindow(<br><br> 'Static',<br> 'ID del thread:',<br> WS_VISIBLE +<br> WS_CHILD +<br> SS_LEFT,<br> 106, 160,<br> 72, 13,<br> Handle,<br> 0,<br> Instancia,<br> nil<br> );<br><br>//Al fin!!, este es el 鷏timo control que creamos!!!!!!! - un edit<br> eThreadID := CreateWindowEx(<br> WS_EX_CLIENTEDGE,<br> 'Edit',<br> '',<br> WS_VISIBLE +<br> WS_CHILD +<br> SS_LEFT,<br> 112, 176,<br> 57, 21,<br> Handle,<br> 0,<br> Instancia,<br> nil<br> );<br><br>//********************************************************************<br><br>// Mandamos el mensaje WM_SETFONT para ponerle la fuente a los<br>// controles que acabamos de crear. Si tienes dudas sobre la API<br>// SendMessage o el mensaje WM_SETFONT consulta la Win32 Programmer's<br>// Reference<br><br> SendMessage(Handle, WM_SETFONT, Fuente, Handle); //字体设置<br> SendMessage(About, WM_SETFONT, Fuente, About);<br> SendMessage(GroupBox1, WM_SETFONT, Fuente, GroupBox1);<br> SendMessage(cPosX, WM_SETFONT, Fuente, cPosX);<br> SendMessage(cPosY, WM_SETFONT, Fuente, cPosY);<br> SendMessage(lcPosX, WM_SETFONT, Fuente, lcPosX);<br> SendMessage(lcPosY, WM_SETFONT, Fuente, lcPosY);<br> SendMessage(LabelHandle, WM_SETFONT, Fuente, LabelHandle);<br> SendMessage(eHandle, WM_SETFONT, Fuente, eHandle);<br> SendMessage(wNLabel, WM_SETFONT, Fuente, wNLabel);<br> SendMessage(wName, WM_SETFONT, Fuente, wName);<br> SendMessage(cWLabel, WM_SETFONT, Fuente, cWLabel);<br> SendMessage(cWindow, WM_SETFONT, Fuente, cWindow);<br> SendMessage(IDLabel, WM_SETFONT, Fuente, IDLabel);<br> SendMessage(eThreadID, WM_SETFONT, Fuente, eThreadID);<br><br>// Creamos un timer con el int閞valo de 1 milisegundo<br> SetTimer(handle, 0, 1, nil); //timer参数设置<br><br>// Bucle para recibir y procesar los mensajes de Windows que le llegan<br>// a nuestro programa<br> while (GetMessage(Mensaje, Handle, 0, 0)) do<br> begin<br> TranslateMessage(Mensaje); //Convertimos cualquier mensaje del teclado a WM_CHAR<br> DispatchMessage(Mensaje); // Le pasamos el mensaje que nos envian a la funci髇<br> // WindowProc para que 閟te sea procesado<br> end;<br><br>end.<br><br>