<DllImport("user32.dll", CallingConvention:=CallingConvention.StdCall, _ CharSet:=CharSet.Unicode, EntryPoint:="keybd_event", _ ExactSpelling:=True, SetLastError:=True)> _ Public Shared Function keybd_event(ByVal bVk As Byte, ByVal bScan As Byte, _ ByVal dwFlags As Int32, ByVal dwExtraInfo As Int32) As Boolean End Function
This sample will generate a 'Scroll Lock' key press event when the user clicks 'Button1'.
Create a new Windows Application project;
Drop a button control in the recently created form;
Add the following code to the form class:
Imports System.Runtime.InteropServices
Public Class Form1
<DllImport("user32.dll", CallingConvention:=CallingConvention.StdCall, _ CharSet:=CharSet.Unicode, EntryPoint:="keybd_event", _ ExactSpelling:=True, SetLastError:=True)> _ Public Shared Sub keybd_event(ByVal bVk As Byte, ByVal bScan As Byte, _ ByVal dwFlags As Integer, ByVal dwExtraInfo As Integer) As Boolean End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Const VK_SCROLL As Byte = &H91 Const KEYEVENTF_KEYUP As Byte = &H2
keybd_event(VK_SCROLL, 0, 0, 0) ' Generates a KEY_DOWN keybd_event(VK_SCROLL, 0, KEYEVENTF_KEYUP, 0) ' Generates a KEY_UP
End Sub
End Class
Please add some more!
Alternative Managed API: System.Windows.Forms.SendKeys
PROBLEM: How do i use combination of shift and tab keys at the same time ?
public const byte VK_LSHIFT= 0xA0; // left shift key public const byte VK_TAB = 0x09; public const int KEYEVENTF_EXTENDEDKEY = 0x01; public const int KEYEVENTF_KEYUP = 0x02;
//press the shift key keybd_event(VK_LSHIFT, 0x45, 0, 0);
//press the tab key keybd_event(VK_TAB, 0x45, 0, 0);
//release the tab key keybd_event(VK_TAB, 0x45, KEYEVENTF_KEYUP, 0);
//release the shift key keybd_event(VK_LSHIFT, 0x45, KEYEVENTF_KEYUP, 0);
I'm using this to create automated UI testing for a custom Textbox control. After a lot of trial and error the following code worked well for me.
public partial class Form2 : Form { [DllImport("user32.dll", SetLastError = true)] static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo);
void PressKey(Keys key) { const int KEYEVENTF_EXTENDEDKEY = 0x1; const int KEYEVENTF_KEYUP = 0x2; // I had some Compile errors until I Casted the final 0 to UIntPtr like this... keybd_event((byte)key, 0x45, KEYEVENTF_EXTENDEDKEY, (UIntPtr)0); keybd_event((byte)key, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, (UIntPtr)0); }
When you want to set a timer working with GUI, you always come across threading problem. In such scenario, .Net indeed makes programmers life easier. It only matters that you choose the right timer to use.
In Win Form, you need to use System.Windows.Forms.Timer.
In WPF, the one is System.Windows.Threading.DispatcherTimer.
윈도우에서 여러 파일 선택할 때 보통 Ctrl키와 Shift키를 콤보로 이용하지만 간혹 가다 손이 미끄러지는 등의 실수로 잘못 클릭해 처음부터 다시 파일을 선택해야 하는 경우가 있죠. 이런 경험이 종종 있으시다면 윈도우 7이나 비스타에서 폴더 옵션의 ‘보기’ 탭으로 가서 ‘확인란을 사용하여 항목 선택’에 체크해 보세요.
그럼 이렇게 파일이나 폴더 위에 마우스를 올리면 체크박스가 나타나 편하게 파일을 선택할 수 있습니다. 물론 파일을 클릭해 체크박스를 체크하는 게 아니라 직접 체크박스를 클릭해 체크를 해야 Ctlrl/Shift 키 도움 없이 여러 파일을 선택할 수 있고요.. ^^;
다른 사람과 파일을 공유하는 방법에는 여러가지가 있습니다. 메신저로 파일을 보낼수도 있고, 웹사이트나 파일 공유 서비스에 업로드한 다음 URL을 상대방에게 보내 다운받도록 할 수도 있습니다. 하지만 어떤 방법을 사용하든지 번거로운 점이 있습니다. 메신저로 보낼경우 메신저 서비스 가입, 프로그램 설치, 대화 상대 추가등의 과정이 필요하기 때문에 불편합니다. 여러 사람과 공유할 경우 모두 다 메신저를 사용해야 하기 때문에 더 복잡해 지고 맙니다.
웹사이트나 파일 공유 서비스를 통해서 공유할 경우도 번거롭기는 마찬가지 입니다. 다운로드 하는 시간 이외에 업로드 하는 시간이 필요하기 때문입니다. 파일 용량이 크다면 업로드 하는데에만 상대한 양의 시간을 소모해야만 합니다.
파일 하나 공유하려고 이런 불편함을 꼭 감수해야만 할까 하는 생각이 들어 찾아봤습니다. 위와 같은 불편함을 해소 할 수 있는 파일 공유 방법을 찾을 수 있었는데, 그것은 바로 "Berryz WebShare"를 사용하는 것입니다.
Berryz WebShare는 웹브라우저를 통해 파일과 폴더에 바로 접근할 수 있게 해주는 작은 웹서버 입니다. 설치할 필요없이 개인PC에 압축을 풀고 드래그앤 드롭으로 폴더만 지정해 주면 언제 어디서나 웹브라우저로 바로 접근가능한 파일서버를 구성할 수 있습니다. 설정이 간편한 편이고 국내에서 개발된 프로그램이어서 그런지 한글로된 매뉴얼 웹페이지도 있습니다.
압축을 푼 프로그램 용량도 다 합해서 2.41MB 정도 밖에 안됩니다.
프로그램을 맨 처음 실행하면 위와 같은 화면을 볼 수 있습니다. 꺼짐 버튼을 눌러서 켜짐 상태로 바꾸면 파일공유 웹서버가 시작 됩니다. 환경설정 부분에서 서버 포트 번호, IP 필터링등의 설정을 할 수 있습니다. 공유 추가를 누르거나 직접 드래그앤 드롭해서 놓으면 바로 파일이나 폴더를 공유할 수 있습니다.
드래그앤 드롭으로 공유할 항목을 추가한 모습입니다. 파일이든 폴더든 간에 끌어다 놓기만 하면 바로 공유할 수 있습니다.
환경설정 버튼을 눌러서 들어올 수 있는 설정창의 모습입니다. 보통 인터넷 업체에서 80번 포트로 접속할 수 없도록 막아놓기 때문에 서버란에 있는 포트번호는 꼭 변경해 주셔야 합니다. 외부에서 다른 사람이 웹브라우저로 접속할때는 "http://파일을 공유중인 컴퓨터의 IP:포트번호"와 같은 형태의 주소로 들어올 수 있게 됩니다.
IP 필터 부분에서 특정 IP의 접근을 제한할 수 있고, 접속제한 부분에서 다운로드 속도/업로드 속도를 제한할 수 있습니다. 계정 부분에선 특정 사용자에 대해 어느 정도의 권한을 허용할지 ID별로 지정할 수 있습니다 (예: 업로드 허용, 폴더 만들기 금지 등)
설정을 마치고 꺼짐 버튼을 눌러서 '켜짐' 상태로 만들면 모든 준비는 끝나게 됩니다. 이제 '주소' 부분에 있는 URL로 여러 사람과 자유롭게 파일을 공유할 수 있습니다.
웹브라우저를 통해 베리즈 웹쉐어 서버 URL에 접속한 모습입니다. (프로그램의 '주소'란에 있는 URL) 폴더나 파일을 따로 보내거나, 혹은 어딘가에 업로드 하느라고 기다릴 필요없이 수 많은 사람과 바로 공유 할 수 있습니다.
항목 속성을 통해 그냥 접속한 사람이나, 혹은 환경설정의 계정 부분에서 만든 ID를 통해 접속한 사람에 대해 권한을 지정할 수도 있습니다. 익명 사용자에 대해 업로드 권한을 체크해서 허용해 두면 누구나 바로 파일을 업로드 하거나 폴더를 만들 수 있게 됩니다.