Priorität des Tasks einstellen-Wieder was gefunden, ungelöst

Übersicht BlitzBasic BlitzPlus

Gehe zu Seite Zurück  1, 2

Neue Antwort erstellen

Silver_Knee

BeitragSa, Jul 17, 2010 12:26
Antworten mit Zitat
Benutzer-Profile anzeigen
GetWindowLong geht auch:
BlitzBasic: [AUSKLAPPEN]
win=CreateWindow("wuuut",0,0,0,0,16)
hInst=GetWindowLong(QueryObject(win),-6)


Code: [AUSKLAPPEN]
.lib "User32.dll"
GetWindowLong%(hWnd%,index%):"GetWindowLongA"

Sereyanne

BeitragMo, Jul 19, 2010 9:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey,
also ich hab das jetzt mal versucht hinzukriegen.
Da ich (noch) keine Ahnung von dlls und decls habe, hab ich einfach mal frei Schnauze Silver_Knees Post nachgeeifert und wollte aus Eingeproggts Link meine eigene decls erstellen.
Ich habs so gemacht:
Code: [AUSKLAPPEN]
.lib "User32.dll"
GetWindowThreadProcessId%(hWnd%,lpdwProcessId%)

und im Plus:
Code: [AUSKLAPPEN]
GetWindowThreadProcessId(win,lpdwProcessId)

Aber da endet es schon, erstens weil ich mit diesem lpdwProcessId nichts anfangen kann und zweitens weil es eh nicht funzt!
Die Variable gibt mir 0 raus und ich begreife nicht warum!!
Habe dann mal die beiden Sachen verglichen und ich glaube, es liegt daran:
Zitat:
SetPriorityClass Function
BOOL WINAPI SetPriorityClass(
__in HANDLE hProcess,
__in DWORD dwPriorityClass
);

Zitat:
GetWindowThreadProcessId Function
DWORD WINAPI GetWindowThreadProcessId(
__in HWND hWnd,
__out_opt LPDWORD lpdwProcessId
);

Das sind doch zwei ganz andere Sachen, dann muss doch die decls auch anders aussehen oder???
Ich habe jetzt schon ne Ewigkeit rumprobiert, habs mit lpdwProcessId* probiert und alles mögliche durch...

Hab auch Silver_Knees GetWindowLong probiert, aber sein Code gibt sofort nen Fehler, weil ein Parameter fehlt. Hab ihn einfach mal erweitert:
Code: [AUSKLAPPEN]
hInst=GetWindowLong(QueryObject(win,1),-6)

weiß aber nicht ob das richtig ist und laufen tut es auch nicht...

Ich bin jetzt am Ende mit dem, was ich ausprobieren kann. Mehr fällt mir nichts mehr ein und es läuft alles nicht.
Um es nochmal kurz zusammenzufassen, was ich vorhabe:
Einfach nur ein Fenster erstellen, was automatisch mit der Priorität "niedriger als normal" läuft.
Ich würde mich echt freuen, wenn die Profis mir bitte nochmal helfen könnten....
Hab mich so lange damit rumgequält und bin einfach nicht weiter gekommen... Crying or Very sad
Danke im Voraus!

Übrigens:
Woran liegt das, dass mir die decls-Befehle im BP alle gelb angezeigt werden, aber der GetWindowThreadProcessId bleibt weiß! Hat das was zu bedeuten?

Ach ja und nochwas:
Da ich schon eine kernel und eine user decls habe, hab ich die Befehle da jetzt einfach mit rein kopiert. Sollte doch gehen oder??? (Ich habs auch in einer extra decls probiert, also daran liegts jedenfalls nicht, dass es nicht läuft.)

Sereyanne

BeitragDi, Jul 20, 2010 21:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Schade... weiß denn keiner weiter?
Hab solange rumprobiert und alles hier reingeschrieben, in der Hoffnung, die Profis könnten damit mehr anfangen...

Hat sich denn ernsthaft noch nie jemand die Frage mit der Priorität gestellt? Ist doch nicht euer ernst dass ich der erste bin!

Ich würde mich echt freuen, wenn mir jemand weiterhelfen könnte! *fleh*

Silver_Knee

BeitragDi, Jul 20, 2010 22:02
Antworten mit Zitat
Benutzer-Profile anzeigen
hast du bei meinem Getwindowlong auch die decls benutzt.

wie hast du meinen post vom "Mi Jul 07, 2010 10:00" realisiert?

Alkan

BeitragMi, Jul 21, 2010 23:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Falls du vielleicht doch dir die Userlibs selber schreiben willst, dann gibt es hier was, was mir zumindest sehr geholfen hat. Wink
Aber dafür musst du auch C++ können Rolling Eyes

MfG
Alkan
Hauptrechner: Win7 Ultimate x64|AMD Phenom II X4 965 BlackEdition 4x3.4GHz|4 GB DualKit DDR3-1600 Ram|1.5 TB Samsung EcoGreen|Cougar CM 700Watt|ASRock M3A790GFX/120M|Nvidia GeForce 9500GT|Ati Radeon HD3300(Onboard-Deaktiviert)
Server(früher Hauptrechner): Ubuntu 9.1 x86|Intel P4 HT 3GHz|Ati Radeon X600Pro|200 GB HDD
Worklog: Planetensimulation
Homepage(Under Construction): alkan96.dyndns.org
Wenn schon falsch, dann richtig falsch.

Sereyanne

BeitragDo, Jul 22, 2010 3:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Schön, dass hier doch noch Leben drin steckt Very Happy
Danke für die Antworten!

@Silver_Knee: Natürlich habe ich auch die decls geschrieben. Wie gesagt, es gab den Fehler, dass ein Parameter fehlt, woraufhin ich auf
Code: [AUSKLAPPEN]
hInst=GetWindowLong(QueryObject(win,1),-6)

erweitert habe. Ändert aber nichts daran, dass der Prozess im Taskmanager immer noch auf "normal" läuft!
Der Befehl wird mir im Plus sogar gelb angezeigt, was doch darauf hindeuten müsste, dass er die decls richtig ausliest.

Deinen Post vom "Mi Jul 07, 2010 10:00" habe ich vollständig umgesetzt, die decls geschrieben (bzw. im zweiten Versuch habe ich die Kernel32.dll um diesen Befehl erweitert). Aber da fehlte ja noch der Wert für hProcess, den wir ja noch versuchen rauszukriegen.
Was muss ich in den
Code: [AUSKLAPPEN]
SetPriorityClass(WASKOMMTHIERHIN,$00004000)

denn jetzt reinschreiben?

Würde mich über Antwort freuen!

@Alkan: Leider kann ich kein C++. Werde mir den Thread aber mal ansehen, danke.

edit: Ist jetzt passiert. Der Thread ist bestimmt ganz interessant, bloß kann ich halt kein C++. Außerdem war meine Frage mehr auf die Unterschiede bezogen, wie "BOOL WINAPI" und "DWORD WINAPI" oder "in HANDLE" und "out_opt LPDWORD" , ob ich da nicht auch entsprechend was anderes in die decls reinschreiben muss.
  • Zuletzt bearbeitet von Sereyanne am Do, Jul 22, 2010 4:27, insgesamt einmal bearbeitet

Silver_Knee

BeitragDo, Jul 22, 2010 4:18
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzBasic: [AUSKLAPPEN]
WASKOMMTHIERHIN=hInst

Sereyanne

BeitragDo, Jul 22, 2010 4:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja wie jetzt?
Code: [AUSKLAPPEN]
   
hInst=GetWindowLong(QueryObject(win,1),-6)
SetPriorityClass(hInst,$00004000)

geht aber doch nicht...

Übrigens krieg ich über debuglog hInst den wert 4194304, kann das stimmen? warum ist es dann immer noch auf normal im taskmanagerß
 

Blitzjockey

BeitragDo, Jul 22, 2010 8:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe mit BlitzPlus wenig (garn nichts) zu tun. Aber da Du ein extra Window aufrufst, und dessen Priority ändern willst, vielleicht (ein Versuch ist es viell. wert.) muss man statt den Instance-handle den Window-handle über GetWindowLong ermitteln?

Dass wäre laut MSDN -12 statt -6.

Nebenbei, wo hast Du "GetWindowLong" jetzt definiert? Unter .decls für "kernel32.dll" oder für "User32.dll"?

Ansonsten viel Erfolg.. Shocked Noch ganz schön schwieriges Unternehmen, wah?

Sereyanne

BeitragDo, Jul 22, 2010 14:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Blitzjockey hat Folgendes geschrieben:
Dass wäre laut MSDN -12 statt -6.

Nein, netter Versuch und danke für die Antwort, aber daran liegt es wohl nicht. Im Gegenteil, jetzt bekomme ich den Wert 0 wo vorher 4194304 stand, also vorher war definitiv richtiger.

