Menú

Mostrar Mensajes

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ú

Mensajes - Dessa

#391
Siempre son bienvenidas las criticas constructivas krackwar y siempre uso APIs (o por lo menos lo intento) pero en este caso que nesecito cerrar todo abuptamente "Taskkill" esta respondiendo perfecto con y sin bordes. (sendMesagge no responde sin bordes), por otro lado solo estoy probando con hasta donde puede llegar "Taskkill", pero si me das una buena razon para descartarla seria  la mejor critica constructiva. (y por supuesto que aceptaria)

PD: Alguna idea para encontrar la classe del explorer ? (para no tener que ejecutarlo al final de EnumWindowsProc)

Saludos de Dessa
#392
Con este código intento cerrar todas Aplicaciones (no procesos) con ventanas (visibles con y sin bordes) que se encuentran abiertas, con el Api SendMesssage (que me permite guardar los cambios) o con Taskkill (que cierra todo sin pedir permiso, ignorando todos los cambios), por lo tanto no se olviden de guardar todo antes de aplicar con Taskkill.

La pregunta es como puedo evitar que se cierre el explorer cuando tengo que cerrar las pantallas sin bordes, para no tener que ejecutarlo de nuevo al final ?,

Private Sub Command1_Click()
EnumWindows AddressOf EnumWindowsProc, ByVal 0&
If Check1.Value = 1 Then
  Dim x As Long: x = GetTickCount: While GetTickCount < x + 500: Wend
  Shell "explorer.exe"
End If
End Sub


No doy con la clase del explorer para poder agregarla al if de EnumWindowsProc 

Public Function EnumWindowsProc(ByVal Hwnd As Long, ByVal lParam As Long) As Boolean
  If TaskWindow(Hwnd) Then
    If GetClsName(Hwnd) <> "Shell_TrayWnd" or GetClsName(Hwnd) <> "Classe_explorer" Then
...
...
...

  EnumWindowsProc = True
End Function

Nota1: Hay que compilar y guardar para ejecutarlo
Nota2: CTL-ALT-SUP (Aministrador, aplicaciones, tarea neva..., explorer, aceptar) si hace falta volver el explorer


Formulario


Option Explicit

Private Sub Form_Load()
   
   If App.PrevInstance Then End
   Call SetWindowPos(Me.Hwnd, -1, 0, 0, 0, 0, &H2 Or &H1)
   
   MsgBox "Ejecutar Compilado " + vbCrLf + vbCrLf + "Taskkill no Guarda cambios en las Aplicaciones abiertas, cierra directamente", vbCritical, "Atención"
   
   Me.Caption = "Ejecutar Compilado": Me.Top = 1680: Me.Left = 1560
   Option1.Caption = "Cerrar con  Taskill   (No pide ni guarda nada, cierra todo)"
   Option2.Caption = "Cerrar con API  SendMessage  (Pedirá guardar Cambios)"
   Check1.Caption = "Incluir  Ventanas  sin  Bordes   ( Cerrará el explorer )"
   Option1.Left = 120: Option1.Width = 4465: Option1.Top = 960
   Option2.Value = True
   Option2.Left = 120: Option2.Width = 4465: Option2.Top = 360
   Check1.Left = 120: Check1.Width = 4465: Check1.Top = 2460
   Command1.Caption = "Aceptar"
   Command1.Left = 1560: Command1.Top = 1680

End Sub

Private Sub Command1_Click()
 
EnumWindows AddressOf EnumWindowsProc, ByVal 0&
 
If Check1.Value = 1 Then
  Dim x As Long: x = GetTickCount: While GetTickCount < x + 500: Wend
  Shell "explorer.exe"
End If

End Sub



Módulo


Option Explicit
Declare Function GetTickCount Lib "kernel32" () As Long
Declare Function SetWindowPos Lib "user32" (ByVal Hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Boolean
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal Hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal Hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal Hwnd As Long, ByVal wIndx As Long) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal Hwnd As Long, lpdwprocessid As Long) As Long
Private Declare Function OpenProcess Lib "kernel32.dll" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function GetModuleFileNameExA Lib "PSAPI.DLL" (ByVal hProcess As Long, ByVal hModule As Long, ByVal lpFilename As String, ByVal nSize As Long) As Long
Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Long) As Long
Const IsTask = &H10000000 Or &H800000 'solo ventanas visibles y con bordes
Const IsTask2 = &H10000000 ' solo ventanas visibles

Public Function EnumWindowsProc(ByVal Hwnd As Long, ByVal lParam As Long) As Boolean
  If TaskWindow(Hwnd) Then
    If GetClsName(Hwnd) <> "Shell_TrayWnd" Then
      If Form1.Option1.Value = True Then
        Dim idProc As Long: Call GetWindowThreadProcessId(Hwnd, idProc)
        Dim Handle_Proceso As Long: Handle_Proceso = OpenProcess(&H400 + &H10, 0, idProc)
        Dim Buffer As String: Buffer = Space(255)
        Dim ret As Long: ret = GetModuleFileNameExA(Handle_Proceso, 0, Buffer, 255)
        Dim ruta As String: ruta = Left(Buffer, ret)
        Call CloseHandle(Handle_Proceso)
        If Mid(ruta, InStrRev(ruta, "\") + 1) <> App.EXEName + ".exe" Then
          Shell "cmd.exe /c Taskkill /f /IM " + Mid(ruta, InStrRev(ruta, "\") + 1)
        End If
      End If
      If Form1.Option2.Value = True Then
        If Hwnd <> Form1.Hwnd Then Call SendMessage(Hwnd, &H112, &HF060&, 0)
      End If
    End If
  End If
 
  'If EnumWindowsProc = False Then Open App.Path & "\archivo.txt" For Append As #1: Print #1, GetClsName(Hwnd): Close #1

  EnumWindowsProc = True

End Function

Private Function TaskWindow(hwCurr As Long) As Long
  Dim lngStyle As Long: lngStyle = GetWindowLong(hwCurr, (-16))
  If Form1.Check1.Value = 0 Then If (lngStyle And IsTask) = IsTask Then TaskWindow = True
  If Form1.Check1.Value = 1 Then If (lngStyle And IsTask2) = IsTask2 Then TaskWindow = True
End Function

Private Function GetClsName(handle As Long) As String
    Dim lpClassName As String: lpClassName = Space(256)
    Dim RetVal As Long: RetVal = GetClassName(handle, lpClassName, 256)
    GetClsName = Left$(lpClassName, RetVal)
End Function



Sauludos

#393
Moveable = False (en diseño) para que no se mueva

saludos
#394
Me.Top = Screen.Height - Me.Height
Me.Left = Screen.Width - Me.Width
#396
Me.Height = Screen.Height
Me.Width = Screen.Width
#397
Proba si sirve pasar la fecha a "generalnumber" de visual mas la diferencia que parece  constante de  2415019



Private Sub Form_Load()

'MsgBox 2454472 - 2454838

MsgBox Format("06/01/2008", "general number") + 2415019
MsgBox Format("06/01/2009", "general number") + 2415019
MsgBox Format(Date, "general number") + 2415019
MsgBox Format("10/01/2009", "general number") + 2415019

End Sub



Saludos
#398
No desenfoques el punto del mensaje "Karcrack", sabiendo el nombre del Proceso a cerrar con esa linea alcanza y para mi por lo menos, me parece práctica, como nombraste al PID, yo Agregué que con el PID tambien funciona, pero como vos decis tenes que agregar 1 módulo, 3 lineas de declaracion de APIs, 1 Funcion y la llamada a la funcion desde el formulario (minimo 8 lineas) sin la "linea PRO" ni la constante que la ponemos directa sin declarar), todo esto contra una linea.

Shell "cmd.exe /c Taskkill /PID ####"

PD: No seas tan negativo, hermano, despues de todo nadie te obliga a usar el Code y quedarse en pequeñeces no suma, mas bien que resta.

Saludos.
#399
Me pareció practico y directo, conociendo el nombre del exe

PD: Tambien funciona con PID: Shell "cmd.exe /c Taskkill /PID ####"

Saludos
#400
No hay mucho que agregar, solo hace falta el nombre del ejecutable del proceso y para el que no sepa reestablecer el explorer luego de ejecutar el code del ejemplo (desaparecen los iconos, barra de inicio, menús de contexto, Etc, Etc) lo haga desde CTL-ALT-SUP (Aministrador, aplicaciones, tarea neva..., explorer, aceptar)

Private Sub Form_Load()
Shell "cmd.exe /c Taskkill /f /IM " + "EXPLORER.EXE"
End Sub

PD: para enumerar los procesos que esten corriendo "WMI" o "API EnumProcesses"

Saludos