Можно, в файле System.ini, который храниться в каталоге WINDOWS есть ссылка на имя текущей заставки и если её удалить, то и заставки не будет.
Сделать это можно так:
Private Sub SwitchOffScreenSaver()
Dim FileNoRd As Integer
Dim FileNoWr As Integer
Dim WinDir As String
Dim szData As String
Dim szExample As String
szExample = "SCRNSAVE.EXE"
WinDir = GetWinDir 'Используем нашу новую функцию для получения каталога Windows (см. выше)
FileNoWr = FreeFile 'Получаем свободный номер для записи
'открываем временный файл для построчного сохранения данных.
Open "C:\mytemp.tmp" For Output As #FileNoWr
FileNoRd = FreeFile 'Получаем свободный номер для чтения
'открываем рабочий файл для анализа и изменения
Open WinDir & "System.ini" For Input As #FileNoRd
Do Until EOF(FileNoRd)
Line Input #FileNoRd, szData
'Если мы находим в файле наш пример и его длина совпадает,
If Mid(szData, 1, Len(szExample)) = szExample Then
'то очищаем значения найденной строки для _
отключения заставки.
szData = szExample & "="
End If
Print #FileNoWr, szData
Loop
Close 'Закрываем все открытые файлы
'Копируем новые данные из временного файла в System.ini
FileCopy "C:\mytemp.tmp", WinDir & "System.ini"
Kill "C:\mytemp.tmp" 'Удаляем временный файл
End Sub
Private Declare Function GetSystemDirectory Lib "kernel32" Alias "GetSystemDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long
'Получение директории C:\WINDOWS\SYSTEM
Private Declare Function GetWindowsDirectory Lib "kernel32" Alias "GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long
'Директория "C:\WINDOWS"
Private Function GetSysDir() As String
Dim szBuffer As String * 50
Dim lngRet As Long
lngRet = GetSystemDirectory(szBuffer, 50)
GetSysDir = Left$(szBuffer, lngRet)
If Right(GetSysDir, 1) <> "\" Then GetSysDir = GetSysDir & "\"
End Function
Private Function GetWinDir() As String
Dim szBuffer As String * 50
Dim lngRet As Long
lngRet = GetWindowsDirectory(szBuffer, 50)
GetWinDir = Left$(szBuffer, lngRet)
If Right(GetWinDir, 1) <> "\" Then GetWinDir = GetWinDir & "\"
End Function
'Использование
Private Sub Form_Load()
MsgBox GetWinDir
MsgBox GetSysDir
End Sub
или объединяем наши 2 функции:
Private Function GetDirectory(szDirName As String) As String
Dim szBuffer As String * 50
Dim lngRet As Long
If LCase(szDirName) = "sys" then
lngRet = GetSystemDirectory(szBuffer, 50)
ElseIf LCase(szDirName) = "win" then
lngRet = GetWindowsDirectory(szBuffer, 50)
End If
GetDirectory = Left$(szBuffer, lngRet)
If Right(GetDirectory, 1) <> "\" Then GetDirectory = GetDirectory & "\"
End Function
'Использование
Private Sub Form_Load()
MsgBox GetDirectory("win")
MsgBox GetDirectory("sys")
End Sub
Как поместить картинки в DLL и как с ними потом работать (т.е. читать картинки из этой же DLL)?
Ответ:
В начале заходим в меню Add-Ins, затем Add-In Meneger... .Там находим строчку Visual Basic 6 Resource Editor и справа от описания есть флажки, устанавливаем Loaded/Unloaded и Load on StartUp. На стандартной панели инструментов должнен появиться VB Resource Editor. Запускаем и добовляем всё что душе угодно. Всё наши картинки там. Код чтения картинки:
Private Declare Function DrawIcon Lib "user32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal hIcon As Long) As Long
Private Declare Function ExtractIconEx Lib "shell32.dll" Alias "ExtractIconExA" (ByVal lpszFile As String, ByVal nIconIndex As Long, phiconLarge As Long, phiconSmall As Long, ByVal nIcons As Long) As Long
Private Sub Command1_Click()
Dim hIcon As Long
ExtractIconEx "C:\my.dll", 0, hIcon, 0, 1
DrawIcon Form1.hdc, 0, 0, hIcon
End Sub
Возможна ли одновременная работа в одной программе двух Winsock?
Вопрос:
озможна ли одновременная работа в одной программе двух Winsock, один работает на приём сообщений (так сказать в режиме ожидания сообщений), а второй - на отправку сообщений ?
Ответ:
А что тебе мешает?
Вот выдержка из MSDN (благополучно работают два сокета):
To create a TCP server
Create a new Standard EXE project.
Change the name of the default form to frmServer.
Change the caption of the form to "TCP Server."
Draw a Winsock control on the form and change its name to tcpServer.
Add two TextBox controls to the form. Name the first txtSendData, and the second txtOutput.
Add the code below to the form.
Private Sub Form_Load()
' Set the LocalPort property to an integer.
' Then invoke the Listen method.
tcpServer.LocalPort = 1001
tcpServer.Listen
frmClient.Show ' Show the client form.
End Sub
Private Sub tcpServer_ConnectionRequest _
(ByVal requestID As Long)
' Check if the control's State is closed. If not,
' close the connection before accepting the new
' connection.
If tcpServer.State <> sckClosed Then _
tcpServer.Close
' Accept the request with the requestID
' parameter.
tcpServer.Accept requestID
End Sub
Private Sub txtSendData_Change()
' The TextBox control named txtSendData
' contains the data to be sent. Whenever the user
' types into the textbox, the string is sent
' using the SendData method.
tcpServer.SendData txtSendData.Text
End Sub
Private Sub tcpServer_DataArrival _
(ByVal bytesTotal As Long)
' Declare a variable for the incoming data.
' Invoke the GetData method and set the Text
' property of a TextBox named txtOutput to
' the data.
Dim strData As String
tcpServer.GetData strData
txtOutput.Text = strData
End Sub
The procedures above create a simple server application. However, to complete the scenario, you must also create a client application.
To create a TCP client Add a new form to the project, and name it frmClient. Change the caption of the form to TCP Client. Add a Winsock control to the form and name it tcpClient. Add two TextBox controls to frmClient. Name the first txtSend, and the second txtOutput. Draw a CommandButton control on the form and name it cmdConnect. Change the caption of the CommandButton control to Connect. Add the code below to the form. Important Be sure to change the value of the RemoteHost property to the friendly name of your computer.
Private Sub Form_Load()
' The name of the Winsock control is tcpClient.
' Note: to specify a remote host, you can use
' either the IP address (ex: "121.111.1.1") or
' the computer's "friendly" name, as shown here.
tcpClient.RemoteHost = "RemoteComputerName"
tcpClient.RemotePort = 1001
End Sub
Private Sub cmdConnect_Click()
' Invoke the Connect method to initiate a
' connection.
tcpClient.Connect
End Sub
Private Sub txtSendData_Change()
tcpClient.SendData txtSend.Text
End Sub
Private Sub tcpClient_DataArrival _
(ByVal bytesTotal As Long)
Dim strData As String
tcpClient.GetData strData
txtOutput.Text = strData
End Sub
The code above creates a simple client-server application. To try the two together, run the project, and click Connect. Then type text into the txtSendData TextBox on either form, and the same text will appear in the txtOutput TextBox on the other form.
Sergey Y. Tkachev
Вопрос/Ответ
Здесь Вы можете задать вопрос, или ответить на уже имеющиеся вопросы.
Хочу написать программу для работы со складом, но в деле кладовщика ничего не смыслю. В принципе, небольшой опыт с Access у меня есть, даже писал телефонный справочник. Есть ли где в Интернете описание какого-нибудь простенького примера подобной программы (желательно с описанием специфических терминов)? А может мне вообще не стоит заниматься этим?
Как сделать в программе проверку, запущено ли какое либо определённое приложение? К примеру интернет эксплорер. И если нет то, скажем отключить сеть? Тобишь отключить конкретное соединение. Или наоборот, запустить тот самый эксплорер?
Требуется открывать WORDом текстовые файлы разной кодировки. В WORDe стоит галка подтверждения преобразования файлов при открытии, но тем не менее при обращении VB к WORDу для открытия файла не появляется окно выбора кодировки текста (при этом окно преобразования файла - кодированный текст - есть).
Вопрос: как при помощи VB вызвать окно выбора кодировки <Преобразование файла (MS-DOS, Windows, Другая)>?
Есть открытый документ Excel2000. Пользователь открывает документ еще раз, и открывается копия только для чтения.
Как сделать так чтобы второй экземпляр не открывался, а активизировался ранее открытый?
У кого-нибудь есть код, как переключить раскладку? Причем нужно, чтобы была возможность переключения не только rus\eng, но и на другие, желательно, чтобы код раскладки использовался стандартный (eng = 409, rus = 419).
Ответы:
Вопрос:
Нужно в строке "<--+7123456789" или "+7123456789" оставить только цифры. Можно конечно обрезанием, но кажется есть такой оператор который сам оставляет только цифры.
Свойство ScaleHeight доступно только для чтения. Задавай Height, тогда и ScaleHeight изменится.
Вопрос:
Короче, такое дело... Хочу получить хэндл окон (textbox и listbox) в чужом приложении. Для этого ставлю хук на мышь:
hHandle = SetWindowsHookEx(WH_MOUSE, AddressOf GetMouse, App.hInstance, 0)
Почему при переходе на другое приложение хук отключается? Даже если перейду обратно на свое, все равно не работает? Если вояможно, как это исправить? И если кто-нить янает, может, как-нибудь яамутить получение хэндла как в SpyXX?
По-моему легче это делать не хуком а с помощью функции WindowFromPoint. В качестве X и Y передавай ей значения, полученные с помощью GetCursorPos.
Вопрос:
У меня вопрос по Winsock'у: реально ли тестировать прогу, юзающую winsock на компе, не подключеном к сети? (например: запустить на одном компе и клиент и сервер, клиент шлет инфу на IP 127.0.0.1, или что - то в этом духе)?
Абсолютно реально. Я так всегда и делаю. Правда там есть свои тонкости, поэтому всё-таки тестировать время от времени прогу на реальной сетке или хотя бы через модем.
Все нормально, Winsock работает с портами... Так что тестировать прогу можно на компе без сети...
Вопрос:
Имеется объект со свойствами Property1, Property2,... и т.д. Как обратиться к этим свойствам через цикл? Т.е. требуется перебирать в цикле имя свойств.
Если элементы свойства которых ты хочешь перебирать одинаковые, то целесообразнее сделать ииз них массив. И тогда получится следующее:
For ArrayIndex = 0 to 9 ' Если у тебя предположим 10 элементов textbox
text1(ArrayIndex).text = "Index of this control = " & ArrayIndex
Next ArrayIndex
Элементы можешь создать в компиляторе задавая свойство Index или подгружать динамически в процессе выполнения программы (в библиотеке кодов есть пример).
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal
dwProcessId As Long) As Long
Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
...
Dim hProcess As Long
hProcess = OpenProcess(&H1F0FFF, 1, ID) 'ID - идентификатор удаляемого процесса
TerminateProcess hProcess, 0
...
API function TerminateProcess
Public Declare Function TerminateProcess Lib "kernel32" Alias "TerminateProcess" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
Можете заполнить эту форму, либо отослать вопрос СЮДА
Форма для добавления нового вопроса в этот раздел. Информация отсылается по E-mail владельцу сайта.