Конференция ".Net" » RegisterClassEx problem
 
  • jonni © (02.11.06 01:56) [0]
    мне нужно создатжь окно специального класса. пытаюць делать следующее:

    public myclass
    {        
           [DllImport("user32.dll", SetLastError = true)]
           [return: MarshalAs(UnmanagedType.U2)]
           public static extern short RegisterClassEx([In] ref WNDCLASSEX lpwcx);
           [DllImport("kernel32.dll")]
           public static extern IntPtr GetModuleHandle(string lpModuleName);

           [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
           public struct WNDCLASSEX
           {
               [MarshalAs(UnmanagedType.U4)]
               public int cbSize;
               [MarshalAs(UnmanagedType.U4)]
               public int style;
               public IntPtr lpfnWndProc;
               public int cbClsExtra;
               public int cbWndExtra;
               public IntPtr hInstance;
               public IntPtr hIcon;
               public IntPtr hCursor;
               public IntPtr hbrBackground;
               [MarshalAs(UnmanagedType.LPTStr)]
               public String lpszMenuName;
               [MarshalAs(UnmanagedType.LPTStr)]
               public String lpszClassName;
               public IntPtr hIconSm;
           }

           public delegate int WndProc(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);

           public int myWinProc(IntPtr hWnd, uint uMsg, IntPtr wParam, IntPtr lParam)
           {
               return DefWindowProc(hWnd, uMsg, wParam, lParam);
           }

           private WNDCLASSEX mWC;
           private IntPtr mWndProcPtr;
              public Class1()
               {
                   WndProc mWndProc;        
                   mWndProc = new WndProc(myWinProc);
                   mWndProcPtr = Marshal.GetFunctionPointerForDelegate(mWndProc);
                   
                   mWC = new WNDCLASSEX();
                   mWC.cbSize = System.Runtime.InteropServices.Marshal.SizeOf(typeof(WNDCLASSEX));
                   mWC.style = 0;
                   mWC.lpfnWndProc = mWndProcPtr;
                   mWC.cbClsExtra = 0;
                   mWC.cbWndExtra = 0;
                   mWC.hInstance = GetModuleHandle("My.exe");
                   mWC.hIcon = IntPtr.Zero;
                   mWC.hCursor = IntPtr.Zero;
                   mWC.hbrBackground = IntPtr.Zero;
                   mWC.lpszMenuName = "";
                   mWC.lpszClassName = "MyClass";
                   mWC.hIconSm = IntPtr.Zero;
                             
                   RegisterClassEx(ref mWC);
                   MessageBox.Show(Marshal.GetLastWin32Error().ToString());
                 }

    однако GetLastWin32Error выдает ошибку "2"

    в чем может быть проблема?

    перерыл интернет, перепробовал много вариантов но всё одно и тоже.
  • Lamer@fools.ua © (02.11.06 10:47) [1]
    >однако GetLastWin32Error выдает ошибку "2"

    ERROR_FILE_NOT_FOUND (The system cannot find the file specified)
  • jonni © (02.11.06 16:35) [2]
    ну дак это я знаю, только мне это не говорит ни о чём.

    в чём может быть ошибка? точнее из-за чего может быть така ошибка?
  • DiamondShark © (02.11.06 17:45) [3]

    > в чём может быть ошибка? точнее из-за чего может быть така
    > ошибка?

    Например, из-за того, что RegisterClassEx выпполнилась без ошибок.

    GetLastError не обязана возвращать осмысленное значение, если предыдущий вызов API прошёл без ошибок.
    А у тебя результат RegisterClassEx никак не анализируется.
  • DiamondShark © (02.11.06 17:47) [4]
    Ну и в порядке общей занудности.
    "Что ж вы, мужичок, всё животину тираните?"
    Всм, зачем под дотНЕТ так писать?
  • jonni © (04.11.06 01:58) [5]
    результат RegisterClassEx не нулевои. значит всё нормально. Создаю окно

           [DllImport("User32", SetLastError = true)]
           internal static extern int CreateWindowEx(
               int dwExStyle, string lpClassName, string lpWindowName, int dwStyle,
               int X, int Y, int nWidth, int nHeight, int hWndParent, int hMenu,
               int hInstance, IntPtr lpParam);

    int hMainWnd = CreateWindowEx(Win32enums.WS_EX_TOOLWINDOW, "MyClass", string.Empty, Win32enums.WS_POPUP, 0, 0, 0, 0, 0, 0, 0, IntPtr.Zero);

    а мне говорят: "Cannot find window Class", класс не существует.

    попробовал создать окно системного класса например "TOOLTIPS_CLASS" все создат'ся нормально.

    как же блин с этим бороться???
  • jonni © (04.11.06 02:02) [6]
    to: DiamondShark ©   (02.11.06 17:47) [4]
    Ну и в порядке общей занудности.
    "Что ж вы, мужичок, всё животину тираните?"
    Всм, зачем под дотНЕТ так писать?
    ____________________________________

    da ya vot tozhe sizhu i dumayu, ya vse eto sdelal na Delphi i nikakih zabot a tut blin navidumivali zhe.

    zachem eto nado: nuhzno sodat' okno classa "Shell_TrayWnd" inache ne shlyutsya soosbcheniya :( a bez nih vse ploho
  • DiamondShark © (04.11.06 20:28) [7]

    > а мне говорят: "Cannot find window Class", класс не существует.

    правильно говорят.
    используй вместо имени класса атом, который возвращает RegisterClassEx.


    > a tut blin navidumivali zhe.

    я понимаю, конечно, что хорошо забитый шуруп может держаться в стене лучше, чем хорошо завинченный гвоздь.
    но, может быть, будем использовать инструменты адекватно задачам?
  • jonni © (13.11.06 14:38) [8]
    to DiamondShark © [7]:

    Не помогает использование атом. Пробовал и как чилом (atom in the low-order word) так и IntPtr и всем чем угодно.

    Всегда ответ один: "Cannot find window Class". (я всё же склоняюсь к тому что не правильно происходит регистрация класса, хотя и RegisterClassEx выдаёт не "0")

    Может всёже просветите как это можно сделать?
  • jonni © (19.11.06 01:31) [9]
    однако сложная проблема.  чтоже делать?
  • clickmaker © (20.11.06 11:00) [10]

    > [9] jonni ©   (19.11.06 01:31)

    окно создается в том же приложении, где и класс регистрится? Порядок не мог быть перепутан (сначала попытка создать окно, потом регистрация)?
  • jonni © (20.11.06 15:09) [11]
    >clickmaker ©   (20.11.06 11:00) [10]
    s poryadkom vse normal'no, kogda ya delayu eto prosto na Delphi ili na C++ vse rabotaet zamechatel'no. Zeds' na .NET ne poluchaetysa.

    esli sozdayu okno s sistemnim klassom naprimer "button" to okno sozdaetsya, esli so svoim to govorit chto class ne zaregistrirovan.
  • clickmaker © (20.11.06 15:11) [12]

    > zachem eto nado: nuhzno sodat' okno classa "Shell_TrayWnd"
    >

    так, погоди... Зачем создавать окно этого класса? Это же специальный класс, используемый виндозной оболочкой.
    Может все-таки задача имеет другое решение? Если более внятно ее обрисовать...
  • jonni © (21.11.06 01:16) [13]
    v etom to i ideya, Shell Replacement, pishetsya obolochka vmesto explorera. U nas est' otrabotannaya versiya na Delphi na Windows API. Vse rabotaet otlichno.

    Est' gruppa tovarischey kotoraya zadumala eto sdleat' na .NET. YA pitayus' im pomoch i s tolknulsya s takoy problemoy. Chto bi vse korrektno rabotalo, nuhzno okno klassa "Shell_TrayWnd" (explorer pri etom ne rabotaet i special'niy klass takoy ne suschestvuet).
  • clickmaker © (21.11.06 09:54) [14]
    Shell Replacement на .NET?! Рекомендую посоветовать группе товарищей оставить эту затею.
    Во-первых, когда оболочка ОС использует что-либо кроме самой ОС - это уже плохо.
    Ну, а потом раз все уже написано и отлично работает, то зачем? Чисто ради спортивного интереса?
  • jonni © (21.11.06 20:21) [15]
    na skol'ko ya ponimayu, sportivniy interes.

    i na schet ostavit' eto zateyu ya dazhe pochti soglasen. Delaya lyuboy shag, natikayus' na neobhodimost' ispol'zovat' unmanaged code.
 
Конференция ".Net" » RegisterClassEx problem
Есть новые Нет новых   [134430   +2][b:0][p:0]