Blitzjockey hat Folgendes geschrieben:
Nebenbei, wo hast Du "GetWindowLong" jetzt definiert? Unter .decls für "kernel32.dll" oder für "User32.dll"?

In der
Code: [AUSKLAPPEN]
.lib "User32.dll"
wie Silver_Knee es mir gesagt hatte und wie es auch auf msdn steht.

Also, hier mal mein kleines Testprogramm:
Code: [AUSKLAPPEN]
win=CreateWindow("test",0,0,0,0,Desktop(),16)

Repeat
   
   hInst=GetWindowLong(QueryObject(win,1),-6)

   SetPriorityClass(hInst,$00004000)   
   
   Print hInst

   Forever
End


Wie gesagt, ich kriege einen Wert zwar raus, aber im Taskmanager steht es immer noch auf normal.

----------------------------------

edit: Habe gerade noch eine Kleinigkeit gefunden, genauer drei, woran es noch liegen könnte. Könnte natürlich auch alles zusammenhängen!

Laut msdn über SetPriorityClass Function:

1.
Zitat:
Return Value

If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero.

Daher hab ich jetzt einfach mal ne variable davor geschrieben und siehe da, es ergibt Null. Dann kann ja irgendwo was nicht stimmen!
Nur was???

Jetziger Code:
Code: [AUSKLAPPEN]

win=CreateWindow("test",500,300,100,100,Desktop(),3)

Repeat
   hInst=GetWindowLong(QueryObject(win,1),-6)
   DebugLog "hInst "+hInst

   i=SetPriorityClass(hInst,$00004000)   ;BELOW_NORMAL_PRIORITY_CLASS 0x00004000
   DebugLog "i "+i
   ;If the function succeeds, the return value is nonzero.
   ;If the Function fails, the Return value is zero.

   WaitEvent() 
   Select EventID() 
      Case $803 ;WindowClose
         End
   End Select
   Forever
End


2.
Zitat:
Parameters
hProcess (in)
A handle to the process.
The handle must have the PROCESS_SET_INFORMATION access right.

Was sind jetzt "PROCESS_SET_INFORMATION"? Haben wir die, wenn nei, wie kriegen wir sie?

3.
Zitat:
Sets the priority class for the specified process. This value together with the priority value of each thread of the process determines each thread's base priority level.

Also brauchen wir wohl noch einen Wert des Threads!
Eingeproggt hatte da ja schon mal was zu gefunden:
Zitat:
Ohne mich näher damit befasst zu haben, ist eventuell GetWindowThreadProcessId das was ihr sucht?

Daraufhin hatte ich ja versucht, die betreffende decls selber zu schreiben, allerdings bin ich mir nicht sicher ob das so stimmt. Hatte ich ja auch schon mal gespostet.
Könnte mir da mal jemand freundlicherweise weiterhelfen?

Weiterführende Hinweise zu einem oder mehreren der drei Punkten nehme ich gern entgegen!

Danke schon mal!

---------------------------

edit: Ich habe schon wieder etwas gefunden. Diesmal könnte ich ein Stückchen weiter gekommen sein, denn ich bekomme Werte angezeigt, die vorher Null waren!

Verändert habe ich bloß meinen selbsterstellten decls-Befehl, von dem ich ja eh nicht genau weiß, wie ich ihn zu schreiben habe.
Vorher:
Zitat:
.lib "user32.dll"
GetWindowLong%(hWnd%,index%):"GetWindowLongA"
GetWindowThreadProcessId%(hWnd%,lpdwProcessId%)

Da "lpdwProcessId" laut msdn "optional" ist, habe ich es einfach mal weggelassen, ein Versuch könnte ja nicht schaden.
Also nachher:
Zitat:
.lib "user32.dll"
GetWindowLong%(hWnd%,index%):"GetWindowLongA"
GetWindowThreadProcessId%(hWnd%)

Dann hab ich folgenden Code geschrieben:
Code: [AUSKLAPPEN]
win=CreateWindow("test",500,300,100,100,Desktop(),3)

