GetWindowLong(int hWnd, GWL_STYLE) return strano numeri in c#

Ho usato GetWindowLong api finestra di stato della finestra di una finestra in c#.

    [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());

    }

Mi aspettavo di ottenere numeri http://www.autohotkey.com/docs/misc/Styles.htm, ma ho i numeri, come -482344960, -1803550644, e 382554704.

Devo convertire windowState variabile?? se è così, a che cosa?

Forse si dovrebbe convertire i valori in esadecimale e confrontarle con ciò che è previsto. Io non sono sicuro di aver sbagliato.
Holterman: hai ragione. Dovrei convertire tali valori e confrontare.

OriginaleL’autore Moon | 2009-08-13

3 risposte

  1. 6

    Ciò che è di strano su quei valori? Per esempio, 482344960 è equivalente a 0x1CC00000 che assomiglia a qualcosa che si potrebbe aspettare di vedere come stile di finestra. Guardando gli stili di riferimento si è collegato, che è WS_VISIBLE | WS_CAPTION | 0xC000000.

    Se si vuole testare per WS_VISIBLE, per esempio, si potrebbe fare qualcosa di simile:

    int result = GetWindowLong(theprocess.MainWindowHandle, GWL_STYLE);
    bool isVisible = ((result & WS_VISIBLE) != 0);
    oopps…perché non penso che?……è esattamente questo che volevo.

    OriginaleL’autore Nate

  2. 1

    Non so come è stato definito (importati) GetWindowLong ma solo il nome suggerisce, dovrebbe essere:

    long windowState = GetWindowLong(...);
    Holterman: anche se io la uso tipo lungo, restituisce strani numeri. Ho aggiornato la domanda.
    Holterman: int è corretto. Nel Win32 API, LONG è a 32-bit con segno intero, che è equivalente a C#’s int tipo. Il C# long è a 64-bit integer.

    OriginaleL’autore Henk Holterman

  3. 1

    Sembra che si probabilmente desidera utilizzare GetWindowLongPtr invece, e cambiare il valore di ritorno di un long. Questo metodo utilizza un diverso tipo di ritorno di LONG_PTR, che suona come quello che stai cercando.

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

    LONG GetWindowLong(      
        HWND hWnd,
        int nIndex
    );

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

    LONG_PTR GetWindowLongPtr(      
        HWND hWnd,
        int nIndex
    );

    Secondo MSDN se si esegue Windows a 64 bit è necessario utilizzare GetWindowLongPtr, perché GetWindowLong solo utilizza una versione a 32-bit, che fornisce i valori negativi dopo che è arrivata la fine del a 32-bit di lunghezza. Plus sembra GetWindowLong è stato rimpiazzato da GetWindowLongPtr, quindi è probabilmente la strada giusta da percorrere per lo sviluppo futuro.

    Questo è l’importazione si deve usare per restituire il valore GetWindowLongPtr.

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

    .NET utilizza 64-bit longs a prescindere dalla piattaforma.

    OriginaleL’autore Nick Berardi

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *