восстановление из лотка не работает (windowState) [дубликат]

использует UDF (пользовательская функция).

CREATE FUNCTION isnumber(inputValue VARCHAR(50))
  RETURNS INT
  BEGIN
    IF (inputValue REGEXP ('^[0-9]+$'))
    THEN
      RETURN 1;
    ELSE
      RETURN 0;
    END IF;
  END;

Затем, когда вы запрашиваете

select isnumber('383XXXX') 

- возвращает 0

select isnumber('38333434') 

--returns 1

select isnumber (mycol) mycol1, col2, colx from tablex; - вернет 1s и 0s для столбца mycol1

- вы можете усилить функцию, чтобы принимать десятичные значения, научную нотацию и т. д. ...

Преимущество использования UDF заключается в том, что вы можете использовать его в левой или правой части вашего сравнения «where clause». это значительно упрощает ваш SQL перед отправкой в ​​базу данных:

 SELECT * from tablex where isnumber(columnX) = isnumber('UnkownUserInput');

надеюсь, что это поможет.

27
задан tbetts42 9 December 2008 в 23:16
поделиться

5 ответов

Я использую следующий метод расширения:

using System.Runtime.InteropServices;

namespace System.Windows.Forms
{
    public static class Extensions
    {
        [DllImport( "user32.dll" )]
        private static extern int ShowWindow( IntPtr hWnd, uint Msg );

        private const uint SW_RESTORE = 0x09;

        public static void Restore( this Form form )
        {
            if (form.WindowState == FormWindowState.Minimized)
            {
                ShowWindow(form.Handle, SW_RESTORE);
            }
        }
    }
}

Затем вызовите form.Restore() в моем коде.

33
ответ дан Dima Stefantsov 28 August 2018 в 21:59
поделиться
  • 1
    Кто-нибудь еще видит несколько значков, отображающихся в системном трее, когда вы нажимаете стрелку ^ (ака больше значков)? Когда вы нависаете над лишними, они исчезают, поэтому кажется, что это проблема обновления. – MacGyver 23 November 2015 в 21:25
  • 2
    Вы также можете вызвать функцию «Активировать» () после восстановления формы, чтобы заставить ее перейти на передний план и получить фокус. – typpo 16 June 2018 в 06:13

Если кто-нибудь задается вопросом, как это сделать с окнами других приложений, этот код работает для меня:

    public void UnMinimize(IntPtr handle)
    {
        WINDOWPLACEMENT WinPlacement = new WINDOWPLACEMENT();
        GetWindowPlacement(handle, out WinPlacement);
        if(WinPlacement.flags.HasFlag(WINDOWPLACEMENT.Flags.WPF_RESTORETOMAXIMIZED))
        {
            ShowWindow(handle, (int)SW_MAXIMIZE);
        }
        else
        {
            ShowWindow(handle, (int)SW_RESTORE);
        }
    }

Материал здесь:

[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
    public Int32 Left;
    public Int32 Top;
    public Int32 Right;
    public Int32 Bottom;
}

public struct POINT
{
    public long x;
    public long y;
}

public struct WINDOWPLACEMENT
{

    [Flags]
    public enum Flags : int
    {
        WPF_ASYNCWINDOWPLACEMENT = 0x0004,
        WPF_RESTORETOMAXIMIZED = 0x0002,
        WPF_SETMINPOSITION = 0x0001
    }


    /// <summary>
    /// The length of the structure, in bytes. Before calling the GetWindowPlacement or SetWindowPlacement functions, set this member to sizeof(WINDOWPLACEMENT).
    /// </summary>
    public int length;
    /// <summary>
    /// The flags that control the position of the minimized window and the method by which the window is restored. This member can be one or more of the following values.
    /// </summary>
    /// 
    public Flags flags;//uint flags;
                       /// <summary>
                       /// The current show state of the window. This member can be one of the following values.
                       /// </summary>
    public uint showCmd;
    /// <summary>
    /// The coordinates of the window's upper-left corner when the window is minimized.
    /// </summary>
    public POINT ptMinPosition;
    /// <summary>
    /// The coordinates of the window's upper-left corner when the window is maximized.
    /// </summary>
    public POINT ptMaxPosition;
    /// <summary>
    /// The window's coordinates when the window is in the restored position.
    /// </summary>
    public RECT rcNormalPosition;
}

public class UnMinimizeClass
{
    [DllImport("user32.dll")]
    public static extern bool GetWindowPlacement(IntPtr hWnd, out WINDOWPLACEMENT lpwndpl);

    [DllImport("user32.dll")]
    public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

    const int SW_MAXIMIZE = 3;
    const int SW_RESTORE = 9;

    public static void UnMinimize(IntPtr handle)
    {
        WINDOWPLACEMENT WinPlacement = new WINDOWPLACEMENT();
        GetWindowPlacement(handle, out WinPlacement);
        if (WinPlacement.flags.HasFlag(WINDOWPLACEMENT.Flags.WPF_RESTORETOMAXIMIZED))
        {
            ShowWindow(handle, SW_MAXIMIZE);
        }
        else
        {
            ShowWindow(handle, (int)SW_RESTORE);
        }
    }
}
1
ответ дан J. Doe 28 August 2018 в 21:59
поделиться
  • 1
    Почти. Код плохой, типы ошибочны, что делает GetWindowPlacement возвратом ложных данных. Флаги и длина должны быть uint, члены POINT X и Y должны быть int! (тип WIndows LONG не соответствует длине C #) – Martin Maat 21 August 2018 в 22:38

Вы можете имитировать щелчок на кнопке панели задач следующим образом:

SendMessage(docView.Handle, WM_SYSCOMMAND, SC_RESTORE, 0);
4
ответ дан jeffm 28 August 2018 в 21:59
поделиться

Вышеприведенный код не работал для меня во всех ситуациях

После проверки флагов мне также нужно проверить showcmd = 3, и если так максимизировать else restore

-1
ответ дан minieggs 28 August 2018 в 21:59
поделиться

Для меня код выше НЕ работает.

Но, наконец, я нашел рабочий код. Вот он:

CxImports.ManagedWindowPlacement placement = new CxImports.ManagedWindowPlacement();
CxImports.GetWindowPlacement(Convert.ToUInt32(Handle.ToInt64()), placement);

if (placement.flags == CxImports.WPF_RESTORETOMAXIMIZED)
    WindowState = FormWindowState.Maximized;
else
    WindowState = FormWindowState.Normal;

Я думаю, вы можете найти все необходимые «импортированные» функции простым поиском по Google.

12
ответ дан Uwe Keim 28 August 2018 в 21:59
поделиться
  • 1
    Что делать, если предыдущее состояние окна не было Normal, но Maximized? – Uwe Keim 10 February 2018 в 20:37
Другие вопросы по тегам:

Похожие вопросы: