|
372
|
Programación / .NET (C#, VB.NET, ASP) / Conseguir el número de líneas que se generan en la Consola
|
en: 15 Febrero 2020, 19:38 pm
|
Estoy usando la consola de NET para mostrar una serie de datos, pero cuando el número de líneas generadas supera el bufferHeight de la consola, no se puede ver el total de los datos mostrados por lo que debo aumentar el buffer antes de mostrar las líneas Console.BufferHeight = 390 Pero tengo que ir probando diferentes valores hasta que que veo que es posible ver todas las líneas moviendo el la barra scroll Me preguntaba si hay alguna forma de ver el número de líneas que se han generado en la consola y según ese dato luego añadir la línea el valor a la propiedad Console.BufferHeight
|
|
|
374
|
Programación / Programación Visual Basic / Re: Alguien sabe como conseguir esto
|
en: 15 Febrero 2020, 13:06 pm
|
Perfecto... Se queda así: Public Function EliminarMenu(ByVal hwndAPP As Long) Dim HWNDMenu As Long Dim i As Integer, n_Menu As Long 'hwnd del menu del programa HWNDMenu = GetMenu(hwndAPP) SendMessage hwndAPP, WM_COMMAND, 57642, 0& 'esto ejecuta Crt+E Seleccionar todo If HWNDMenu Then n_Menu = GetMenuItemCount(HWNDMenu) If n_Menu Then For i = 1 To n_Menu 'Recorre todos los menú y los elimina Call RemoveMenu(HWNDMenu, 0, MF_BYPOSITION) Next Call DrawMenuBar(hwndAPP) 'Repinta la barra de menú, actualiza la App End If End If End Function
Se ejecuta Ctr+E para que el cursor del mouse no tenga el icono del lápiz, que podría pintar y arruinar el proceso. Una vez mas, muchísimas gracias. al final te sirvío VB todavía no está muerto, bien por el foro que permita esta sección. Aunque la mayoría de preguntas sobre sql y base de datos, pero casi todas alguien las responde, aunque muchas con poca gana. También mucha gente se equivoca y hace preguntas sobre VB.NET, ya hay otra sección para eso. Ayudarte me ha servido para recordar como era esto de programar (pero venía rodado por ayudar a otro usuario antes que a tí que si no...)
|
|
|
375
|
Programación / Programación Visual Basic / Re: Alguien sabe como conseguir esto
|
en: 14 Febrero 2020, 22:52 pm
|
Si tienen que ser no accesibles, pero operativos para el programa
No te preocupes siguen estando operativos edito: Pero debes obtener el MenuID que quieres usar, meterlos en memoria en un array por ejemplo, porque una vez borrado no se puede obtener el ID. Mira prueba: Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _ (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private Declare Function GetMenu Lib "user32" (ByVal hwnd As Long) As Long Private Declare Function GetMenuItemCount Lib "user32" (ByVal hMenu As Long) As Long Private Declare Function RemoveMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long Private Declare Function DrawMenuBar Lib "user32" (ByVal hwnd As Long) As Long Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _ (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Private Const MF_BYPOSITION = &H400& Private Const WM_COMMAND = &H111 Dim hwndAPP As Long Private Sub Form_Load() Shell "notepad.exe", vbNormalFocus Do While hwndAPP = 0 hwndAPP = FindWindow("Notepad", vbNullString) DoEvents Loop Call EliminarMenu(hwndAPP) End Sub Private Sub Command1_Click() Dim MenuID As Long MenuID = 65& AppActivate "Sin título: Bloc de notas" SendMessage hwndAPP, WM_COMMAND, MenuID, 0& End Sub Public Function EliminarMenu(ByVal hwndAPP As Long) Dim HWNDMenu As Long Dim idpOS As Long Dim i As Integer Dim N As Long Dim d As Long 'hwnd del menu del programa HWNDMenu = GetMenu(hwndAPP) If HWNDMenu Then n_Menu = GetMenuItemCount(HWNDMenu) If n_Menu Then For i = 1 To n_Menu 'Recorre todos los menú y los elimina Call RemoveMenu(HWNDMenu, 0, MF_BYPOSITION) Next Call DrawMenuBar(hwndAPP) 'Repinta la barra de menú End If End If End Function
|
|
|
376
|
Programación / Programación Visual Basic / Re: Alguien sabe como conseguir esto
|
en: 14 Febrero 2020, 20:45 pm
|
Muy bueno este código, este es para mi colección seguro que lo utilizaré.
Te he mandado un mensaje.
Lo que necesito hacer es que queden inaccesibles todos los menúes, y lo he conseguido así:
---
¿inaccesibles pero operativos o solo inaccesibles? Puedes usar esta función la función API RemoveMenu: Private Declare Function RemoveMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long Public Function EliminarMenu(ByVal hwndAPP As Long) Dim HWNDMenu As Long Dim idpOS As Long Dim i As Integer Dim N As Long Dim d As Long 'hwnd del menu del programa HWNDMenu = GetMenu(hwndAPP) If HWNDMenu Then n_Menu = GetMenuItemCount(HWNDMenu) If n_Menu Then For i = 1 To n_Menu 'Recorre todos los menú y los elimina Call RemoveMenu(HWNDMenu, 0, MF_BYPOSITION) Next Call DrawMenuBar(hwndAPP) 'Repinta la barra de menú End If End If End Function
Call EliminarMenu(hwndAPP)
EJEMPLO: Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _ (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private Declare Function GetMenu Lib "user32" (ByVal hwnd As Long) As Long Private Declare Function GetMenuItemCount Lib "user32" (ByVal hMenu As Long) As Long Private Declare Function RemoveMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long Private Declare Function DrawMenuBar Lib "user32" (ByVal hwnd As Long) As Long Private Const MF_BYPOSITION = &H400& Dim hwndAPP As Long Private Sub Form_Load() Shell "notepad.exe", vbNormalFocus Do While hwndAPP = 0 hwndAPP = FindWindow("Notepad", vbNullString) DoEvents Loop End Sub '//Oculgar menú Private Sub Command1_Click() Call EliminarMenu(hwndAPP) End Sub Public Function EliminarMenu(ByVal hwndAPP As Long) Dim HWNDMenu As Long Dim idpOS As Long Dim i As Integer Dim N As Long Dim d As Long 'hwnd del menu del programa HWNDMenu = GetMenu(hwndAPP) If HWNDMenu Then n_Menu = GetMenuItemCount(HWNDMenu) If n_Menu Then For i = 1 To n_Menu 'Recorre todos los menú y los elimina Call RemoveMenu(HWNDMenu, 0, MF_BYPOSITION) Next Call DrawMenuBar(hwndAPP) End If End If End Function
|
|
|
377
|
Foros Generales / Foro Libre / Re: Belo Horizonte llevará a cabo la 'Marcha por Satanás'
|
en: 14 Febrero 2020, 20:27 pm
|
Soy ateo o mejor dicho un no creyente religioso.
No creo que el término "satanista" sea el adecuado para designar a los ateos o un movimiento ateo. Claro que para los sacerdotes o creyentes fanáticos todo aquel que no siga sus creencias son adoradores de satán.
Ser satánico ES LO MISMO que ser creyente, igualmente es una creencia religiosa porque Satán, lucifer, el demonio, los ángeles, Dios, Jesús, etc. forman parte de la creencia religiosa cristiana. Una persona adoradora de Satán indefectiblemente es creyente de Jesús o del Dios cristiano y/u otras religiones, ya que en el Islam también existe el concepto de Satán (Shaitán). Son creencias paralelas.
Si un movimiento ateo, usa o usase esa expresión y, entiendo que se usa como un desafío, para joder, de forma irónica o como contraposición, sin embargo me parece un error.
|
|
|
378
|
Programación / Programación Visual Basic / Re: Alguien sabe como conseguir esto
|
en: 14 Febrero 2020, 17:19 pm
|
'Aquí necesito obtener Hwnd de cada MenuID, para añadirlos a un ListBox
No te lo puedo asegurar pero los submenus si es a lo que te refieres no tiene handle. Para diregirte a ellos usa MenuID tal como has hecho. Este código rastrea todos los menús y submenus, es similar al tuyo. Pero tal como muestro la información te quedará más claro.En un nuevo proyecto, crea 4 listbox tal como lo pusistes y un botón y pega este código. Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _ (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private Declare Function GetMenu Lib "user32" (ByVal hWnd As Long) As Long Private Declare Function GetMenuItemID Lib "user32" _ (ByVal hMenu As Long, ByVal nPos As Long) As Long Private Declare Function GetSubMenu Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _ (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Private Declare Function GetMenuItemCount Lib "user32" (ByVal hMenu As Long) As Long Private Declare Function GetMenuString Lib "user32" Alias "GetMenuStringA" _ (ByVal hMenu As Long, ByVal wIDItem As Long, ByVal lpString As String, _ ByVal nMaxCount As Long, ByVal wFlag As Long) As Long Const WM_COMMAND = &H111 Const WM_SYSCOMMAND = &H112 Const MF_BYPOSITION = &H400& Const MF_POPUP = &H10& Const SW_NORMAL = 1 Const SW_HIDE = 0 Private Sub Command1_Click() Dim n As Variant Dim hMainMenu As Long Dim hMenu As Long Dim MenuID As Long Dim MenuCount As Long Dim stringmenu As String Dim szbuff As String * 128 Dim cabBuff As String * 128 Dim HwndParent As Long Dim nPos As Integer Dim nID As Integer HwndParent = FindWindow("Notepad", vbNullString) If HwndParent = 0 Then Exit Sub hMainMenu = GetMenu(HwndParent) 'Obtiene el handle del menú de Notepad MenuCount = GetMenuItemCount(hMainMenu) 'Cuenta el número de menús (no submenus) For nPos = 0 To MenuCount - 1 'Bucle como tantos menús tenga notepad (son 5: 0,1,2,3,4) '//Obtiene las cabeceras Call GetMenuString(hMainMenu, nPos, cabBuff, 128, MF_BYPOSITION) List1.AddItem nPos & ": " & cabBuff For nID = -1 To 1000 'Como no se cuantos submenus tiene bucleo desde -1 al 1000 (se empieza desde -1) hMenu = GetSubMenu(hMainMenu, nPos) 'Obtiene el handle del submenú del menú Z MenuID = GetMenuItemID(hMenu, nID) 'Obtiene el ID del submenú If MenuID > -1 And MenuID > 0 Then Call GetMenuString(hMenu, MenuID, szbuff, 128, MF_BYPOSITION & MF_POPUP) List2.AddItem "cab:" & nPos & "-> " & hMenu '//Handle List3.AddItem "cab:" & nPos & "-> " & MenuID '//MenuID List4.AddItem "cab:" & nPos & "-> " & szbuff '//Nombre End If Next nID Next nPos '//DEMOSTRACIÓN'// '///////////////////////////////// '//Envía un mensaje a Notepad '//para que ejecute el menú Ayuda '///////////////////////////////// AppActivate "Sin título: Bloc de notas" '//Activa el notepad MenuID = 65& '//-<--Introduce el ID del menú en la variable SendMessage HwndParent, WM_COMMAND, MenuID, 0& 'esto ejecuta el ID 65 (Acerca de bloc de notas) End Sub Private Sub Form_Load() 'Inicia notepad.exe Dim X As Long, hw As Long Dim WshShell As Object Set WshShell = CreateObject("Wscript.Shell") WshShell.Run "cmd.exe start /r notepad.exe", SW_HIDE, 0 End Sub
Puedes usar GetMenuItemInfo par obtener información de menús, por ejemplo si están checkeados e igualmente los nombres, por ejemplo. Pero hSubMenu siempre te devolverá 0 si no me equivoco. Private Type MENUITEMINFO cbSize As Long fMask As Long fType As Long fState As Long wID As Long hSubMenu As Long hbmpChecked As Long hbmpUnchecked As Long dwItemData As Long dwTypeData As String cch As Long End Type Private Declare Function GetMenuItemInfo Lib "user32" Alias "GetMenuItemInfoA" _ (ByVal hMenu As Long, ByVal un As Long, ByVal b As Long, lpMenuItemInfo As MENUITEMINFO) As Long
|
|
|
379
|
Programación / Programación General / Re: Se puede cambiar el tamaño del Escritorio (Overscanning) con API de Windows
|
en: 13 Febrero 2020, 20:48 pm
|
Vale, lo que buscas es algo ligeramente distinto a lo que yo creía que querías...
Tu me cuentas que te queda alguna 'zona negra' sobre el monitor sin usar, y la ventana que se muestra, queda centrada (más o menos) en el monitor. Como te decía, ésto en los monitores analógicos tenía solución independiente del software, en los monitores digitales, dependerá mucho del fabricante.
En tu caso, contemplo dos posibles soluciones (ya comentadas en mi mensaje previo, aunque d epasada): A - Simular usar múltiples monitores, definiendo ese como el primario (arriba a la izquierda), deberás jugar con el número de monitores y sus dimensiones. No estoy seguro que todos los progamas exijan que estén presente y verifiquen la existencia de cada monitor antes de aceptar y guardar la configuración. También es probable que determinados programas tengan ciertas preconfiguraciones y no dejen elegir configuraciones personalizadas. Nota que digo simular, porque teóricamente no debería hacer falta tenerlos físicamente, incluso el mismo debería poder hacerse pasar por cualquiera de ellos, peor claro esto dependerá de cada programa en cuestión.
B - Usar múltples escritorios: Recuerdo que nVidia permite tener múltiples escritorios (otros fabricantes tiene programas similares). El caso es que permitía (y supongo que actualmente seguirá igual) tener una resolución distinta con cada escritorio. Y en las ventanas, junto a los botones de minimizar, maximizar y cerrar era posible añadir otros, también permitía atajos de teclado para saltar entre escritorios (y por tanto de resolución si se indicó una para distinta para cada escritorio). E incluso activando cierta opción (no recuerdo su nombre), permitía introducir valores de resolución no nativas, con su respectivo botón de aceptar o regreso al término de la cuenta atrás, muy útl cuando la pantalla se malograba y no veías nada ni donde pulsar 'abortar'...
que buena idea lo de usar monitores virtuales. Engañar a Windows simulando que tengo dos monitores en lugar de uno, cada uno con su configuración y poder realizar el cambio según me interese. Y luego configurar Nvidia en modo pantalla múltiple. Por ahora he usado esto https://docs.microsoft.com/es-es/sysinternals/downloads/Pero no deja realizar una configuración independiente para cada escritorio. Cualquier cambio que hagas en uno de ellos cambia para todos. Esto sería crear un monitor virtual, creando las modificaciones en el registro necesarias, así hacer un duplicado del device de mi monitor. Entonces Nvidia lo detectaría como otro y poder cambiar de uno a otro, el como no se XD Encontré gogleando esta apliación de terceros Actual Virtual Desktops 8.14.3Creo que hace eso mismo, ahora lo probaré Edito: No sirve es igual que el de arriba Te diré 3 palabras que cambiarán tu vida.
usa la lupa
o en dos
windows + (atajo de teclado)
Podrías ir sacando imágenes y cuando se pinche en una pixel de la imagen haces la conversión a la pantalla original.
Igual puedes fakear monitores y unirlos. Virtualbox te deja emular monitores. Podrías formas un super desktop usando 4 monitores fake. Igual hay algo hecho por ahí.
Antes había un bug en SDL que te permitía cambiar la res pero lo fixearon al poco.
No entendí
El problema es que ahora me estáis viendo mucho participando en el foro pero de aquí a dos semanas ya no tendré tiempo y seguramente no me veais el pelo. Muy de vez en cuando. No puedo meterme en cosas complicadas en las que me tenga que sumergir durante horas a investigar y leer y leer, así que buscaba algo rápido, código clic y ya. XD
|
|
|
380
|
Sistemas Operativos / Windows / Re: Win10 -Memoria
|
en: 13 Febrero 2020, 16:45 pm
|
Haz limpieza..., pasale el ccleaner , hazlo manualmente, o usa el liberador de espacio de windows... %windir%\system32\cleanmgr.exe
Borra los puntos de restauración antiguos de Windows.
Elimina todos los archivos con extensión *.pf de la carpeta C:\Windows\Prefetch te liberará de apenas algunos megas pero algo es algo.
Vacía la carpeta temporal.
borra el historial de navegación de tus navegadores, desde" todos los tiempos" y marca todas las casillas; cookies, historial, archivos...
si usas programas de descarga o P2P cambia el directorio de descarga (y temporales) a un directorio en otra partición distinta a la del sistema. Sin conexión a Internet, lo que tengas en C:\ pasalo a E:\ por ejemplo si es el caso y luego desde configuración cambia el directorio de descarga y temp (del programa) al que hayas elegido. Mucha gente comete el error de instalar estos programas y dejar los directorios por defecto. Estos programas reservan espacio en el disco para descargar los archivos, por ejemplo si descargas un porgrama de 4,8 GB el programa reservará ese espacio el cual no estará disponible. Si tienes descargas de lo menos 26GB por ejemplo ese espacio queda inservible porque está reservado para la descarga.
personalmente yo no actualizo windows, uso actualización personalizada, las elijo yo. Siempre lo tengo desactivado, solo actualizo aquello que quiero cuando lo considero necesario.
saludos
|
|
|
|
|
|
|