Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Куча вопросов по симуляции клавы (выкл компа, спящий реж, справка, поиск, раскладка)

408
26 октября 2005 года
Lei fang
265 / / 01.10.2005
Всем приве!
Вот уж и программку надо написать... Все в одном флаконе.
В общем, написать виртуальную клавиатуру надо мне.

Вот, что у меня есть (из проблем).
1. Надо написать выключение компа под управой Windows 2000
2. Переход в спящий режим
3. Переключение раскладки с английского на русский и наоборот.
4. Нажатие на кнопку Пуск (чтобы меню вылезало)
5. Нажатие на правую кнопку мыши
6-7 Вызов справки и поиска.
Насчет последних двух, если справку и поиск можно вызвать запустив какой-нибудь системный *.exe файл, то я думаю, что это можно сделать с помощью Shell. Знать бы только название этих файлов.
Вот с остальными пунктами сложнее будет.
Подскажите мне, пожалуйста, все что может помощь в написании этой программы.
Всем зарание спасибо.
13K
27 октября 2005 года
tiko
15 / / 13.10.2005
Ни тот Shell нужен а из References



Dim S As New Shell

S.ShutdownWindows 'СООБЩЕНИЕ О ВЫКЛЮЧЕНИИ КОМПА
S.Help 'ПОМОЩНИК
S.FindFiles 'ПОИСК Ф/П
' ИТД.

не все но вполне подойдет
258
27 октября 2005 года
SergeySV
1.5K / / 19.03.2003
Цитата:
Originally posted by Lei fang
Всем приве!
Вот уж и программку надо написать... Все в одном флаконе.
В общем, написать виртуальную клавиатуру надо мне.

Вот, что у меня есть (из проблем).
1. Надо написать выключение компа под управой Windows 2000
2. Переход в спящий режим


http://forum.codenet.ru/showthread.php?s=&threadid=14870&highlight=%E2%FB%EA%EB%FE%F7%E5%ED%E8%E5

Цитата:

3. Переключение раскладки с английского на русский и наоборот.


http://forum.codenet.ru/showthread.php?s=&threadid=12521&highlight=00000409

Цитата:

4. Нажатие на кнопку Пуск (чтобы меню вылезало)


Код:
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Const WM_LBUTTONDOWN = &H201
Private Const MK_LBUTTON = &H1

Public Sub Mac1()
  Dim hTaskBar As Long
  Dim hButton  As Long
 
  ' получаем hWnd Панели задач
  hTaskBar = FindWindow("Shell_TrayWnd", vbNullString)
  ' получаем hWnd кнопки Пуск
  hButton = FindWindowEx(hTaskBar, 0, "Button", vbNullString)
  ' Иммит. нажатие кнопки "Пуск", поскольку коорд. клиентские, то можно передать 0, все равно не промахнемся
  Call SendMessage(hButton, WM_LBUTTONDOWN, MK_LBUTTON, ByVal 0&)

End Sub

Цитата:

5. Нажатие на правую кнопку мыши



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

Const WM_RBUTTONDOWN = &H204
Const MK_RBUTTON = &H2

Цитата:

6-7 Вызов справки и поиска.
Насчет последних двух, если справку и поиск можно вызвать запустив какой-нибудь системный *.exe файл, то я думаю, что это можно сделать с помощью Shell. Знать бы только название этих файлов.


Можно попробывать использовать гор. клавиши

408
27 октября 2005 года
Lei fang
265 / / 01.10.2005
Ба-а-а-а-альшушее спасибо Вам, tiko и SergeySV!!!
Я даже и не думал, что все эти проблемы так быстро решатся!
Единственная у меня проблема осталась с имитированием клика правой кнопкой мыши. Уточню, мне нужно вызывать меню, которое отбражает свойства рабочего стола (короче правый клик по рабочему столу)
Пишу я вот так:
--------------------------------------------------
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Const WM_RBUTTONDOWN = &H204
Const MK_RBUTTON = &H2

Public Sub Mac1()
Dim hTaskBar As Long
Dim hButton As Long
hTaskBar = FindWindow("Shell_TrayWnd", vbNullString)
hButton = FindWindowEx(hTaskBar, 0, "Button", vbNullString)
Call SendMessage(hButton, WM_RBUTTONDOWN, MK_RBUTTON, ByVal 1&)

End Sub
--------------------------------------------------
Я впервые пользуюсь этими функциями (SendMessage, FindWindow и FindWindowEx). Объясните, пожалуйста, что за параметры в них передаются и их синтаксис.
Например:
lpClassName - Класс чего-то...
lpWindowName - Имя окна, пишется в ковычках

А! Вот еще. Там же нет примера как перевести комп в спящий режим. С этим кто-нибудь может помочь?
258
28 октября 2005 года
SergeySV
1.5K / / 19.03.2003
Цитата:
Originally posted by Lei fang

А! Вот еще. Там же нет примера как перевести комп в спящий режим. С этим кто-нибудь может помочь?



Спящий режим это константа - Public Const EWX_SHUTDOWN = 1
Она есть в примере по указанной ссылке

Насчет клика по Раб. столу

Код:
Private Const WM_RBUTTONUP = &H205
 
  Dim hWnd1 As Long, hWnd2 As Long, hWnd3 As Long
 
 
  ' получаем hWnd
  hWnd1 = FindWindow("Progman", vbNullString)
  hWnd2 = FindWindowEx(hWnd1, ByVal 0&, "SHELLDLL_DefView", vbNullString)
  hWnd3 = FindWindowEx(hWnd2, ByVal 0&, "SysListView32", vbNullString)
 
  ' Иммит. нажатие(вернее отжатие уже - UP) кнопки прав. кнопки
  Call SendMessage(hWnd3, WM_RBUTTONUP, MK_RBUTTON, ByVal 0&)


