http://pbdc.pe.kr 벽산님 글 발췌

키입력을 동적으로...

파워빌더 개발자라면 파워빌더에는 다른 응용프로그램에 키 입력을 발생시키는 방법이 없다는 것을 알고 있을 것이다.
그렇지만 운영체제 수준의 API를 사용한 방법은 있다.
이런 기능은 사용자이름과 암호를 사용자가 직접 입력하지 않고 파워빌더가 직접 입력하도록 할 때 상당히 유용하다.
또한 이 기능은 파워빌더가 만든 윈도우에만 한정되어 있지 않다.
이 API호출은 키보드 이벤트를 발생시켜 키가 눌린 것처럼 해서 현재 활성화가 되어 있는 어떤 윈도우에라도 나타나게 된다.
심지어 다른 제품의 윈도우라도 이것은 가능하다.

다음 표는 키보드와 연계되어 있는 가상 키값을 나타내고 있다.
이 값들이 키보드 이벤트 API에 전달되면 그 값에 해당하는 키가 눌린 것처럼 되며 출력 될 것이며 그 동작은 마치 사용자가 직접 키를 누른 것과 동일하다.

Key

Ascii

Key

Ascii

Key

Ascii

Key

Ascii

L-Button

1

2

50

W

87

F12

123

R-Button

2

3

51

X

88

F13

124

Cancel

3

4

52

Y

89

F14

125

M-Button

4

5

53

Z

90

F15

126

Back

8

6

54

NP - 0

96

F16

127

Tab

9

7

55

NP - 1

97

F17

128

Clear

12

8

56

NP - 2

98

F18

129

Return

13

9

57

NP - 3

99

F19

130

Shift

16

A

65

NP - 4

100

F20

131

Control

17

B

66

NP - 5

101

F21

132

Menu

18

C

67

NP - 6

102

F22

133

Pause

19

D

68

NP - 7

103

F23

134

Cap

20

E

69

NP - 8

104

F24

135

Escape

27

F

70

NP - 9

105

Numlock

144

Space

32

G

71

*

106

Scroll

145

Prior

33

H

72

+

107

Rshift

161

Next

34

I

73

-

109

L-Ctrl

162

End

35

J

74

.

110

R-Ctrl

163

Home

36

K

75

/

111

L-Menu

164

Left

37

L

76

F1

112

R-Menu

165

Up

38

M

77

F2

113

=

187

Right

39

N

78

F3

114

,

188

Down

40

O

79

F4

115

[

189

Select

41

P

80

F5

116

.

190

Print Scrn

44

Q

81

F6

117

/

191

Insert

45

R

82

F7

118

'

192

Delete

46

S

83

F8

119

[

219

Help

47

T

84

F9

120

/

220

0

48

U

85

F10

121

]

221

1

49

V

86

F11

122

'

222


동적으로 프린트스크린 키가 눌리도록 하려면:
외부 함수 선언:
SUBROUTINE keybd_event( int bVk, int bScan, int dwFlags, int dwExtraInfo) LIBRARY "user32.dll"
 
Powerscript: (Print Screen을 발생시킨다)
keybd_event( 44, 1, 0, 0 ) // 전체 화면을 클립보드에 복사한다.
keybd_event( 44, 0, 0, 0 ) // 현재 활성화된 윈도우만 클립보드에 복사한다. ALT+PRTSCR과 동일하다.

Powerscript: (다음 코드는 동적으로 붙여넣기 동작을 발생시킨다.CTRL + V를 누른것과 동일하다.)
rte_1.setfocus()
send(handle(rte_1),770, 0, 0)


다른 키들의 동적 발생:
외부 함수 선언:
SUBROUTINE keybd_event( int bVk, int bScan, int dwFlags, int dwExtraInfo) LIBRARY "user32.dll"
Powerscript: (이 스크립트는 'A'키가 눌린 것처럼 할 것이다.)
integer li_vkey
li_vkey = 65
sle_1.setfocus() // SLE에 포커스가 오게 해서 눌리는 키가 나타나게 한다.
keybd_event( li_vkey, 1, 0, 0 ) // 위의 표를 참조해서 어떤 키가 눌린 것인지 확인해 보자

파워빌더가 메모장에 메시지를 입력하도록 하기:
다음 코드는 메모장을 직접 실행해서 string ls_msg안의 문장을 입력한다.
문자열은 대문자로 되어 있지만 출력되는 내용은 현재 키보드의 상태가 무엇인지에 따라 달라질 것이다.
만약 "Caps Lock"키가 눌려진 경우는 대문자로 나오겠지만, 그렇지 않으면 소문자로 나오게 된다.
이런 기능은 모든 응용프로그램에도 적용할 수 있으며, 이를테면 로터스노츠의 사용자이름과 암호 입력창에도 사용할 수 있는 것이다.


외부 함수 선언:
SUBROUTINE keybd_event( int bVk, int bScan, int dwFlags, int dwExtraInfo) LIBRARY "user32.dll"


PowerScript:
integer li_loop, li_len, li_asc
string ls_msg = "POWERBUILDER IS TYPING THIS INTO NOTEPAD" + char(110) + char(13)

// 마침표(.)와 리턴키가 눌린 것처럼 한다.
run("Notepad.exe")
li_len = len(ls_msg)
yield() // 컴퓨터에 메모장을 실행할 약간의 여유를 준다.

for li_loop = 1 to li_len
li_asc = asc(mid(ls_msg,li_loop,1))
keybd_event(li_asc, 1, 0, 0)
yield() // 버퍼가 넘치기 전에 메모장에 글씨가 입력되도록 한다.
Next

 
기능키를 특정 키입력에 연결하기:

다음 코드는 F4를 누르면 Shift+Tab이, F5를 누르면 Tab이 눌린 것처럼 나타나게 한다.
이 API호출은 동적인 키 눌림과 적절한 쉬프트키의 해제 순서를 정확히 맞추어 주어야 한다.

외부함수 선언:
SUBROUTINE keybd_event( int bVk, int bScan, int dwFlags, int dwExtraInfo) LIBRARY "user32.dll"
Script: (pbm_dwnkey에 연결된 사용자 이벤트)
Choose Case key
Case KeyF4! // F4를 누르면 역방향으로 컬럼이 움직인다.
keybd_event(16,0,0,0) // SHIFT가 눌렸다.
keybd_event(9,0,0,0) // TAB이 눌렸다.
keybd_event(16,0,2,0) // SHIFT가 띄어졌다. (생략 불가능)
keybd_event(9,0,2,0) // TAB이 띄어졌다. (생략가능)
Case KeyF5! // F5를 누르면 앞으로 컬럼이 움직인다.
keybd_event(9,0,0,0) // TAB이 눌렸다.
keybd_event(9,0,2,0) // TAB이 띄어졌다. (생략가능)
End Choose

Posted by 민서정
l