2009-08-13 123 views
3

Ich habe GetWindowLong window api verwendet, um den aktuellen Fensterstatus eines Fensters in C# zu erhalten.GetWindowLong (int hWnd, GWL_STYLE) geben seltsame Zahlen in c zurück #

[DllImport("user32.dll")] 
    static extern int GetWindowLong(IntPtr hWnd, int nIndex); 


    Process[] processList = Process.GetProcesses(); 
    foreach (Process theprocess in processList) 
    { 

     long windowState = GetWindowLong(theprocess.MainWindowHandle, GWL_STYLE); 

     MessageBox.Show(windowState.ToString()); 

    } 

Ich erwartete Zahlen auf http://www.autohotkey.com/docs/misc/Styles.htm zu bekommen, aber ich habe Zahlen wie -482344960, -1803550644 und 382554704.

Muss ich Window Variable umwandeln müssen ?? Wenn ja, zu was?

+1

Vielleicht sollten Sie diese Werte verhexen und vergleichen sie mit konvertieren, was Sie erwartet. Ich bin mir nicht sicher, dass sie falsch liegen. –

+0

@Henk Holterman: Sie haben Recht. Ich sollte diese Werte konvertieren und vergleichen. – Moon

Antwort

6

Was ist seltsam an diesen Werten? Zum Beispiel entspricht 4823449600x1CC00000, die aussieht wie etwas, das Sie als Fenster-Stil erwarten würden. Betrachten Sie die Styles-Referenz, mit der Sie verbunden sind, also WS_VISIBLE | WS_CAPTION | 0xC000000.

Wenn Sie wollten für WS_VISIBLE, zum Beispiel testen, würden Sie so etwas tun:

int result = GetWindowLong(theprocess.MainWindowHandle, GWL_STYLE); 
bool isVisible = ((result & WS_VISIBLE) != 0); 
+0

oopps ... warum konnte ich nicht daran denken? ...... das ist genau das, was ich wollte. – Moon

1

Ich weiß nicht, wie Sie definiert (importiert) GetWindowLong aber schon der Name schon sagt es sein sollte:

long windowState = GetWindowLong(...); 
+0

@Henk Holterman: auch wenn ich lange Art verwende, gibt es auch seltsame Zahlen zurück. Ich habe die Frage aktualisiert. – Moon

+2

@Henk Holterman: 'int' ist richtig. In der Win32-API ist 'LONG' eine 32-Bit-Ganzzahl mit Vorzeichen, die dem Typ' int' von C# entspricht. Das C# 'long' ist eine 64-Bit-Ganzzahl mit Vorzeichen. – Nate

1

Es scheint, dass Sie wahrscheinlich GetWindowLongPtr stattdessen verwenden möchten, und den Rückgabewert auf eine Änderung long. Diese Methode verwendet einen anderen Rückgabetyp von LONG_PTR, der nach dem klingt, wonach Sie suchen.

GetWindowLonghttp://msdn.microsoft.com/en-us/library/ms633584(VS.85).aspx

LONG GetWindowLong(  
    HWND hWnd, 
    int nIndex 
); 

GetWindowLongPtrhttp://msdn.microsoft.com/en-us/library/ms633585(VS.85).aspx

LONG_PTR GetWindowLongPtr(  
    HWND hWnd, 
    int nIndex 
); 

Laut MSDN, wenn Sie 64-Bit-Windows ausgeführt werden müssen Sie GetWindowLongPtr verwenden, da GetWindowLong nur eine 32- verwendet Bit LONG, das Ihnen negative Werte geben würde, nachdem es das Ende des 32-Bit-LONG erreicht hat. Plus es klingt wie GetWindowLong wurde durch GetWindowLongPtr ersetzt, so ist es wahrscheinlich der richtige Weg für zukünftige Entwicklung.

Dies ist der Import, den Sie verwenden sollten, um den Wert von GetWindowLongPtr zurückzugeben.

[DllImport("user32.dll")] 
static extern long GetWindowLongPtr(IntPtr hWnd, int nIndex); 

.NET verwendet 64-Bit long s unabhängig von der Plattform.

Verwandte Themen