[DllImport("user32.dll", CharSet=CharSet.Auto)]
public static extern uint MessageBox(IntPtr hWnd, String text, String caption, uint type);
Использование функций WinAPI в WinForms
Вобщем, использую MSVC 2005. Winforms.
Нужны функции winapi.
на pinvoke.net нашёл такой пример:
Код:
Но он вроде как для СиШарп, и у меня не пашет.
Спасибо за помощь!
насколько я знаю, WinForms почти полностью реализуют WinAPI для работы с окнами. поэтму непонятно, зачем может понадобиться прямое обращение в вин апи. если нужен конкретно message box, System.WinForms.MessageBox.Show(...)
Ну MessageBox я привёл просто как пример, и мне могут потребоваться функции winapi для работы с системой, а не с окнами, которых winforms не предоставляет к использованию
Приведите код, в котором пользуетесь примером с pinvoke
Цитата: sadman
Ну MessageBox я привёл просто как пример, и мне могут потребоваться функции winapi для работы с системой, а не с окнами, которых winforms не предоставляет к использованию
скорее всего они просто содержаться в других сборках или пространствах имён
Ap0k: как я уже писал - работаю в winforms, в котором генерится много кода связаного с формой, посему выкладывать Весь код не буду.
Итак, пробовал импортировать функцию еще ДО объявления namespace'а моей формы:
Код:
[DllImport("user32.dll", CharSet=CharSet.Auto)]
public static extern uint MessageBox(IntPtr hWnd, String text, String caption, uint type);
namespace FileShare_Form {
using namespace System;
....
public static extern uint MessageBox(IntPtr hWnd, String text, String caption, uint type);
namespace FileShare_Form {
using namespace System;
....
Также пробовал непосредственно перед объявлением класса формы, уже в namespace'е:
Код:
[DllImport("user32.dll", CharSet=CharSet.Auto)]
public static extern uint MessageBox(IntPtr hWnd, String text, String caption, uint type);
public ref class Form1 : public System::Windows::Forms::Form
{
...
public static extern uint MessageBox(IntPtr hWnd, String text, String caption, uint type);
public ref class Form1 : public System::Windows::Forms::Form
{
...
И, наконец, прямо в методах формы:
Код:
private: System::Void hz4toEtoToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e)
{
[DllImport("user32.dll", CharSet=CharSet.Auto)]
public static extern uint MessageBox(IntPtr hWnd, String text, String caption, uint type);
}
{
[DllImport("user32.dll", CharSet=CharSet.Auto)]
public static extern uint MessageBox(IntPtr hWnd, String text, String caption, uint type);
}
Цитата: sadman
мне гораздо проще импортнуть функции winapi, с которыми я уже работал, чем искать аналоги в .NET
[/code]
[/code]
а зачем тебе тогда дот нет, если ты с ним раньше не работал? ведь тебе легче взять и написать на чисто WinAPI :confused:
всё дело в ГУЙе. На винапи это долго, муторно и не очень красиво, чего не скажешь о .NET'е. Тем более почему ты решил что мне будет легче писать на winapi? мне просто нужны несколько функций оттуда, и фсё :)
Код:
[COLOR=blue]using[/COLOR] System;
[COLOR=blue]using[/COLOR] System.Runtime.InteropServices;
[COLOR=blue]class[/COLOR] Class1
{
[[COLOR=mediumturquoise]DllImport[/COLOR]([COLOR=darkred]"user32.dll"[/COLOR], CharSet=[COLOR=mediumturquoise]CharSet[/COLOR].Auto)]
[COLOR=blue]public static extern int[/COLOR] MessageBox([COLOR=mediumturquoise]IntPtr[/COLOR] hWnd, [COLOR=mediumturquoise]String[/COLOR] text, [COLOR=mediumturquoise]String[/COLOR] caption,
[COLOR=blue]uint[/COLOR] type);
[[COLOR=mediumturquoise]STAThread[/COLOR]]
[COLOR=blue]static[/COLOR] [COLOR=blue]void[/COLOR] Main([COLOR=blue]string[/COLOR][] args)
{
[COLOR=mediumturquoise]Class1[/COLOR].MessageBox([COLOR=blue]new[/COLOR] [COLOR=mediumturquoise]IntPtr[/COLOR](0), [COLOR=darkred]"Text"[/COLOR], [COLOR=darkred]"Caption"[/COLOR], 0 );
}
}
[COLOR=blue]using[/COLOR] System.Runtime.InteropServices;
[COLOR=blue]class[/COLOR] Class1
{
[[COLOR=mediumturquoise]DllImport[/COLOR]([COLOR=darkred]"user32.dll"[/COLOR], CharSet=[COLOR=mediumturquoise]CharSet[/COLOR].Auto)]
[COLOR=blue]public static extern int[/COLOR] MessageBox([COLOR=mediumturquoise]IntPtr[/COLOR] hWnd, [COLOR=mediumturquoise]String[/COLOR] text, [COLOR=mediumturquoise]String[/COLOR] caption,
[COLOR=blue]uint[/COLOR] type);
[[COLOR=mediumturquoise]STAThread[/COLOR]]
[COLOR=blue]static[/COLOR] [COLOR=blue]void[/COLOR] Main([COLOR=blue]string[/COLOR][] args)
{
[COLOR=mediumturquoise]Class1[/COLOR].MessageBox([COLOR=blue]new[/COLOR] [COLOR=mediumturquoise]IntPtr[/COLOR](0), [COLOR=darkred]"Text"[/COLOR], [COLOR=darkred]"Caption"[/COLOR], 0 );
}
}
Работает.
Код:
[LEFT]private: System::Void hz4toEtoToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e)
{
[DllImport("user32.dll", CharSet=CharSet.Auto)]
public static extern uint MessageBox(IntPtr hWnd, String text, String caption, uint type);
}[/LEFT]
{
[DllImport("user32.dll", CharSet=CharSet.Auto)]
public static extern uint MessageBox(IntPtr hWnd, String text, String caption, uint type);
}[/LEFT]
А зачем в CLI испозовать маршалинг? :confused: там же достаточно подключить [COLOR=sienna]<windows.h>[/COLOR]
Цитата:
Работает.
Это если проект с самого начала создать. Я повторюсь - у меня проект winforms, я сначала в редакторе создал свою форму. И теперь я не совсем понимаю куда мне всунуть этот отрезок кода, который у тебя работает...:(
Да куда хочешь, хочешь в класс своей формы, этот метод является статическим членом класса, а там уже в зависимости от области видимости.....не понятно, что не так??? ты вызвать что-ли её не можешь или что??
http://www.intuit.ru/department/pl/visualcsharp/5/4.html как насчет этого?