amilo-forum.de

Inoffizielles Forum rund um die Notebooks der Amilo- und Lifebook-Serien von Fujitsu

PowerManager ScanCode?

Alle Probleme mit Windows oder Windows-Treibern.

PowerManager ScanCode?

Beitragvon petschbot » 03.06.2006 19:29

Hallo,

als ich mich mal wieder über die unsinnige Eigenart der PowerManager-Anwendung auf meinem 7440er ärgerte, dass WLAN erst nach dem Druck auf die entsprechende Taste zu starten, habe ich mir mal das Programm etwas genauer angesehen.

Im Programmverzeichnis liegt eine Datei THINFO.INI mit folgenden Inhalt:

[Throttling]
DutyCycle=000

[HotKey]
HKScanCode=0x67


Ich stelle jetzt mal einfach die Vermutung an, dass die Taste 0x67 die WLAN-Taste ist. Wie wäre es, wenn ich per Script zunächst den PowerManager starte und anschließend ein kleines Programm ausführe, welches nichts weiter tut als so zu tun als ob besagte Taste gedrückt wurde?

Leider reichen meine Programmierkenntnisse selber nicht aus, um ein solches Programm zu schreiben, aber vielleicht gibt es hier jemanden, der vielleicht einen kurzen Zweizeiler schreiben könnte, welchen ich dann in ein AutoIt-Script einbauen kann?
Benutzeravatar
petschbot
 
Beiträge: 1086
Registriert: 15.07.2005 17:01
Notebook:
  • M 7440G
  • Palm Zire 31
  • Lintec Desktop
  • FSC Desktop "Trend"

Re: PowerManager ScanCode?

Beitragvon mihi » 03.06.2006 21:33

petschbot hat geschrieben:Ich stelle jetzt mal einfach die Vermutung an, dass die Taste 0x67 die WLAN-Taste ist. Wie wäre es, wenn ich per Script zunächst den PowerManager starte und anschließend ein kleines Programm ausführe, welches nichts weiter tut als so zu tun als ob besagte Taste gedrückt wurde?


Hatte ich mal probiert, hatte aber nicht den gewünschten Effekt. Aus irgendeinem Grunde scheint die keyboard_event-Funktion nicht mit globalen Hotkeys umgehen zu können (bzw. die Hotkeys bereits vorher abgefangen zu werden).

Andererseits schickt Windows ja Notifications an den PowerManager, wenn der Knopf gedrückt wird, und die kann man auch per Hand ganz gut schicken. Wenn man zuerst darauf wartet dass der PowerManager auch wirklich da ist, kann man das auch problemlos in den Autostart packen. Der folgende Code (Visual Basic) läuft bei mir seit ein paar Monaten problemlos (der meiste Code ist dafür da das Fenster zu finden an den die Codes geschickt werden müssen):

Code: Alles auswählen
Attribute VB_Name = "WlanONModule"
'' quick and dirty hack to enable wlan on bootup
'' use at your own risk
'' (c) 2006 Michael Schierl
'' Licensed under GNU General Public License Version 2
Option Explicit

Private Const TH32CS_SNAPPROCESS = 2
Private Type PROCESSENTRY32
     dwSize As Long
     cntUsage As Long
     th32ProcessID As Long
     th32DefaultHeapID As Long
    th32ModuleID As Long
    cntThreads As Long
    th32ParentProcessID As Long
    pcPriClassBase As Long
    dwFlags As Long
    szExeFile As String * 260
End Type

Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer

Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long
Private Declare Function Process32First Lib "kernel32" (ByVal hSnapshot As Long, ByRef lppe As PROCESSENTRY32) As Long
Private Declare Function Process32Next Lib "kernel32" (ByVal hSnapshot As Long, ByRef lppe As PROCESSENTRY32) As Long

Private Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long

Private scanresult As Long

Function EnumWindowsProc(ByVal hwnd As Long, ByVal lParam As Long) As Long
    Dim pid As Long, name As String
    GetWindowThreadProcessId hwnd, pid
    name = GetProcessFileName(pid)
    If UCase(name) = "PM.EXE" Then
        scanresult = hwnd
    End If
    EnumWindowsProc = CInt(True)
End Function

Function GetProcessFileName(pid As Long) As String
    Dim hi As Long, th32 As PROCESSENTRY32, result As String, rr As Long
    result = ""
    hi = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
    th32.dwSize = Len(th32)
    Process32First hi, th32
    Do
        If th32.th32ProcessID = pid Then result = Left$(th32.szExeFile, InStr(th32.szExeFile, Chr$(0)) - 1)
        rr = Process32Next(hi, th32)
        If rr <> 1 Then Exit Do
    Loop
    CloseHandle hi
    GetProcessFileName = result
