¿y si multiplicas el valor por -1? pregunto -1 * -1=1
si el valor es < 0 ... valor = valor * -1
si el valor es < 0 ... valor = valor * -1
Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.
Mostrar Mensajes Menú Console.BufferHeight = 390
Cita de: Fran1946 en 15 Febrero 2020, 12:47 PMal final te sirvío
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.
Cita de: Fran1946 en 14 Febrero 2020, 22:33 PM
Si tienen que ser no accesibles, pero operativos para el programa
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
Cita de: Fran1946 en 14 Febrero 2020, 19:53 PM¿inaccesibles pero operativos o solo inaccesibles?
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í:
---
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)
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
Cita de: Fran1946 en 13 Febrero 2020, 19:19 PM
'Aquí necesito obtener Hwnd de cada MenuID, para añadirlos a un ListBox
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
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
Cita de: NEBIRE en 13 Febrero 2020, 01:22 AM
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'...
Cita de: @XSStringManolo en 13 Febrero 2020, 00:20 AM
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.