Функция SendMessage работать не хочет

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Функция SendMessage работать не хочет

Сообщение XairOn » 27.09.2004 (Пн) 8:58

Возникла проблема с отправкой API функции окну, мне нужно свернуть окно, Я пишу:

Private Sub Command1_Click()
RetVal = SendMessage(Form1.hwnd, SC_MINIMIZE, 0, 1)
End Sub

Выдаётся "Ошибка типа" (Type mismatch), последнии параметр (1) не нарвится почему-то, что там указать нужно?

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 27.09.2004 (Пн) 10:37

А не так должно быть?
Код: Выделить всё
Private Const WM_SYSCOMMAND = &H112
RetVal = SendMessage(Form1.hwnd, WM_SYSCOMMAND, SC_MINIMIZE, 0)
Учиться - значит открывать для себя то, что уже знаешь. <...> Учить - значит напоминать другим о том, что они знают это также хорошо, как и ты. <...> Лучше всего ты учишь тому, чему тебе самому больше всего надо научиться. (Р. Бах)

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 27.09.2004 (Пн) 11:50

И кроме того, приведи текст Declare. А то ведь объявлять по всякому можно.
Lasciate ogni speranza, voi ch'entrate.

XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Сообщение XairOn » 27.09.2004 (Пн) 12:27

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Integer, ByVal lParam As Any) As Long

И константы:
Const SC_MINIMIZE = &HF020

Юстас
Бывалый
Бывалый
 
Сообщения: 200
Зарегистрирован: 24.10.2003 (Пт) 5:05

Сообщение Юстас » 27.09.2004 (Пн) 12:43

Замени ByVal lParam As Any на ByVal lParam As Long.

Ну и кроме того, делай так, как сказала Rainbow.

XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Сообщение XairOn » 27.09.2004 (Пн) 14:26

Раз уж разговор зашел о WinAPI, то не подскажите как правильно функцию ExitWindowsEx использовать, т.к. у меня почему-то она не выключает комп (и не перезагружает), а только завершает текущий сеанс. В чём дело?

Декларирую вот так: Private Declare Function ExitWindowsEx Lib "user32.dll" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long

а вызов функции вот так выглядит: r = ExitWindowsEx(EWX_SHUTDOWN Or EWX_FORCE, 0&)

kazah_
Обычный пользователь
Обычный пользователь
 
Сообщения: 99
Зарегистрирован: 13.01.2003 (Пн) 18:37
Откуда: Russia

вся фишка

Сообщение kazah_ » 27.09.2004 (Пн) 19:29

В том что он СS_... не задал
Mr DEN - THE WAY YOU KNOW / Мр. ДЕН - Ваш Путь к Познанию!

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 27.09.2004 (Пн) 22:34

XairOn писал(а):Раз уж разговор зашел о WinAPI, то не подскажите как правильно функцию ExitWindowsEx использовать, т.к. у меня почему-то она не выключает комп (и не перезагружает), а только завершает текущий сеанс. В чём дело?

Декларирую вот так: Private Declare Function ExitWindowsEx Lib "user32.dll" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long

а вызов функции вот так выглядит: r = ExitWindowsEx(EWX_SHUTDOWN Or EWX_FORCE, 0&)

http://vbrussian.com/Trick.asp?ID=1#trc30
Изображение

XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Сообщение XairOn » 29.09.2004 (Ср) 14:04

Ещё одни вопрос появился: функция SendMessage заработала, используя её я отправляю окну сомнанду Close, но функция почему-то

закрывает только окна каталогов и некоторые окошки (например IE), а вот тот же Notepad е закрывает, программы тоже не

закрывает, я уже пробовал через DestroyWindow, но эффект тот же. Пожскажите пожалуйста, как сделать так, что бы моя

программа закрывала любое указанное ей окно.
Вся программа выглядит вот так:

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam

As Integer, ByVal lParam As Long) As Long
Const WM_SYSCOMMAND = &H112
Const SC_CLOSE = &HF060

Private Sub Command1_Click()
RetVal = SendMessage(Form1.hwnd, WM_SYSCOMMAND, SC_CLOSE, 0)
End Sub

ahill
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 29.09.2004 (Ср) 15:16

Сообщение ahill » 29.09.2004 (Ср) 15:23

Используй FindWindow
Код: Выделить всё
Dim hWnd as Long
hWnd=FindWindow(0,"Имя окна")

XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Сообщение XairOn » 29.09.2004 (Ср) 15:27

ahill писал(а):Используй FindWindow
Код: Выделить всё
Dim hWnd as Long
hWnd=FindWindow(0,"Имя окна")
Так я пробовал, говорю же, функция работает, но закрывает не любое окно, некоторые окна на неё вообще не реагируют!

ahill
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 29.09.2004 (Ср) 15:16

Сообщение ahill » 29.09.2004 (Ср) 16:30

А какие конкретно окна не закрываются?

XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Сообщение XairOn » 29.09.2004 (Ср) 16:40

ahill писал(а):А какие конкретно окна не закрываются?
Конкретно - это Notepad, Visual Basic, Rar, Zip и т.д список можно долго продолжать.

ahill
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 29.09.2004 (Ср) 15:16

Сообщение ahill » 29.09.2004 (Ср) 16:52

У меня всё закрывает. Ты в FindWindow полностью имя окна пишешь? Или просто Rar, Notepad, Zip? Кстати в какой винде это происходит?

ahill
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 29.09.2004 (Ср) 15:16

Сообщение ahill » 29.09.2004 (Ср) 16:59

Функция FindWindow имеет два параметра, первый - имя класса, здесь можно написать Notepad к примеру, а второй - имя окна, точнее его заголовок - "Безымянный - Блокнот".

XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Сообщение XairOn » 29.09.2004 (Ср) 17:40

Я знаю как FindWindow работает, там всё правильно указываю, а происходит это всё в Windows XP Pro. Хотя если ты говоришь, что всё работает, то приведи полный код пожалуйста, может Я всё-таки что не так делаю.

ahill
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 29.09.2004 (Ср) 15:16

Сообщение ahill » 29.09.2004 (Ср) 18:19

Вариант 1:
Код: Выделить всё
Dim hWnd As Long
       
        hWnd = FindWindow("Notepad", vbNullString)
        SendMessage hWnd, WM_SYSCOMMAND, SC_CLOSE, 0

Вариант 2:
Код: Выделить всё
Dim hWnd As Long
       
        hWnd = FindWindow("Notepad", vbNullString)
        PostMessage hWnd, WM_SYSCOMMAND, SC_CLOSE, 0

Но под XP не знаю, возможно надо передавать дополнительный параметр в SendMessage

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 29.09.2004 (Ср) 20:41

ahill писал(а):Но под XP не знаю, возможно надо передавать дополнительный параметр в SendMessage

Вряд ли - все параметры уже задействованы.
Изображение

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 29.09.2004 (Ср) 21:22

А я раньше делал FindWindow vbNullString, "NOTEPAD", и прокатывало... :roll:


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

    TopList  
cron