-
мне нужно создатжь окно специального класса. пытаюць делать следующее:
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"
в чем может быть проблема?
перерыл интернет, перепробовал много вариантов но всё одно и тоже.
-
>однако GetLastWin32Error выдает ошибку "2"
ERROR_FILE_NOT_FOUND (The system cannot find the file specified)
-
ну дак это я знаю, только мне это не говорит ни о чём.
в чём может быть ошибка? точнее из-за чего может быть така ошибка?
-
> в чём может быть ошибка? точнее из-за чего может быть така > ошибка?
Например, из-за того, что RegisterClassEx выпполнилась без ошибок.
GetLastError не обязана возвращать осмысленное значение, если предыдущий вызов API прошёл без ошибок. А у тебя результат RegisterClassEx никак не анализируется.
-
Ну и в порядке общей занудности. "Что ж вы, мужичок, всё животину тираните?" Всм, зачем под дотНЕТ так писать?
-
результат 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" все создат'ся нормально.
как же блин с этим бороться???
-
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
-
> а мне говорят: "Cannot find window Class", класс не существует.
правильно говорят. используй вместо имени класса атом, который возвращает RegisterClassEx.
> a tut blin navidumivali zhe.
я понимаю, конечно, что хорошо забитый шуруп может держаться в стене лучше, чем хорошо завинченный гвоздь. но, может быть, будем использовать инструменты адекватно задачам?
-
to DiamondShark © [7]:
Не помогает использование атом. Пробовал и как чилом (atom in the low-order word) так и IntPtr и всем чем угодно.
Всегда ответ один: "Cannot find window Class". (я всё же склоняюсь к тому что не правильно происходит регистрация класса, хотя и RegisterClassEx выдаёт не "0")
Может всёже просветите как это можно сделать?
-
однако сложная проблема. чтоже делать?
-
> [9] jonni © (19.11.06 01:31)
окно создается в том же приложении, где и класс регистрится? Порядок не мог быть перепутан (сначала попытка создать окно, потом регистрация)?
-
>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.
-
> zachem eto nado: nuhzno sodat' okno classa "Shell_TrayWnd" >
так, погоди... Зачем создавать окно этого класса? Это же специальный класс, используемый виндозной оболочкой. Может все-таки задача имеет другое решение? Если более внятно ее обрисовать...
-
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).
-
Shell Replacement на .NET?! Рекомендую посоветовать группе товарищей оставить эту затею. Во-первых, когда оболочка ОС использует что-либо кроме самой ОС - это уже плохо. Ну, а потом раз все уже написано и отлично работает, то зачем? Чисто ради спортивного интереса?
-
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.
|