End Function


Function FindPowerManager()
    EnumWindows AddressOf EnumWindowsProc, 0
    FindPowerManager = scanresult
End Function


Sub Main()
    '' do not do anything when Caps Lock is on
    If (GetKeyState(vbKeyCapital) And 1) = 1 Then Exit Sub
    Dim hwnd As Long, t As Single
    Do
        hwnd = FindPowerManager
        If hwnd <> 0 Then Exit Do
        t = Timer
        Do
            DoEvents
        Loop Until t + 1 < Timer
    Loop
    Debug.Print hwnd
    SendMessage hwnd, &H83EA&, 1, 0  ' for off replace 1 by 0
    '' for throttling replace &H83EA& by &H83E9&
End Sub


Anbei noch das ganze in compilierter Form.

Michael
mihi
Dateianhänge
wlanon.zip
Amilo M7440 Power-Manager WLAN-Einschalter
(4.89 KiB) 3547-mal heruntergeladen
mihi
 
Beiträge: 11
Registriert: 04.01.2006 20:57

Beitragvon petschbot » 04.06.2006 12:09

Funktioniert super, Danke!
Benutzeravatar
petschbot
 
Beiträge: 1086
Registriert: 15.07.2005 17:01
Notebook:
  • M 7440G
  • Palm Zire 31
  • Lintec Desktop
  • FSC Desktop "Trend"

Beitragvon akkubohrer » 21.01.2007 12:21

Hallo!

Erstmal vielen Dank, das Programm funktioniert super!

Leider habe ich aber das Problem, das die Anwedung sich nicht selbstständig schliesst und dann laut taskmanager bis zu 99 % der CPU-Auslastung in Anspruch nimmt....

Kann man da noch einen kleinen Code anfügen, der das Programm beendet oder so?

vielen Dank für eure Hilfe

Gruß Ole
akkubohrer
 
Beiträge: 4
Registriert: 07.01.2006 14:31

Beitragvon mihi » 21.01.2007 12:51

Hmm? Das Programm beendet sich, sobald es den PowerManager gefunden hat. Wenn du den PowerManager nicht gestartet hast, versucht es alle paar Millisekunden ihn zu finden, dann ist klar dass es so viel CPU verbrät wie gerade frei ist.

Bei dir aktiviert er das WLAN, bleibt dann aber laufen? Komisch.

mihi

PS: Ich kanns nimmer testen, weil ich mein Notebook inzwischen (nach 2 Lüfterausfällen im Abstand von ein paar Monaten) weiterverkauft habe. Jetzt hab ich ein Nicht-Siemens-Notebook :)
mihi
 
Beiträge: 11
Registriert: 04.01.2006 20:57

Beitragvon akkubohrer » 22.01.2007 10:22

Hi!

Danke für die schnelle Antwort!

Also der Powermanager startet bei mir ganz wie gewünscht mit, aber das scheint WLANon nicht zu regisitrieren.....


Gruß

Ole
akkubohrer
 
Beiträge: 4
Registriert: 07.01.2006 14:31

Beitragvon mihi » 22.01.2007 20:04

Dann ist dein Powermanager entweder ne andere Version als meine war (für Amilo M7440G), oder sie heißt nicht "pm.exe". (Oder beides.)

Michael
mihi
 
Beiträge: 11
Registriert: 04.01.2006 20:57

Beitragvon akkubohrer » 23.01.2007 13:03

also pm.exe heißt die datei bei mir auch.

Meine Programmversion ist 1.8.6.0.

Ist das identisch mit deiner Version?

Ich habe auch einen Amilo M 7440G.


vielen dank

gruß
akkubohrer
 
Beiträge: 4
Registriert: 07.01.2006 14:31

Beitragvon petschbot » 23.01.2007 19:28

Aktuell ist die Version 1.9.1. Ich würde Updaten, u.a. wird der Silent-Modus jetzt optisch quittiert.

Zum eigentlichen Problem ein Schuß von mir ins Blaue: Wird die pm.exe unter einer anderen Benutzerkennung gestartet? (Ein Muss beim arbeiten mit eingeschränkten Benutzerrechten, da der PM nur mit Adminrechten läuft.)
Mein Amilo-Blog:
http://7440g.blogspot.com
Benutzeravatar
petschbot
 
Beiträge: 1086
Registriert: 15.07.2005 17:01
Notebook:
  • Siemens Nixdorf PCD 4ND
  • M 7440G
  • Palm Zire 31
  • Lintec Desktop
  • FSC Desktop "Trend"


Zurück zu Windows