Repeat
      ;GetWindowLong%(hWnd%,index%):"GetWindowLongA" (NAME)
   hInst=GetWindowLong(QueryObject(win,1),-6)
   DebugLog "hInst "+hInst
   
   ;GetWindowThreadProcessId%(hWnd%,lpdwProcessId%) (NAME)
   proz=GetWindowThreadProcessId(hInst)
   DebugLog "proz "+proz
   
      ;SetPriorityClass%(hProcess%,dwPriorityClass%) (NAME)
   set=SetPriorityClass(hInst,$00004000)   ;BELOW_NORMAL_PRIORITY_CLASS 0x00004000
   DebugLog "set "+set
   ;If the function succeeds, the return value is nonzero.
   ;If the Function fails, the Return value is zero.
   
      ;SetThreadPriority%(hThread%,priority%) (NAME)
   thread=SetThreadPriority(proz,-1) ;THREAD_PRIORITY_BELOW_NORMAL -1
   DebugLog "thread "+thread
   
   WaitEvent() 
   Select EventID() 
      Case $803 ;WindowClose
         End
   End Select

   Forever
End

und plötzlich bekomme ich Werte ausgespuckt!!!!!
Allerdings bleibt die Priorität im Taskmanager immer noch auf normal.

Ich habe jetzt herausgefunden, dass ich den "thread=SetThreadPriority(proz,-1) ;THREAD_PRIORITY_BELOW_NORMAL -1" wohl auch weglassen kann.
Übrigens führt das obige Proggi nach kurzer Zeit zum Absturz. Fand heraus, dass das wohl am wiederholten Aufruf des Wert "proz" liegt.

Code: [AUSKLAPPEN]
win=CreateWindow("test",500,300,100,100,Desktop(),3)

   ;GetWindowLong%(hWnd%,index%):"GetWindowLongA" (NAME)
hInst=GetWindowLong(QueryObject(win,1),-6)
DebugLog "hInst "+hInst

Repeat

   ;GetWindowThreadProcessId%(hWnd%,lpdwProcessId%) (NAME)
   proz=GetWindowThreadProcessId(hInst)
   DebugLog "proz "+proz
   
Until proz>0

      ;SetPriorityClass%(hProcess%,dwPriorityClass%) (NAME)
   set=SetPriorityClass(hInst,$00004000)   ;BELOW_NORMAL_PRIORITY_CLASS 0x00004000
   DebugLog "set "+set
   ;If the function succeeds, the return value is nonzero.
   ;If the Function fails, the Return value is zero.
   
      ;SetThreadPriority%(hThread%,priority%) (NAME)
   ;thread=SetThreadPriority(proz,-1) ;THREAD_PRIORITY_BELOW_NORMAL -1
   ;DebugLog "thread "+thread

Repeat

   DebugLog "haupt"
   
   DebugLog "hInst "+hInst
   
   DebugLog "proz "+proz
   
   ;set=SetPriorityClass(hInst,$00004000)   ;BELOW_NORMAL_PRIORITY_CLASS 0x00004000

   DebugLog "set "+set
   
   ;DebugLog "thread "+thread
   
   WaitEvent() 
   Select EventID() 
      Case $803 ;WindowClose
         End
   End Select

   Forever
End

läuft jetzt zwar, aber die Priorität im Taskmanager steht immer noch auf normal!!!!!

Any ideas???

Sereyanne

BeitragFr, Jul 30, 2010 19:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo? *schnüff*
Wie denn, überfordere ich euch etwa, kann doch nicht sein, ich dachte ich wär hier bei den Profis...
Wenn ihr noch irgendwas braucht, damit ihr mir helfen könnt, dann rückt raus damit... aber ohne euch komm ich nicht weiter *fleh*

edit: Ich habe ein Proggi gefunden, welches das Windows-Handle anderer Fenster anzeigt.
Zitat:
Displays information about the window the mouse pointer is currently over. Displays the windows handle, size and the owner thread information. Useful for people writting windows applications or wanting to create an interface to another application such as macros/scripts

Das merkwürdige ist: Wenn ich mein Plus-Proggi nun kompiliere, zeigt mir das winmsg bei jedem neuen Start meines Programms auch ein anderes Handle an. Wie kommt das? Ist das normal? Kann ich mit dem winmsg was anfangen, komm ich damit der Lösung des Problems vielleicht näher? Ich werd nicht schlau aus dem Teil. Falls ihr noch Lust habt, mir zu helfen, hier der Link:
http://www.roadkil.net/program...%20Message
Würde mich echt über jegliche Hilfe sehr freuen!

Gehe zu Seite Zurück  1, 2

Neue Antwort erstellen


Übersicht BlitzBasic BlitzPlus

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group