Чтобы получить меню, необходимо получить hWnd не самого раб. стола, а его дочернего окна с классом - "SysListView32".
Теперь по поводу самого клика, меню в обычной жизне появляется только после того как Вы отпускаете ПР. кнопку мыши, поэтому используем новую константу - WM_RBUTTONUP.

Теперь по поводу самой функции SendMessage. Она в отличии от PostMessage, ждет завершения события. В данном примере, программа остановится на строке с SendMessage и будет ждать когда пользователь нажмет на какой-нибудь пункт меню - это надо иметь ввиду.
408
28 октября 2005 года
Lei fang
265 / / 01.10.2005
Спасибо SergeySV!

-->Спящий режим это константа - Public Const EWX_SHUTDOWN = 1
Что-то не получается у меня комп похрапеть заставить, выключается он с этой константой.
Вот чего я ему пишу делать:
--------------------------------------------------
Private Const EWX_SHUTDOWN = 1
Private Const EWX_FORCE = 4
Private Const TOKEN_ADJUST_PRIVILEGES = &H20
Private Const TOKEN_QUERY = &H8
Private Const SE_PRIVILEGE_ENABLED = &H2
Private Const ANYSIZE_ARRAY = 1
Private Const VER_PLATFORM_WIN32_NT = 2
Private Type OSVERSIONINFO
dwOSVersionInfoSize As Long
dwMajorVersion As Long
dwMinorVersion As Long
dwBuildNumber As Long
dwPlatformId As Long
szCSDVersion As String * 128
End Type
Private Type LUID
LowPart As Long
HighPart As Long
End Type
Private Type LUID_AND_ATTRIBUTES
pLuid As LUID
Attributes As Long
End Type
Private Type TOKEN_PRIVILEGES
PrivilegeCount As Long
Privileges(ANYSIZE_ARRAY) As LUID_AND_ATTRIBUTES
End Type
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Private Declare Function OpenProcessToken Lib "advapi32" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As Long) As Long
Private Declare Function LookupPrivilegeValue Lib "advapi32" Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, ByVal lpName As String, lpLuid As LUID) As Long
Private Declare Function AdjustTokenPrivileges Lib "advapi32" (ByVal TokenHandle As Long, ByVal DisableAllPrivileges As Long, NewState As TOKEN_PRIVILEGES, ByVal BufferLength As Long, PreviousState As TOKEN_PRIVILEGES, ReturnLength As Long) As Long
Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long
Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (ByRef lpVersionInformation As OSVERSIONINFO) As Long

Public Function IsWinNT() As Boolean
Dim myOS As OSVERSIONINFO
myOS.dwOSVersionInfoSize = Len(myOS)
GetVersionEx myOS
IsWinNT = (myOS.dwPlatformId = VER_PLATFORM_WIN32_NT)
End Function

Private Sub EnableShutDown()
Dim hProc As Long
Dim hToken As Long
Dim mLUID As LUID
Dim mPriv As TOKEN_PRIVILEGES
Dim mNewPriv As TOKEN_PRIVILEGES
hProc = GetCurrentProcess()
OpenProcessToken hProc, TOKEN_ADJUST_PRIVILEGES + TOKEN_QUERY, hToken
LookupPrivilegeValue "", "SeShutdownPrivilege", mLUID
mPriv.PrivilegeCount = 1
mPriv.Privileges(0).Attributes = SE_PRIVILEGE_ENABLED
mPriv.Privileges(0).pLuid = mLUID

AdjustTokenPrivileges hToken, False, mPriv, 4 + (12 * mPriv.PrivilegeCount), mNewPriv, 4 + (12 * mNewPriv.PrivilegeCount)
End Sub

Public Sub NtSleepMode(Force As Boolean)
Dim ret As Long
Dim Flags As Long
Flags = EWX_SHUTDOWN
If Force Then Flags = Flags + EWX_FORCE
If IsWinNT Then EnableShutDown
ExitWindowsEx Flags, 0
End Sub

Private Sub Command1_Click()
NtSleepMode True
End Sub
--------------------------------------------------
Подскажешь где что не правильно?

-->В данном примере, программа остановится на строке с SendMessage и будет ждать когда пользователь нажмет на какой-нибудь пункт меню - это надо иметь ввиду.
Действительно, косяк получается... Можно от него как-то избавится?
258
31 октября 2005 года
SergeySV
1.5K / / 19.03.2003
Цитата:

-->В данном примере, программа остановится на строке с SendMessage и будет ждать когда пользователь нажмет на какой-нибудь пункт меню - это надо иметь ввиду.
Действительно, косяк получается... Можно от него как-то избавится?



Просто замени SendMessage на PostMessage
Объявл. функции Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

408
31 октября 2005 года
Lei fang
265 / / 01.10.2005
Спасибо SergeySV! Теперь все отлично работает.
258
01 ноября 2005 года
SergeySV
1.5K / / 19.03.2003
На счет спящего режима, посмотреть на работе не могу, у меня стоит Win2000, до дома доберусь, гляну.
408
01 ноября 2005 года
Lei fang
265 / / 01.10.2005
-->На счет спящего режима, посмотреть на работе не могу, у меня стоит Win2000, до дома доберусь, гляну.
Спасибо!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог